Django+Nginx+uWSGI = 504 网关超时

17 投票
2 回答
15679 浏览
提问于 2025-04-16 21:23

我正在使用Ubuntu 10.04,Django 1.3,Nginx 0.8.54和uWSGI 0.9.7。

Nginx和uWSGI都能正常启动,没有报错。但是,当我访问我的网站时,它会停留很长时间,然后最终显示“504 网关超时”错误。

这是我的Nginx虚拟主机配置文件:

server {
listen          80;
server_name     www.mysite.com mysite.com;
error_log       /home/mysite/log/error.log;
access_log      /home/mysite/log/access.log;

location / {
    auth_basic  "Restricted";
    auth_basic_user_file    /home/mysite/public/passwd;
    include uwsgi_params;
    uwsgi_pass unix:///home/mysite/public/myapp.sock;
}

location /media {
    alias /home/mysite/public/myapp/media;
}


error_page  401  /coming_soon.html;

location /coming_soon.html {
    root /home/mysite/public/error_pages/401;
}

location /401/images {
    alias /home/mysite/public/error_pages/401/images;
}

location /401/style {
    alias /home/mysite/public/error_pages/401/style;
}

}

我的网站日志显示了这个:

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request / !!!

我的错误日志显示了这个:

upstream timed out (110: Connection timed out) while reading response header from upstream

我在这个服务器上还有两个其他网站,配置是一样的,它们加载得非常顺利。

有没有人遇到过这个问题?这里有几个讨论和我的问题类似,我尝试了其中的一些解决方案,但似乎都没有效果。

提前感谢你的帮助!

2 个回答

-1

这里提到的是一个文件路径,通常用在设置连接的时候。原来的写法是“unix:///home/mysite/public/myapp.sock;”,但是这个写法有点问题。正确的写法应该是“unix:/home/mysite/public/myapp.sock;”。注意,正确的写法中只有两个斜杠,而不是三个。

24

这个错误是因为请求的时间超过了NGINX的uwsgi_read_timeout设置。当NGINX超过这个时间限制后,它会关闭连接,然后uWSGI再尝试往这个已经关闭的连接写数据,就会出现你看到的错误。

确保你的NGINX的超时时间至少要和uWSGI的超时时间(HARAKIRI_TIMEOUT)一样长。

撰写回答