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