Мы реализовали наше веб-приложение с помощью web2py. Он состоит из нескольких модулей, предлагающих REST API на различных ресурсах (например, / dids, / replicas, ...). API используется клиентами, реализующими request.py.
Моя проблема в том, что наше веб-приложение работает нормально, если оно находится за HAProxy и размещено на Apache с использованием mod_wsgi. Он также отлично работает, если клиенты напрямую взаимодействуют с nginx. Однако это не работает при использовании HAProxy перед nginx. Я предполагаю, что HAProxy каким-то образом изменяет запрос, и поэтому nginx ведет себя по-другому, то есть ищет статический файл вместо вызова контейнера WSGI. К сожалению, я не могу понять, что именно происходит (wr) на (g).
Вот соответствующие разделы конфигурации этих трех файлов конфигурации компонентов. По крайней мере, я думаю, они интересны. Если вы что-то пропустите, дайте мне знать.
1) haproxy.conf
frontend app-lb
bind loadbalancer:443 ssl crt /etc/grid-security/hostcertkey.pem
default_backend nginx-servers
mode http
backend nginx-servers
balance leastconn
option forwardfor
server nginx-01 nginx-server-int-01.domain.com:80 check
2) nginx.conf:
sendfile off;
#tcp_nopush on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
server {
server_name nginx-server-int-01.domain.com;
root /path/to/app/;
location / {
uwsgi_pass unix:///tmp/app.sock;
include uwsgi_params;
uwsgi_read_timeout 600; # Requests can run for a serious long time
}
3) uwsgi.ini
[uwsgi]
chdir = /path/to/app/
chmod-socket = 777
no-default-app = True
socket = /tmp/app.sock
manage-script-name = True
mount = /dids=did.py
mount = /replicas=replica.py
callable = application
Теперь, когда я позволяю своим клиентам идти против nginx-server-int-01.domain.com, все в порядке. В access.log nginx появляются такие строки:
128.142.XXX.XX0 - - [23/Aug/2014:01:29:20 +0200] "POST /dids/attachments HTTP/1.1" 201 17 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:20 +0200] "POST /dids/attachments HTTP/1.1" 201 17 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:20 +0200] "POST /dids/user.ogueta/cnt_mc12_8TeV.16304.stream_name_too_long.other.notype.004202218365415e990b9997ea859f20.user/dids HTTP/1.1" 201 17 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:20 +0200] "POST /replicas/list HTTP/1.1" 200 5282 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:20 +0200] "POST /replicas/list HTTP/1.1" 200 5094 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:20 +0200] "POST /replicas/list HTTP/1.1" 200 528 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:21 +0200] "GET /dids/mc13_14TeV/dids/search?project=mc13_14TeV&stream_name=%2Adummy&type=dataset&datatype=NTUP_SMDYMUMU HTTP/1.1" 401 73 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:21 +0200] "POST /replicas/list HTTP/1.1" 200 713 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
128.142.XXX.XX0 - - [23/Aug/2014:01:29:21 +0200] "POST /dids/attachments HTTP/1.1" 201 17 "-" "python-requests/2.3.0 CPython/2.6.6 Linux/2.6.32-358.23.2.el6.x86_64" "-"
Но когда я переключаю клиентов на HAProxy (loadbalancer.domain.com:443), error.log nginx показывает такие строки:
2014/08/23 01:26:01 [error] 1705#0: *21231 open() "/usr/share/nginx/html/dids/attachments" failed (2: No such file or directory), client: 128.142.XXX.XX1, server: localhost, request: "POST /dids/attachments HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21232 open() "/usr/share/nginx/html/replicas/list" failed (2: No such file or directory), client: 128.142.XXX.XX1, server: localhost, request: "POST /replicas/list HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21233 open() "/usr/share/nginx/html/dids/attachments" failed (2: No such file or directory), client: 128.142.XXX.XX1, server: localhost, request: "POST /dids/attachments HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21234 open() "/usr/share/nginx/html/replicas/list" failed (2: No such file or directory), client: 128.142.XXX.XX1, server: localhost, request: "POST /replicas/list HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21235 open() "/usr/share/nginx/html/dids/attachments" failed (2: No such file or directory), client: 128.142.XXX.XXX, server: localhost, request: "POST /dids/attachments HTTP/1.1", host: "loadbalancer"
2014/08/23 01:26:02 [error] 1705#0: *21238 open() "/usr/share/nginx/html/replicas/list" failed (2: No such file or directory), client: 128.142.XXX.XXX, server: localhost, request: "POST /replicas/list HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21239 open() "/usr/share/nginx/html/dids/attachments" failed (2: No such file or directory), client: 128.142.XXX.XXX, server: localhost, request: "POST /dids/attachments HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21242 open() "/usr/share/nginx/html/replicas/list" failed (2: No such file or directory), client: 128.142.XXX.XXX, server: localhost, request: "POST /replicas/list HTTP/1.1", host: "loadbalancer.domain.com"
2014/08/23 01:26:02 [error] 1705#0: *21244 open() "/usr/share/nginx/html/dids/attachments" failed (2: No such file or directory), client: 128.142.XXX.XXX, server: localhost, request: "POST /dids/attachments HTTP/1.1", host: "loadbalancer.domain.com"
Как вы можете видеть, этот запрос выглядит так же, только изменился IP-адрес клиента, с хоста клиента на тот, который находится на loadbalancer.domain.com. Но по каким-либо причинам ngxin, похоже, предполагает, что это статический файл, который нужно обслуживать, что в конечном итоге приводит к сообщению о том, что файл не найден.
Я искал в Интернете несколько часов, но пока без особого успеха. Любая помощь очень ценится.
Привет, Ральф
Я понял, в чем проблема в моей настройке.
Как указано в вопросе, как только запросы были перенаправлены из HAProxy, nginx не сопоставил их с определенным контейнером WSGI, а вместо этого попытался обслужить статический файл. Оказалось, что такое поведение было следствием
server_name nginx-server-int-01.domain.com;
директива в моем nginx - config. Эта директива указывает, что этот блок сервера применим только к запросам, направленным на nginx-server-int-01.domain.com, что принудительно выполняется путем проверки совпадения поля HTTP-заголовка «host».
Но запросы, отправленные в HAProxy, имеют, следовательно, «loadbalancer.domain.com», установленное в качестве поля хоста, и HAProxy, будучи максимально прозрачным, не обновляет это поле при пересылке HTTP-запроса. Таким образом, nginx получил запросы с 'loadbalancer.domain.com', которые не соответствовали какой-либо определенной директиве сервера. В конце концов nginx решил перестраховаться и проверить наличие статического файла (который является параметром по умолчанию), который разрешил ответ 404 Not found, поскольку ни один из этих файлов не существовал.
Поэтому после обновления моего nginx.conf до серверного блока, определяющего директивы WSGI по умолчанию, он обрабатывает каждый запрос, независимо от значения хоста, как запрос WSGI, если URI совпадает. Для этого нужно просто заменить директиву server_name следующими двумя строками
listen 80 default_server;
server_name _;
Надеюсь, это кому-нибудь поможет.
Привет, Ральф