![Nginx 无法将流量传递给 Flask 应用程序和 uwsgi](https://linux22.com/image/689265/Nginx%20%E6%97%A0%E6%B3%95%E5%B0%86%E6%B5%81%E9%87%8F%E4%BC%A0%E9%80%92%E7%BB%99%20Flask%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%92%8C%20uwsgi.png)
我正在尝试使用 Nginx 部署 Flask 和 uwsgi 应用程序,一切正常,我可以让我的应用程序在我的域上运行:test.example.com:8080
。
问题是我无法让它在默认端口 80 下工作,当我尝试浏览时,我从 Nginx 收到以下错误消息test.example.com
:
2016/09/02 10:21:29 [error] 2947#2947: *3 no live upstreams while connecting to upstream, client: 75.xxx.xxx.136, server: test.example.com, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://localhost", host: "test.example.com", referrer: "http://test.example.com/"
这是我的 uwsgi 命令:
uwsgi --socket 8080 --chdir /var/www/test.example.com --protocol=http --module myapp:app
这是我的 Nginx 配置:
server {
listen 80;
root /var/www/test.example.com;
server_name test.example.com;
location / {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8080;
uwsgi_param SCRIPT_NAME /myapp;
}
}
Nginx 不能将流量从我的服务器的 80 端口传递到 8080 端口,我不知道为什么。
答案1
8080
您的 uwsgi 命令行是错误的。请检查您是否在 下有一个名为 的文件套接字,以进行确认/var/www/test.example.com
。如果存在,则说明您混淆了 TCP 和 UNIX 套接字。
另外,--protocol http
意味着你应该使用 HTTP 协议来访问 uwsgi,而不是 uwsgi 自己的协议,nginx 也支持该协议。删除该选项,或者使用proxy_pass
代替uwsgi_pass
。
正确的命令行是:
uwsgi --socket :8080 --chdir /var/www/test.example.com --module myapp:app
为了提高安全性,您可能还需要指定 uwsgi 监听的站点本地 IP,因此使用例如,127.0.0.1:8080
而不仅仅是:8080
。
另一种方法是使用 UNIX 套接字,而不是通过为 uwsgi 命令行指定套接字路径并uwsgi_pass unix:/file/path/passed/to/socket
在 nginx 配置中使用来监听 tcp/8080。这会更加安全,因为您可以使用目录的权限控制套接字的访问权限,从而限制本地用户造成危害的能力。