danielnewman
@danielnewman
Front-end

Где поискать красивые конфиги nginx или как сделать красивым мой?

Многоуважаемые, как решить задачи логирования и красивой организации конфигов nginx, когда адреса и с префиксом www/ftp/mysql… и без него хочется логировать в один файл в одной папке под заданный набор хостов?

upstream vserver_pool {
    server 100.100.100.100:80;
}

root              /var/log/nginx/;
access_log        /var/log/nginx/$host-access.log;
error_log         /var/log/nginx/error.log;

server {
    listen        80;
    server_name   www.domain1.tld;

    return        301 http://domain1.tld$request_uri;

    root          /var/log/nginx/$host/;
    access_log    /var/log/nginx/$host/$host-access.log;
}

..........................................

server {
    listen        80;
    server_name   www.domain100500.tld;

    return        301 http://domain100500.tld$request_uri;

    root          /var/log/nginx/$host/;
    access_log    /var/log/nginx/$host/$host-access.log;
}


Проблема красивой организации конфигов всплывают, когда есть потребность к каждому хосту прибавить набор идентичных правил проксирования. 10 раз добавить идентичный кусок:
server {
    listen        80 default_server;

    location ~ /\.ht {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        proxy_pass  http://vserver_pool;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}


И 5 раз — не идентичный. Возникает проблема с иерархией. Я полагал, что частный случай конфига будет иметь приоритет, однако все, чего я добиваюсь — дублирование логов, в случае наличия префикса www в имени хоста.
  • Вопрос задан
  • 5222 просмотра
Пригласить эксперта
Ответы на вопрос 3
VBart
@VBart
Конфиги nginx не язык программирования. Не надо на него применять программистские догмы, что дублирование это плохо и т.д. На самом деле статический конфиг без переменных будет работать гораздо быстрее, чем ваш. Одно лишь добавление переменной $host в access_log уже добавляет два дополнительных системных вызова на каждый запрос. Переменные в nginx нужны не для «шаблонизации», а для решения реально динамических задач конфигурации.

p.s.
mailman.nginx.org/pipermail/nginx-ru/2011-November/044461.html
Ответ написан
Комментировать
la0
@la0
не помню точно, но логически должно работать:
не уверен, можно ли set в контексте сервера, но попробуйте.
Но: нужно использовать именованные локейшены, тогда конфиг точно станет красивее.

set $h site1.ru;
include defaults-server
set $h site2.ru;
include defaults-server

----
defaults-server
server {
  server_name $h www.$h
  include locations;
  location / {return 406;}

}
---
locations

error_page 406 @bckend;
location @bckend{
  proxy_pass ...
 ....
}

Ответ написан
nginx умеет wildcardы и регэкспы в server_name.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы