Welcome! Log In Create A New Profile

Advanced

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

Gena Makhomed
December 11, 2013 02:44PM
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
#!/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

#!/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 mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

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

mnsold December 11, 2013 06:04AM

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

Maxim Dounin December 11, 2013 09:16AM

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

mnsold December 11, 2013 10:06AM

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

mnsold December 11, 2013 10:23AM

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

Anton Kiryushkin December 11, 2013 10:30AM

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

mnsold December 11, 2013 10:41AM

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

Andrey Oktyabrskiy December 11, 2013 11:44AM

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

mnsold December 11, 2013 12:08PM

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

Maxim Dounin December 11, 2013 10:36AM

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

mnsold December 11, 2013 11:58AM

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

Maxim Dounin December 11, 2013 01:24PM

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

mnsold December 11, 2013 03:45PM

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

Maxim Dounin December 11, 2013 07:36PM

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

Gena Makhomed December 11, 2013 02:44PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 304
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready