Назад | Перейти на главную страницу

Трафик Nginx будет неправильно увеличиваться при смешивании именованных серверов и серверов по умолчанию

У меня есть приведенный ниже файл конфигурации для nginx. Проблема в том, что весь трафик идет в восходящий кластер. Как настроить nginx для отправки трафика только для example.com в кластеры, а все остальное - в clusterb?

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    log_format cache '\n*** $remote_addr [$time_local] '
             '[$upstream_cache_status] $upstream_response_time '
             '$host "$request" ($status) $body_bytes_sent '
             '"$http_referer"  "$http_user_agent" '
             'Cache-Control: $upstream_http_cache_control '
             'Expires: $upstream_http_expires '
             ;

    access_log  /var/log/nginx/access.log cache;
    sendfile        on;
    keepalive_timeout  65;


    gzip    on;
    gzip_vary       on;
    gzip_comp_level 6;
    gzip_proxied    any;

    gzip_disable    "MSIE [1-6]\.(?!.*SV1)";
    gzip_buffers    16 8k;

    include /etc/nginx/conf.d/*.conf;

    proxy_cache_key "$scheme$host$request_uri";
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=main:10m max_size=1g inactive=30m;


    upstream clustera {
        ip_hash;
        server  a.example.com:80;
    }
    upstream clusterb {
        ip_hash;
        server  b.example.com:80;
    }


    client_max_body_size    20m;
    client_body_buffer_size 128k;
    proxy_connect_timeout      300;
    proxy_send_timeout         300;
    proxy_read_timeout         300;

    # host for example.com should send traffic to clustera
    server {
        listen 80;
        server_name example.com;

        location ~*(png|jpeg|jpg|gif|ico|css|js)$ {
            proxy_pass      http://clustera;
            proxy_set_header        Host             $host;
            proxy_set_header        X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_cache     main;
            proxy_cache_valid       200 5m;
            proxy_cache_valid       302 1m;
        }

        location / {
            proxy_pass http://clustera;
            proxy_set_header        Host             $host;
            proxy_set_header        X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

    }
    # host for everyone else. traffic goes to clusterb
    server {
        listen 80;
        server_name _;

        if ( $http_user_agent ~* (spider|crawler|slurp) ) {
             return 503;
        }

        set $slow 0;
        if ( $http_user_agent ~* (bot) ) {
             set $slow 1;
        }

        if ( $slow ) {
           set $limit_rate 1k;
        }

        location ~*(png|jpeg|jpg|gif|ico|css|js)$ {
            proxy_pass      http://clusterb;

            proxy_set_header        Host             $host;
            proxy_set_header        X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;


            proxy_cache     main;
            proxy_cache_valid       200 5m;
            proxy_cache_valid       302 1m;
        }

        location /images {
            proxy_pass      http://clisterb;

            proxy_set_header        Host             $host;
            proxy_set_header        X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_cache     main;
            proxy_cache_valid       200 5m;
            proxy_cache_valid       302 1m;
        }

        location / {
            proxy_pass http://clusterb;

            proxy_set_header        Host             $host;
            proxy_set_header        X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

    }
}

server_name _ не является сервером имен по умолчанию. Буквально это означает совпадение имени хоста "_". Очевидно, что это имя хоста недействительно, поэтому вы его никогда не увидите, поэтому ваш серверный блок никогда не будет использоваться.

Если вы хотите создать серверный блок для всех, вам следует использовать default_server (по умолчанию до 0.8.21) из директива прослушивания.

Причина, по которой многие онлайн-руководства вводят вас в заблуждение, заставляют вас поверить в это, заключается в том, что они всегда помещают его первым, к чему Nginx возвращается, если не предоставляется блок сервера по умолчанию, тогда они делают логический вывод, что, поскольку все остальные говорят, что он должен быть правдой.

Конечно, читая официальная документация или запись вики server_name сразу просветит вас.