我正在尝试使用 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。这会更加安全,因为您可以使用目录的权限控制套接字的访问权限,从而限制本地用户造成危害的能力。