繁体   English   中英

在 ubuntu 16.04 上使用 nginx、uwsgi python-flask 获取“502 Bad Gateway”

[英]Getting “502 Bad Gateway” with nginx, uwsgi python-flask on ubuntu 16.04

我正在按照这个在 Ubuntu 16-04 上部署一个Flask 应用程序(简单的 hello world) 数字海洋教程

一切正常,直到测试 uWSGI 服务 之后,我按照描述的步骤进行了操作,当我最终到达底部并检查服务器 IP 地址时,我得到了:

502 Bad Gateway

好的。 我搜索并检查了我的错误日志,我得到了这个:-

2017/01/16 05:29:27 [crit] 20714#20714: *2 connect() to unix:/home/sajjan/project/project.sock failed (2: No such file or directory) while connecting to upstream, client: xx.9.xxx.xxx, server: 138.xxx.xx.xxx, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: "xx.xx.xx.xx"

因此,在记录错误日志后,我手动创建了文件 project.sock。 再次转到服务器IP地址,然后出现同样的错误“502 Bad Gateway”

再次检查错误日志,发现了这个

2017/01/16 06:07:11 [crit] 20874#20874: *1 connect() to unix:/home/sajjan/project/project.sock failed (13: Permission denied) while connecting to upstream, client: 47.9.237.113, server: XX.XX.XX.XX, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: " XX.XX.XX.XX "

我想出了权限问题并使用以下命令更改权限

sudo chmod 666 project.sock

现在我检查了权限(使用 ls -l 文件名)

-rw-rw-rw- 1 root root 0 Jan 16 05:31 project.sock

现在我回去检查服务器的IP,但发现相同的“502 Bad Gateway”。 我再次检查了错误日志并发现了这一点:

017/01/16 06:13:31 [error] 20897#20897: *6 connect() to unix:/home/sajjan/project/project.sock failed (111: Connection refused) while connecting to upstream, client: 47.9.237.113, server: XX.XX.XX.XX, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: " XX.XX.XX.XX ", referrer: "http:// XX.XX.XX.XX /"

我在谷歌上搜索了上述错误,在过去两天里读了很多,但对我来说似乎没什么用。 我已经检查了这些答案,但没有帮助stackanswer-1 stackanswer-2并且随着这些,我检查了所有数字海洋社区线程,但似乎没有任何效果。

我完全是服务器的初学者,对 ubuntu 了解不多。 如果您能帮我找出我做错了什么,或者建议一些更好的教程/方法来部署我的 Flask 应用程序,那么我将不胜感激。

这些是我的文件

  1. 你好.py

     from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "<h1 style='color:blue'>Hello There!</h1>" if __name__ == "__main__": app.run(host='0.0.0.0')
  2. 项目文件

    [uwsgi] module = wsgi:app master = true processes = 5 socket = /home/sajjan/project/project.sock chmod-socket = 660 vacuum = true die-on-term = true
  3. wsgi.py

     from hello import app if __name__ == "__main__": app.run()
  4. 下面是文件:/etc/nginx/sites-available/project

     server { listen 80; server_name 138.197.28.107; location / { include uwsgi_params; uwsgi_pass unix:/home/sajjan/project/project.sock; } }

当我运行命令时:

    sudo service uwsgi restart

输出:

   Failed to restart wsgi.service: Unit wsgi.service not found. 

而输出

   sudo service nginx status/restart

那么这表明nginx正在运行。

帮助我,如果您还有什么想知道的,请告诉我。 谢谢

编辑 :

我创建了一个 project.service 文件,它的内容是:

    [Unit]
    Description=uWSGI instance to serve project
    After=network.target

    [Service]
    User=sajjan
    Group=www-data
    WorkingDirectory=/home/sajjan/project
    Environment="PATH=/home/sajjan/project/venv/bin"
    ExecStart=/home/sajjan/project/venv/bin/uwsgi --ini project.ini

    [Install]
    WantedBy=multi-user.target

