Nginx

Nginx 無法將流量傳遞給 Flask 應用程序和 uwsgi

  • September 2, 2016

我正在嘗試使用 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,我不知道為什麼。

您的 uwsgi 命令行錯誤。通過檢查您是否有一個8080/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 以進行偵聽,因此請使用 example127.0.0.1:8080而不是 just :8080.

另一種方法是通過為 uwsgi 命令行指定套接字路徑並uwsgi_pass unix:/file/path/passed/to/socket在 nginx 配置中使用來使用 UNIX 套接字而不是監聽 tcp/8080。那會更加安全,因為您可以使用目錄的權限來控制套接字的訪問權限,從而限製本地使用者造成傷害的能力。

引用自:https://serverfault.com/questions/800658