Re: Проксирование http и https в одном конигурационном файле, на порты отличные от 80 и 443

Gena Makhomed gmm at csdoc.com
Wed Dec 11 19:42:30 UTC 2013


On 11.12.2013 18:58, mnsold wrote:

> Но вопрос в том, как проксировать одно приложение по http и https в одном
> блоке server {} и одном блоке location {} (без дублей), учитавая, что
> приложение на бэкэенде может быть доступно как в корне так и по контекстному
> пути, а порты отличаются от 80 и 443.
>
> Согласитесь, N количество блоков  server {} и N количество блоков location
> {} проще изменить, меньше вероятности допустить ошибки и понимать легче, чем
> N*2 количество блоков  server {} и N*2 количество блоков location {}
> сделанных отдельно для http и для https.

конфиг nginx - это примерно то же самое, что и "ассемблер".

здесь нет макросов, и если нужны макроподстановки, условная компиляция
и другие возможности "макроассемблера", их надо будет реализовать 
самостоятельно с помощью m4, python, ruby, perl, awk, sed, и т.п.

следующий уровень - написать свой собственный DSL, аналог
"языка высокого уровня", который будет транслироваться
в директивы "ассемблера", для их выполнения на nginx.

========================================================

например, я когда-то делал DSL, который на входе получает
"конфиг на языке высокого уровня" с очевидным синтаксисом:

h   http://habrahabr.ru/                Хабрахабр
gt  http://translate.google.com.ua/     Google Translate
yt  http://youtube.com/                 YouTube

(всего - несколько десятков таких записей)

а на выходе транслятора получается конфигурационный файл nginx,
готовый для включения с помощью директивы include, такого вида:

#
# this is auto-generated file, do not edit manually
# config source file: /etc/nginx/conf/redirect.conf
#

server {
     server_name h;
     server_name h.example.com;
     rewrite  ^  http://habrahabr.ru/  redirect;
}

server {
     server_name gt;
     server_name gt.example.com;
     rewrite  ^  http://translate.google.com.ua/  redirect;
}

server {
     server_name yt;
     server_name yt.example.com;
     rewrite  ^  http://youtube.com/  redirect;
}

и страничка /etc/nginx/site/t/index.html
где перечислены все видимые shortcut`ы.

- это используется на сервере, куда указывает * запись в DNS
для домена example.com, чтобы вручную не набирать полный адрес,
а только shortcut`ы "h", "gt", "yt" и т.п. это быстро и удобно.

поскольку меня об этом уже спрашивали в прошлый раз -
в аттаче сам конфиг / генератор конфига redirect.conf
и пример его использования в скрипте reload`а nginx.

-- 
Best regards,
  Gena
-------------- next part --------------
#!/bin/bash

nginx -v

/etc/nginx/conf/redirect.conf

service nginx reload

# for pid in $(pgrep nginx); do cat /proc/$pid/limits; done

# for pid in $(pgrep nginx); do grep open /proc/$pid/limits ; done

-------------- next part --------------
#!/usr/bin/python
# encoding: utf-8

raw_config = """

yt      http://youtube.com/                                     YouTube
h       http://habrahabr.ru                                     Хабрахабр
dw      http://www.freedrweb.com/                               антивирус Dr.Web CureIt!

t       ---                                                     список всех сокращений

gt      http://translate.google.com.ua/                         Google Translate

y       http://www.ya.ru/                                       ya.ru
yy      http://www.yandex.ru/                                   yandex.ru

gmail   https://mail.google.com/                                --- Gmail
kp      http://www.kp.ru/                                       --- kp.ru

ripe    http://www.ripe.net/                                    --- ripe 
vt      http://www.virustotal.com/ru/                           --- VirusTotal

"""

# -----------------------------------------------------------------------------------------------------------------------------------------------------------

conf_header = """
#
# this is auto-generated file, do not edit manually 
# config source file: $config_filename
#
"""
conf_record = """

server {
    server_name $name;
    server_name $name.example.com;
    rewrite  ^  $url  redirect;
}

"""
conf_footer = """
"""

# -----------------------------------------------------------------------------------------------------------------------------------------------------------

html_header = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>redirect service</title>
<style type="text/css">
a { text-decoration:none; display: block; }
a:link { color: black; }
a:visited { color: black; }
table { border: #000000 1px solid; border-collapse: collapse; margin: 0 0 0 0; padding 0 0 0 0; } 
tr { margin: 0 0 0 0; padding 0 0 0 0; } 
td { margin: 0 0 0 0; padding 0 0 0 0; } 

table.left { margin-left: 64px; margin-right:auto; }
tr.ffffff { background-color: #ffffff; }
tr.eeeeee { background-color: #eeeeee; }
td.name { text-align: right; font-size: x-large; font-family: "Courier New"; font-weight: bold; padding-left: 10px; padding-right: 10px; }
td.desc { text-align: left; font-size: large; font-family: Arial; padding-right: 10px; }
div.footer { float: right; }
</style>
</head><body><table class="left" cellpadding="0" cellspacing="0" >
"""
html_record = """<tr class="$toggle" onMouseOver='this.style.backgroundColor="yellow";' onMouseOut='this.style.backgroundColor="#$toggle";' >
<td class="name"><a href="http://$name/">$name</a></td>
<td class="desc"><a href="http://$name/">$desc</a></td>
</tr>
"""
html_footer = """</table></body></html>
"""

# -----------------------------------------------------------------------------------------------------------------------------------------------------------

conf_filename = "/etc/nginx/conf/virtual/zzz-auto-generated-config"
html_filename = "/etc/nginx/site/t/index.html"

# -----------------------------------------------------------------------------------------------------------------------------------------------------------

import os
import sys
import string,re
import itertools

config = sorted( [ line.strip() for line in raw_config.splitlines() if line.strip() ] )
config_line = re.compile( r'^\s*(\S+)\s+(\S+)\s+(\S+.*?)\s*$' )
empty = re.compile( r'^---' )

def generate_config( generate_html, filename, header, record, footer ):
    generate_conf = not generate_html
    config_filename = os.path.abspath( sys.argv [ 0 ] )
    toggle = itertools.cycle( [ 'ffffff', 'eeeeee' ] )
    output = open( filename, 'w' )
    output.write( string.Template( header ).substitute( config_filename=config_filename ) )
    for line in config:
        if empty.match( line ): 
            continue
        if line[0] == '#':
            continue
        match = config_line.match( line )
        if not match : raise ValueError, "unexpected line in raw_config: " + line
        name = match.group( 1 )
        url  = match.group( 2 )
        desc = match.group( 3 )
        if ( ( generate_conf and not empty.match( url ) ) or ( generate_html and not empty.match( desc ) ) ) :
            output.write( string.Template( record ).substitute( name=name, url=url, desc=desc, toggle=toggle.next() ) )
    output.write( string.Template( footer ).substitute() )
    output.close()

if __name__=="__main__":
    print "generating config...",
    generate_config( False, conf_filename, conf_header, conf_record, conf_footer )
    generate_config( True, html_filename, html_header, html_record, html_footer )
    print "[Ok]"

# -----------------------------------------------------------------------------------------------------------------------------------------------------------



Подробная информация о списке рассылки nginx-ru