【问题标题】:Getting "502 Bad Gateway" with nginx, uwsgi python-flask on ubuntu 16.04在 ubuntu 16.04 上使用 nginx、uwsgi python-flask 获取“502 Bad Gateway”
【发布时间】:2017-05-31 01:04:34
【问题描述】:

我正在按照这个在 Ubuntu 16-04 上部署一个 flask 应用程序(简单的你好世界)digital Ocean tutorial

测试uWSGI Serving之前一切正常。之后,我按照描述的步骤进行操作,当我最终到达底部并检查服务器 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 了解不多。如果你能帮助我找出我做错了什么或者建议一些更好的教程/方法来部署我的烧瓶应用程序,那么我会很高兴。

这些是我的文件

  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. 项目.ini

    [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'.

【问题讨论】:

  • Failed to restart wsgi.service: Unit wsgi.service not found. - 很抱歉队长明显的问题,但是你创建了/etc/systemd/system/wsgi.service 单元文件吗?如果是,请显示内容。
  • @PiotrDawidiuk,检查编辑。顺便说一句,我创建了一个名为 project.service 而不是 wsgi.service 的文件。
  • 消息说要重新加载systemd 进程,而不是project。运行sudo systemctl daemon-reload,然后运行sudo systemctl start project
  • @PiotrDawidiuk,完成如你所说,但我仍然收到带有错误日志的“502 bad gate way”......2017/01/17 11:31:14 [error] 28689#28689: *6 connect() to unix:/home/sajjan/project/project.sock failed (111: Connection refused) while connecting to upstream, client: XX.XXX.XX.XX, server: XX.XXX.XX.XX, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", host: "XX.XXX.XX.XX", referrer: "http://XX.XXX.XX.XX/"

标签: python ubuntu nginx flask uwsgi


【解决方案1】:

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

chmod 0755 /to/project

【讨论】:

    【解决方案2】:

    我看到你对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 进入真实路径而不是环境路径。

    我通过这些命令解决了这个问题。

    【讨论】:

    • 很好,但是我放弃了设置服务器的想法,也许在不久的将来,它会有所帮助。
    【解决方案3】:

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

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

    777 有点过分了,但它是一种快速而肮脏的方式来验证它是否真的是权限问题

    【讨论】:

    • 谢谢,这帮助我确定了权限问题。我的 uwsgi 进程归一个名为dev用户 所有,我的nginx 进程归www-data 用户,这两个用户都属于www-data 。 uwsgi Unix socketdev:www-data所有(即userdevgroupwww-data),其访问模式是660。它不起作用,所以我最终更改了我的 uwsgi systemd service unit 配置和我的 uwsgi site 配置,以便 uwsgi 进程和socket 也属于www-data useruid 设置)。现在可以了。
    【解决方案4】:

    同样的问题。

    但是我给了 666 权限,然后全部重启,就可以了。

    我认为错误日志仅显示问题的一个可能原因。而journalctl -u &lt;yourproject&gt;.service 命令帮助提出了另一个原因。

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

    所以可能是权限的问题。

    【讨论】:

      【解决方案5】:

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

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

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

      如果是这种情况,将 .ini 文件中的进程数减少到 2 个可能会奏效。

      【讨论】:

      • 谢谢,我的也是内存问题。我的应用在 Google App Engine 上,但我在他们令人生畏的日志控制台中找不到那个特定的错误输出!
      【解决方案6】:

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

      1. socket 的文件所有权是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
      

      现在一切都必须工作。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2018-01-25
          • 2018-08-03
          • 2022-08-16
          • 2020-11-28
          • 2017-04-13
          • 1970-01-01
          • 2020-09-01
          • 2022-01-24
          • 2020-12-14
          相关资源
          最近更新 更多