Автор Тема: Nginx Load balancing - 400 bad request Request Header Or Cookie Too Large  (Прочетена 9310 пъти)

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Здравейте,

Правя едни тестове с nginx свързани с load balancing и прокси към апаче. Имам следната конфигурация:

server 1

nginx load balancing:

upstreams:
127.0.0.1:8080;   ( proxy to apache installed on same server)
server2;          (nginx on server2)
server3 backup;          (nginx on server 3)

server2:

nginx load balancing:

upstreams:
127.0.0.1:8080;   (apache installed on same server)
server1;          (nginx on server1)
server3 backup;          (nginx on server 3)

Server 3 (Backup server - да поеме трафика, единствено ако Сървър 1 и 2 не работят): 

Load balancing:

upstreams:
127.0.0.1:8080;   (apache installed on same server)
server1;          (nginx on server 1)
server2;          (nginx on server 2)



Теста, който правя е следния:

1. На Сървър1 оставям работещ nginx и спирам апаче там
2. На Сървър2 оставям работещ nginx и спирам апаче там
3. На Сървър3 оставям работищи и nginx и апаче.

Очакван резултат - сайта да се покаже без проблем, като се обслужи от Сървър 3.

Това, което се случва обаче е, че вместо сайта, получава 400 Bad Request Request Header Or Cookie Too Large

Опитвам се да разбера защо това се случва, защото ако на Сървър 2 апаче е пуснат, то Сървър 2 обслужва сайта и си работи без проблеми.

Ще се радвам ако ми дадете някакви идеи и насоки как да реша въпросния проблем.

Ако имате нужда от конфигурациите, мога да ги постна.

Благодаря Ви предварително.
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Ако имате нужда от конфигурациите, мога да ги постна.
Ами постни ги, не се свени. Без тях в тази ситуация търсиш помощ от ясновидци :)
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Тъкмо това подготвях с малко инфо от логовете, изпревари ме :)

gdo1 с вътрешно ip: 10.10.10.1  (Сървър 1)
gdo2 с вътрешно ip: 10.10.10.2  (Сървър 2)
gdo3 с вътрешно ip: 10.10.10.3  (Сървър 3 - backup server)

Свързаността между сървърите е наред.

Сървър1:
nginx.conf

Код:
user www-data;
worker_processes 2;

# ulimit
worker_rlimit_nofile 65535;
pid /var/run/nginx.pid;

events {
        worker_connections  10240;
        use epoll;
        # multi_accept on;
}

http {

        # The Apache load balancing proxy targets for port 80 traffic
        upstream gdo_lb {
                server 127.0.0.1:8080;
                server gdo2;
                server gdo3 backup;
        }

        # Proxies for port 443 traffic
        upstream gdo_slb {
                server 127.0.0.1:10443;
                server gdo2;
                server gdo3 backup;
        }

        ##
        # Basic Settings
        ##

        sendfile on;
        #tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 10;
        types_hash_max_size 2048;
        server_tokens off;

        client_max_body_size 40M;
        client_body_buffer_size 128k;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

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

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 2;
        # gzip_buffers 16 8k;

        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

proxy_params еднакъв на всички сървъри
Код:
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_connect_timeout 90;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 16k;
proxy_buffers 32 64k;
proxy_busy_buffers_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

Сървър 2

nginx.conf - различава се само частта, която е за upstream от Сървър 1

Код:
        # The Apache load balancing proxy targets for port 80 traffic
        upstream gdo_lb {
                server 127.0.0.1:8080;
                server gdo1;
                server gdo3 backup;
        }

        # Proxies for port 443 traffic
        upstream gdo_slb {
                server 127.0.0.1:10443;
                server gdo1;
                server gdo3 backup;
        }

Сървър 3:

nginx.conf - различава се само частта, която е за upstream от Сървър 1

Код:
        # The Apache load balancing proxy targets for port 80 traffic
        upstream gdo_lb {
                server 127.0.0.1:8080;
                server gdo1;
                server gdo2;
        }

        # Proxies for port 443 traffic
        upstream gdo_slb {
                server 127.0.0.1:10443;
                server gdo1;
                server gdo2;
        }



nginx vhost на всички сървъри

Код:
server {
    listen 80;
    server_name mydomain.tld;
    access_log /var/log/nginx/mydomain.tld.access.log;
    error_log /var/log/nginx/mydomain.tld.error.log;

    location / {
        proxy_pass   http://gdo_lb;
        include /etc/nginx/proxy_params;
    }
}

Това, което виждам в логовете:

Сървър1:

Код:
2012/11/05 23:00:00 [error] 17941#0: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 10.10.10.2, server: mydomain.tld, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:8080/", host: "mydomain.tld"
2012/11/05 23:00:31 [error] 17941#0: *3413 connect() failed (111: Connection refused) while connecting to upstream, client: 89.215.8.109, server: mydomain.tld, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "mydomain.tld"
2012/11/05 23:00:42 [error] 17941#0: *3413 connect() failed (111: Connection refused) while connecting to upstream, client: 89.215.8.109, server: mydomain.tld, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "mydomain.tld"

Сървър 2 logs:

Код:
2012/11/05 23:00:31 [error] 6613#0: *3413 connect() failed (111: Connection refused) while connecting to upstream, client: 10.10.10.1, server: mydomain.tld, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:8080/", host: "mydomain.tld"
2012/11/05 23:00:42 [error] 6613#0: *4778 connect() failed (111: Connection refused) while connecting to upstream, client: 10.10.10.1, server: mydomain.tld, request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:8080/", host: "mydomain.tld"


П.С. Това, което виждам сега като пуснах дебъга на nginx е че се 10.10.10.1 и 10.10.10.2 зациклят помежду си някак и X-Forwarded-For хедъра става по-голям и по-голям, докато не достигне лимита си. Ето парче от лога:

Код:
X-Real-IP: 10.10.10.2
X-Forwarded-For: 89.215.8.109, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2, 10.10.10.1, 10.10.10.2
Connection: close



П.С.2 Ако съм пропуснал нещо само кажете :)
« Последна редакция: Nov 06, 2012, 00:59 от Ali Nebi »
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Изглежда улучвам същия този бъг или подобен: http://trac.nginx.org/nginx/ticket/142


anebi@gdo2 /etc/nginx/sites-enabled # lsb_release -a
No LSB modules are available.
Distributor ID:   Ubuntu
Description:   Ubuntu 12.04.1 LTS
Release:   12.04
Codename:   precise
anebi@gdo2 /etc/nginx/sites-enabled # uname -a
Linux gdo2 3.2.30custom #1 SMP Thu Nov 1 13:53:54 CET 2012 x86_64 x86_64 x86_64 GNU/Linux


anebi@gdo2 /etc/nginx/sites-enabled # dpkg -l | grep nginx
ii  nginx                            1.1.19-1ubuntu0.1                   small, but very powerful and efficient web server and mail proxy
ii  nginx-common                     1.1.19-1ubuntu0.1                   small, but very powerful and efficient web server (common files)
ii  nginx-full                       1.1.19-1ubuntu0.1                   nginx web server with full set of core modules
anebi@gdo2 /etc/nginx/sites-enabled # nginx -v
nginx version: nginx/1.1.19
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

Ali Nebi

  • Напреднали
  • *****
  • Публикации: 394
  • Distribution: Centos, Debian, Fedora, Ubuntu
  • Window Manager: Gnome
    • Профил
Прегледах си топологията още веднъж и всъщност, това което правя не е правилно и причинявам зацикляне между сървърите.

Това, което в момента съм сетнал като upstreams на трите сървъра мисля, че е грешно.

На сървъра, който пряко получава трафика от клиентите трябва да ги има и 3-те upstream-а сетнати, но на останалите два сървъра трябва да има само по един, който е 127.0.0.1:8080, защото така иначе се получава зацикляне. Така или иначе тафика винаги минава през първия сървър. При евентуален проблем с връзката към сървър 1 или ако целия сървър падне, трябва само failover ip-to да се превключи към другия сървър (Сървър 2 или Сървър 3).

Друго решение да се предотврати зациклянето би било ако се сетва weight на 127.0.0.1:8080 upstream и нека ги има и 3-те upstream-а на трите сървъра или се спре round robin.

Какво е вашето мнение?
Активен

Не се задоволявай да бъдеш дим, когато можеш да бъдеш огън!

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
SERVER request!
Настройка на хардуер
Gizmo 6 3178 Последна публикация Dec 23, 2005, 15:19
от
Svc: bad direction 268435456, dropping request
Настройка на програми
Gaara 4 2750 Последна публикация Sep 04, 2007, 15:13
от Gaara
Download Request в Qt4 (как?)
Общ форум
LinuxFanUNIX 3 2652 Последна публикация Oct 28, 2009, 17:19
от v_badev
Ajax query, GET, request body
Web development
gat3way 0 2028 Последна публикация Feb 05, 2011, 02:17
от gat3way
Как да redirect all http request към Едно ИП от вътрешната мрежа с apache web se
Системни настройки
loshiat 2 2391 Последна публикация Sep 16, 2012, 00:58
от kissow