【发布时间】:2019-06-29 02:25:22
【问题描述】:
我有一个使用 Nginx 作为负载平衡器 (least_conn) 的站点设置,它使用单独的 uwsgi/django 服务器作为其上游。这通常是一个由大约 5 个 uwsgi/django 服务器组成的池,但我将它限制为只有一个,以确保它不是坏服务器。
在“正常”用户行为下,一切似乎都运行良好。 我的问题是快速、连续的请求会间歇性地产生 502 错误。我可以通过在我们的管理员中打开一个包含所有文章列表的页面来尝试重新创建它。通过在新选项卡中打开一堆链接,大约十分之一的链接会失败并出现 502 错误。
另一个好奇的是,502 发生的速度非常快。例如,当 502 确实出现时,它就像标签打开一样即时。我希望 nginx 前端在返回错误之前稍等片刻。
我正在使用 uwsgi_pass 直接在 nginx 负载均衡器和 uwsgi 之间进行代理。我已经阅读了许多其他关于必须增加缓冲区的帖子。我试过设置 uwsgi_buffers_size 16k;和 uwsgi_buffers 4 16k;但他们没有改变。
来自 Nginx 和 Uwsgi 的错误日志没有显示任何关于 502 的信息。谷歌网站管理员工具,但注意到它们。
相关的nginx.conf设置:
worker_processes auto;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
events {
multi_accept on;
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log off;
sendfile on;
tcp_nopush on;
#Timeouts
keepalive_timeout 65;
send_timeout 60;
client_body_timeout 12;
client_header_timeout 12;
upstream backend {
least_conn;
server ipaddress:22882;
}
server {
listen 27313;
server_name exampledomain.com;
access_log off;
port_in_redirect off;
uwsgi_next_upstream error;
location / {
uwsgi_read_timeout 300;
uwsgi_send_timeout 150;
uwsgi_connect_timeout 300;
uwsgi_buffer_size 16k;
uwsgi_buffers 4 16k;
uwsgi_pass backend;
}
Uwsgi 以这些参数启动:
--socket :22882
--master
--workers 5
--threads 2
--max-requests 1500
--wsgi-file ~/django_prod/wsgi.py
--pidfile ~/django_prod/nginx/log/uwsgi.pid
--daemonize ~/django_prod/nginx/log/uwsgi.log
--python-path ~/django_prod
--python-path ~/django_prod/lib/
--env DJANGO_SETTINGS_MODULE=myproject.settings
--vacuum
【问题讨论】:
-
请注意,错误502与504不同。不是“网关超时”,而是“网关错误”,所以真正的原因在django方面。我假设当超过工人限制时,django 会在随后的 rewuests 上抛出 502 错误,但我不知道 django 是否足够好来确定。
-
我看到当页面 502s 时,UWSGI 日志中的相应条目显示正常,就像任何其他工作请求一样。我知道这个条目是基于时间错误的 502 页面,而且这是一篇非常古老的文章,通常不会被访问。 [pid: 3226|app: 0|req: 565/2827] 127.0.0.1 () {68 vars in 1628 bytes} [Tue Oct 25 10:55:02 2016] GET /admin/news/news/149/?_changelist_filters =p%3D218 => 在 92 毫秒 (HTTP/1.0 200) 内生成 13862 字节 307 字节中的 6 个标头(1 核心 0 上的开关)