我发现我必须运行以下命令:

    sudo systemctl start project

输出是:

    Warning: project.service changed on disk. Run 'systemctl daemon-reload' to reload units.

当我跑步时

     sudo systemcl reload project 

然后输出:

    Failed to reload project.service: Job type reload is not applicable for unit project.service.
    See system logs and 'systemctl status project.service' for details.

当我检查“systemctl status project.service”时

     ● project.service - uWSGI instance to serve project
      Loaded: loaded (/etc/systemd/system/project.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2017-01-16 17:49:29 UTC; 6min ago
      Main PID: 27157 (code=exited, status=203/EXEC)

     Jan 16 17:49:29 learningwithpython systemd[1]: Started uWSGI instance to serve project.
     Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Main process exited, code=exited, status=203/EXEC
     Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Unit entered failed state.
     Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Failed with result 'exit-code'.

我在使用指南时遇到了同样的问题。 据我读过; 502 bad gateway 是 Nginx 无法正确连接到 uwsgi 的症状。 更改套接字的权限为我解决了这个问题。

sudo chmod 777 /home/sajjan/project/project.sock
sudo systemctl restart nginx

777当然有点过分,但它是一种快速而肮脏的方式来验证它是否实际上是权限问题

Nginx 没有写入套接字的权限。 使用以下命令授予适当的模式对我有帮助。

chmod 0755 /to/project

同样的问题。

但是我给了 666 权限并重新启动所有,它可以工作。

我认为错误日志只显示了问题的一个可能原因。 同时, journalctl -u <yourproject>.service命令帮助提供了另一个原因。

我的错误日志还告诉我他找不到“myproject.socket”。 但是 .ini 已经帮助我们构建了它。 然后我得到这个错误: myproject.service: Failed at step USER spawning ~/bin/uwsgi: No such process

所以也许这是权限的问题。

对我来说,这个问题是由于用户配置造成的。 基本上,我使用 root 用户设置了我的所有项目。 但是后来我使用具有 sudo 权限的非 root 用户从头开始重新编写所有内容。 有效。

我在https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-16-04上看到了您的评论

尝试运行sudo /etc/init.d/nginx start然后尝试打开http://server_domain_or_IP

如果有效,请输入which uwsgi以找到正确的 uwsgi 路径并更改“/etc/systemd/system/myproject.service”

改变

Environment="PATH=/home/sammy/myproject/myprojectenv/bin" ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini进入真实路径而不是env路径。

我通过这些命令找出了这个问题。

尝试运行myapp/bin/uwsgi --ini myapp.ini以查看myapp/bin/uwsgi --ini myapp.ini运行的实际错误。

在我的情况下,.ini 配置文件中的 5 个进程对我的 cpu 处理太多了,这是我的错误输出。

your processes number limit is 3900 your memory page size is 4096 bytes detected max file descriptor number: 1024

如果是这种情况,将 .ini 文件中的进程数降低到 2 可能会起作用。

正如许多人已经提到的,502 错误与套接字权限有关(您可能会在/var/log/nginx/error.log看到Permission denied错误)。 然而,这一切似乎都必须奏效,因为

  1. 套接字的文件所有权是your_user:www-data
  2. socket的文件权限是660(这意味着你和组可以读/写socket)
  3. nginx 与用户www-data:www-data (它在 nginx .conf 文件中配置)

真正的问题是nginx 无法连接到位于您的主目录中的套接字

所以解决方案很简单 - 只需将套接字文件移到其他地方即可。 例如,到/tmp//var/www/...文件夹。


解决方案:

创建目录

sudo mkdir /var/www/your_project
sudo chown your_user:www-data /var/www/your_project

修改your_project.ini

socket = /var/www/your_project/your_project.sock

修改nginx服务器块

uwsgi_pass unix:///var/www/your_project/your_project.sock;

重启uWSGI和nginx

sudo systemctl restart your_project_service
sudo systemctl restart nginx

现在这一切都必须奏效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM