问题描述
- uwsgi --http-socket=:port --venv --plugin --pythonpath 启动后可以通过ip:port 访问
- 服务器同时存在另一个listen 80 的server 正在运行。
- nginx 配置 :
server {
server_name domain.com;
listen 80;
location / {
alias /home/xxx;
}
}
通过域名(domain.com)无法访问,返回502。
- nginx error.log
xxxx/xx/xx 16:02:03 [error] 320570#320570: *10169 uepstream prematurely closed connection while reading response header from upstram, client: ip.xx.ip, server: xxx.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:9191", host: "www.xxx.com"
解决
注意区分
- nginx 配置中 uwsgi_pass 和 proxy_pass 的区别。
- uwsgi 配置中 socket \ http \ http-socket 的区别。
总结
- nginx 中 使用uwsgi_pass, uwsgi 中必须使用 socket。如果 使用 uwsgi_pass 和 http-socket 组合,测试会出现上面502 错误。
- 不通过nginx发布、需要直接把uwsgi暴露外网时,使用 http 选项。此时 uwsgi 会创建一个新的http进程。
- 通过nginx发布,nginx 中使用proxy_pass 时,uwsgi 需要 http-socket 来暴露接口。
简单的理解整理成下面的对应关系:
编号 | Nginx 配置 | uWSGI 配置 | 备注 |
---|---|---|---|
1 | uwsgi_pass 127.0.0.1:9191; | --socket=127.0.0.1:9191 | 推荐配置 |
2 | proxy_pass http://127.0.0.1:9191 | --http-socket=127.0.0.1:9191 | |
3 | 不使用 Nginx发布 | --http=127.0.0.1:9191 --plugin=http | 可能需要安装 uwsgi-http 和uwsgi-router_http |
网友评论