让 nginx 为我的 Flask 应用程序提供服务时出现问题

dms*_*ant 2 python nginx flask

我有一个 Flask 应用程序,我想通过 DO Droplet 提供服务。\n我已遵循如何在 Ubuntu 22.04 上使用 Gunicorn 和 Nginx 提供 Flask 应用程序

\n

这是我的文件夹结构

\n
root/ \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 baseweb/\n     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 venv\n     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.py \n     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app/ \n         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 routes.py \n         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates/ \n             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.html\n
Run Code Online (Sandbox Code Playgroud)\n

app.py 看起来像这样

\n
from app import app\n\nif __name__ == "__main__":\n    app.run(host=\'0.0.0.0\', debug=True)\n
Run Code Online (Sandbox Code Playgroud)\n

我创建了一个baseweb服务

\n
Description=Gunicorn instance to serve myproject\nRequires=project.sock\nAfter=network.target\n\n[Service]\nUser=root\nGroup=www-data\nWorkingDirectory=/root/baseweb\nEnvironment="PATH=/root/baseweb/venv/bin"\nExecStart=/root/baseweb/venv/bin/gunicorn --preload --timeout 120 --bind unix:/baseweb/baseweb.sock -m 007 --work\n\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n

和我的 nginx 配置 ( /etc/nginx/sites-available/baseweb) - 根据下面的 arthur sima 评论进行编辑

\n
server {\n  list 80;\n  server_name baserank.net, www.baserank.net;\n\n  location / {\n    proxy_pass http://127.0.0.1:5000;\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我简单地使用我的 venv 运行 app.py 时,我可以直接通过 IP 访问我的 Flask 应用程序

\n

如果我运行,gunicorn --bind 0.0.0.0:5000 app:app我还可以通过相同的 IP 访问我的应用程序。

\n

但是当我尝试通过 nginx 访问(直接通过域或 IP 而不在控制台中运行应用程序)时,我超时了

\n

我花了几个小时尝试调整设置,但我不知道哪里出了问题 - 所以非常感谢任何帮助。

\n

编辑 2023-02-17:Ngnix access.log

\n
185.16.141.5 - - [17/Feb/2023:14:14:17 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"\n185.16.141.5 - - [17/Feb/2023:14:14:17 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"\n185.16.141.5 - - [17/Feb/2023:14:14:20 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"\n185.16.141.5 - - [17/Feb/2023:14:14:20 +0000] "GET / HTTP/1.1" 502 568 "http://baserank.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"\n143.110.222.166 - - [17/Feb/2023:14:22:21 +0000] "GET / HTTP/1.1" 502 166 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1"\n
Run Code Online (Sandbox Code Playgroud)\n

Pas*_*zyk 6

可能有多个问题导致 502。我首先确保在通过 proxy_pass'ing 访问 baserank.net 到 127.0.0.1:5000 时完全使用了您的 nginx 配置:

server {
    listen 80;
    server_name baserank.net www.baserank.net;

    location / {
        proxy_pass http://127.0.0.1:5000;
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,如果您看到 Flask 安装,请使用以下命令检查 nginx 正在使用哪个用户:

server {
    listen 80;
    server_name baserank.net www.baserank.net;

    location / {
        proxy_pass http://127.0.0.1:5000;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您看到这里以外的内容root,则很可能是 nginx 无法访问套接字,因为它位于/root目录内。

存储套接字的更好位置是,/var/run但只要用户 nginx 正在运行就可以访问套接字:

/root/baseweb/venv/bin/gunicorn --workers 1 --bind unix:/var/run/baseweb.sock app:app
Run Code Online (Sandbox Code Playgroud)

以及对应的nginx位置conf:

location / {
   proxy_pass http://unix:/var/run/baseweb.sock;
}
Run Code Online (Sandbox Code Playgroud)

如果 nginx 用户可以访问套接字,但仍然得到 500,则应该使用curl 调试套接字:

curl --unix-socket /var/run/baseweb.sock http://localhost/
Run Code Online (Sandbox Code Playgroud)

我怀疑 /root/ 下的套接字是这里的罪魁祸首。您也可以通过将 nginx 用户设置为 root 来快速调试(但在快速测试后将其切换回来并相应地修复权限)