нужен совет по if-конструкциям

Илья Шипицин chipitsine на gmail.com
Вт Авг 2 16:43:23 UTC 2011


Добрый день!

нужен критический взгляд на наш подход к написанию конфигов.
задача такая, скажем, nginx балансирует группу сайтов.
соотвественно на профилактику можно закрыть, как отдельный сайт, так
всю группу.
людям, которые выполняют профилактику, нужен backdoor, чтобы смотреть,
как всё получилось, до того, как открыть сайты обратно.
сайты https, строго по паролю, в поисковых системах мы не
присутствуем, поэтому на время профилактики нам неважно, с 503-м кодом
мы ее отдаем или с 200-м.
сайты все однотипные.

логика простая - если профилактика, то показываем статику (через SSI
берем время окончания работ из переменной), если надо пройти насквозь,
то идем на /goahead, ловим куку и второй раз по куке проходим, если не
профилактика, то проксируем на $upstream

конфиг написан на if-ах и include-ах, хочется понять, является ли он
оптимальным (голова заточена на if-ы, сложно переключаться на
location/map подход). есть подозрение, что можно переписать более
оптиаально, чем на куче if-ов. нужен мастер-класс

общий конфиг (nginx.conf):

   # site1
    #
    server {
        listen       x.x.x.x:6116;
    set  $upstream site1_upstream;

    access_log  /var/log/nginx/test.access.log;
    error_log  /var/log/nginx/test.error.log;

     set $single_out_of_order "no";
     #set $single_out_of_order "05:00";

    include site-include;

}


<много таких конфигов, в каждом из которых задается переменная
$upstream и $single_out_of_order>

файл site-include (проверяем переменные $single_out_of_order,
$total_out_of_order, если переменные не равны "no", то отображаем SSI
статическую заглушку, выставляем "проходную" куку на /goahead):

    include ssl-include;

     set $total_out_of_order "no";
     #set $total_out_of_order "22:35";

    proxy_next_upstream error;

    add_header X-Nginx-Server $hostname;
    add_header X-BackEnd-Server $upstream_addr;
    add_header X-RemoteAddr $remote_addr;

error_page 502 503 504 500 /502/index.html;
location /502 {
   alias /var/www/xxx.xxx.xxx/502;
}

       location /go {
          add_header Set-Cookie "goahead=1;";
          rewrite ^  https://$upstream/ permanent;
        }

        location / {

            if ($http_cookie ~* "goahead") {
              proxy_pass http://$upstream;
              break;
            }

            if ($single_out_of_order !~ "no" ) {
                    set $total_out_of_order $single_out_of_order;
                    break;
                    error_page 404 /index.html;
                    root /var/www/xxx.xxx.xxx;
                    ssi on;
            }

            if ($total_out_of_order ~ "no" ) {
                     proxy_pass http://$upstream;
            }

            if ($total_out_of_order !~ "no" ) {
                    break;
                    error_page 404 /index.html;
                    root /var/www/xxx.xxx.xxx;
                    ssi on;

            }

            proxy_cache off;
            proxy_connect_timeout 15;
            proxy_send_timeout 500;
            proxy_read_timeout 500;


 }





Илья Шипицин


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