Я хотел спросить о повторении запросов Nginx. У меня есть Nginx, работающий на бэкэнде, который затем отправляет запросы в HaProxy, который затем передает его на веб-сервер, и запрос обрабатывается. Я динамически перезагружаю конфигурацию Haproxy для обеспечения эластичности. Проблема в том, что запросы сбрасываются, когда я перезагружаю Haproxy. Поэтому я хотел иметь решение, в котором я мог бы просто повторить попытку из Nginx. Я просмотрел proxy_connect_timeout, proxy_next_upstream в модуле http и max_fails и fail_timeout в модуле сервера. Первоначально у меня был только 1 сервер в восходящих соединениях, поэтому я просто увеличиваю его дважды, и меньше запросов теряется (только когда) сказал один и тот же сервер дважды в восходящем потоке, если у меня один и тот же сервер в 3-4 раза увеличивается).
Итак, во-первых, я хотел, чтобы, когда запрос не может установить соединение от Nginx к Haproxy, поэтому при перезагрузке кажется, что соединение рассматривается как ошибка, и сразу же запрос отбрасывается.
Итак, как я могу указать время после сбоя, когда я хочу повторить запрос от Nginx до восходящего потока или время, до которого Nginx рассматривает его как неудавшийся запрос.
(Я пробовал увеличить proxy_connect_timeout - не помогло, mail_retires, fail_timeout, а также дважды поставить один и тот же вышестоящий сервер (что пока дало лучшие результаты)
Файл конфигурации Nginx
upstream gae_sleep {
server 128.111.55.219:10000;
}
server {
listen 8080;
server_name 128.111.55.219;
root /var/apps/sleep/app;
# Uncomment these lines to enable logging, and comment out the following two
#access_log /var/log/nginx/sleep.access.log upstream;
error_log /var/log/nginx/sleep.error.log;
access_log off;
#error_log /dev/null crit;
rewrite_log off;
error_page 404 = /404.html;
set $cache_dir /var/apps/sleep/cache;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://gae_sleep;
client_max_body_size 2G;
proxy_connect_timeout 30;
client_body_timeout 30;
proxy_read_timeout 30;
}
location /404.html {
root /var/apps/sleep;
}
location /reserved-channel-appscale-path {
proxy_buffering off;
tcp_nodelay on;
keepalive_timeout 55;
proxy_pass http://128.111.55.219:5280/http-bind;
}
}
Итак, после попытки найти ответ на повторные запросы в nginx, я не нашел чистого способа повторения запросов, но придумал для этого своего рода хакерский способ. Так что внутри вверх по течению в разделе конфигурации nginx, вы должны поместить несколько копий одного и того же вышестоящего сервера, поскольку повторная попытка в nginx осуществляется на уровне вышестоящего сервера. Если один вышестоящий сервер выходит из строя, nginx пытается запросить другой вышестоящий сервер. Если у вас только 1 вышестоящий сервер, как у меня, он не будет повторять запрос. Чтобы преодолеть это, я помещаю несколько копий одного и того же вышестоящего сервера, так что к тому времени, когда nginx пройдется по списку серверов и отправит запросы, вышестоящий сервер (в данном случае haproxy) будет перезагружен и запрос будет отправлен на. Также важно пройти через различные тайм-ауты, которые nginx предоставляет в модуле http и модуле сервера. "fail_timeout" - говорит, что если вышестоящий сервер недоступен, списать его на x секунд, но если все они недоступны, он не списывает (я упоминаю об этом, поскольку к тому времени, когда nginx пройдёт весь список, haproxy может не возникли, но это не будет проблемой из-за этого свойства) PS: это хакерское решение, и мне нужно было иметь около 100-150 записей восходящего потока в моем файле nginx для уменьшения количества ошибок до значительного числа. Приветствуются лучшие решения :)
Не совсем то, о чем вы спрашиваете, но, возможно, ближе к делу: как вы перезапускаете HAProxy? С опцией SF вы сможете перезапустить HAProxy без отбрасывания любых запросов на соединение. Я не верю, что nginx может повторять запросы, но если вы действительно этого хотите, у вас может быть внешний интерфейс HAProxy для другого экземпляра HAProxy. Затем HAProxy будет повторять запросы ко второму экземпляру. Но это кажется действительно глупым. Сначала проверьте вариант SF.
Перезапустите скрипт HAProxy (из комментариев). Greps только для моих теплых-нечетких ощущений:
#!/bin/sh
ps -ef | grep haproxy
haproxy -f haproxy.cfg -sf $(cat /var/run/haproxy.pid)
ps -ef | grep haproxy