dms*_*ant 2 python nginx flask
我有一个 Flask 应用程序,我想通过 DO Droplet 提供服务。\n我已遵循如何在 Ubuntu 22.04 上使用 Gunicorn 和 Nginx 提供 Flask 应用程序
\n这是我的文件夹结构
\nroot/ \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\nRun Code Online (Sandbox Code Playgroud)\napp.py 看起来像这样
\nfrom app import app\n\nif __name__ == "__main__":\n app.run(host=\'0.0.0.0\', debug=True)\nRun Code Online (Sandbox Code Playgroud)\n我创建了一个baseweb服务
\nDescription=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\nRun Code Online (Sandbox Code Playgroud)\n和我的 nginx 配置 ( /etc/nginx/sites-available/baseweb) - 根据下面的 arthur sima 评论进行编辑
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}\nRun Code Online (Sandbox Code Playgroud)\n当我简单地使用我的 venv 运行 app.py 时,我可以直接通过 IP 访问我的 Flask 应用程序
\n如果我运行,gunicorn --bind 0.0.0.0:5000 app:app我还可以通过相同的 IP 访问我的应用程序。
但是当我尝试通过 nginx 访问(直接通过域或 IP 而不在控制台中运行应用程序)时,我超时了
\n我花了几个小时尝试调整设置,但我不知道哪里出了问题 - 所以非常感谢任何帮助。
\n编辑 2023-02-17:Ngnix access.log
\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: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"\nRun Code Online (Sandbox Code Playgroud)\n
可能有多个问题导致 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 来快速调试(但在快速测试后将其切换回来并相应地修复权限)
| 归档时间: |
|
| 查看次数: |
1028 次 |
| 最近记录: |