将 Nginx 与 django 和 uwsgi 一起使用时遇到问题
Trouble with using Nginx with django and uwsgi
我按照 http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html 中的步骤操作,但是当我访问 127.0.0.1:8000 时所有步骤都没有任何错误地完成,它响应超时,我的 nginx 日志显示
upstream timed out (110: Connection timed out) while reading response header from upstream,
顺便说一句,我可以访问 127.0.0.1:8001,其中 uwsgi 和 django 运行良好。
我也可以访问 127.0.0.1:8000/image/1.jpg 中的图片,但就是无法访问 127.0.0.1:8000
这是我的 nginx.conf
upstream django {
server 127.0.0.1:8001;
}
server {
listen 8000;
server_name 127.0.0.1
charset utf-8;
client_max_body_size 75M;
location /media {
alias /home/zhaolei/virtualdjango/bin/mysite/media;
}
location /image {
alias /home/zhaolei/virtualdjango/bin/mysite/image;
}
location / {
uwsgi_pass django;
include /home/zhaolei/virtualdjango/bin/mysite/uwsgi_params;
}
}
我使用 uwsgi --http 127.0.0.1:8001 --chdir=mysite --module=mysite.wsgi
到 运行 uwsgi。我在 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params
中使用 uwsgi_params
主机
uWSGI 有 2 种协议来与 web 服务器通信。其中之一是普通的 HTTP 协议,也可用于直接与客户端通信。但是也有特殊的uwsgi协议,优化了HTTP代理服务器和uWSGI之间的通信。
当使用 uwsgi_pass
指令时,nginx 使用该协议,当您使用 --socket
参数启动 uWSGI 服务器时,uWSGI 使用该协议。
如果你用 --http
参数启动 uWSGI,uWSGI 将使用 HTTP 协议(这就是你正在做的),但如果 nginx 仍在使用 uwsgi_pass
它期望 uWSGI 协议该套接字,而不是 HTTP。
要修复它,您必须更改您的 uwsgi 启动命令以使用 --socket
而不是 --http
(这是推荐的方式,但您将无法检查 uWSGI 是否正常运行通过直接在浏览器中输入 127.0.0.8001
,但这没关系:如果使用 --http
的命令运行正常,则使用 --socket
) 或使用 proxy_pass
不会有任何区别uwsgi_pass
在您的 nginx 配置中。
在 link 上有描述提到你,对 here
我按照 http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html 中的步骤操作,但是当我访问 127.0.0.1:8000 时所有步骤都没有任何错误地完成,它响应超时,我的 nginx 日志显示
upstream timed out (110: Connection timed out) while reading response header from upstream,
顺便说一句,我可以访问 127.0.0.1:8001,其中 uwsgi 和 django 运行良好。 我也可以访问 127.0.0.1:8000/image/1.jpg 中的图片,但就是无法访问 127.0.0.1:8000
这是我的 nginx.conf
upstream django {
server 127.0.0.1:8001;
}
server {
listen 8000;
server_name 127.0.0.1
charset utf-8;
client_max_body_size 75M;
location /media {
alias /home/zhaolei/virtualdjango/bin/mysite/media;
}
location /image {
alias /home/zhaolei/virtualdjango/bin/mysite/image;
}
location / {
uwsgi_pass django;
include /home/zhaolei/virtualdjango/bin/mysite/uwsgi_params;
}
}
我使用 uwsgi --http 127.0.0.1:8001 --chdir=mysite --module=mysite.wsgi
到 运行 uwsgi。我在 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params
uwsgi_params
主机
uWSGI 有 2 种协议来与 web 服务器通信。其中之一是普通的 HTTP 协议,也可用于直接与客户端通信。但是也有特殊的uwsgi协议,优化了HTTP代理服务器和uWSGI之间的通信。
当使用 uwsgi_pass
指令时,nginx 使用该协议,当您使用 --socket
参数启动 uWSGI 服务器时,uWSGI 使用该协议。
如果你用 --http
参数启动 uWSGI,uWSGI 将使用 HTTP 协议(这就是你正在做的),但如果 nginx 仍在使用 uwsgi_pass
它期望 uWSGI 协议该套接字,而不是 HTTP。
要修复它,您必须更改您的 uwsgi 启动命令以使用 --socket
而不是 --http
(这是推荐的方式,但您将无法检查 uWSGI 是否正常运行通过直接在浏览器中输入 127.0.0.8001
,但这没关系:如果使用 --http
的命令运行正常,则使用 --socket
) 或使用 proxy_pass
不会有任何区别uwsgi_pass
在您的 nginx 配置中。
在 link 上有描述提到你,对 here