【问题标题】:Gunicorn with unix socket not working gives 502 bad gateway带有 unix 套接字的 Gunicorn 无法正常工作会导致 502 网关错误
【发布时间】:2016-09-01 23:13:32
【问题描述】:

我正在关注http://www.obeythetestinggoat.com/book/chapter_08.html 这本书,它说要添加一个 unix 套接字来使用 gunicorn 运行 nginx 服务器,我这样做了。 这是我的 nginx 文件

server {
listen 80;
server_name mydjsuperlist-staging.tk;

location /static {
alias /home/elspeth/sites/mydjsuperlist-staging.tk/static;
}

location / {
proxy_set_header Host $host;
    proxy_pass http://unix:/tmp/mydjsuperlist-staging.tk.socket;
}
} 

Nginx 重新加载没有任何故障并使用 nginx -t 检查它

当我跑步时:

gunicorn --bind unix:/tmp/mydjsuperlist-staging.tk.socket superlists.wsgi:application

它成功地在 tmp 文件夹中创建了 mydjsuperlist-staging.tk.socket 文件,我在终端上得到了这个

2016-09-01 18:56:01 [15449] [INFO] Starting gunicorn 18.0
2016-09-01 18:56:01 [15449] [INFO] Listening at: unix:/tmp/mydjsuperlist-staging.tk.socket (15449)
2016-09-01 18:56:01 [15449] [INFO] Using worker: sync
2016-09-01 18:56:01 [15452] [INFO] Booting worker with pid: 15452

一切似乎都很好,但是当我访问我的站点 mydjsuperlist-staging.tk 时,它会出现 (502) 错误网关错误。 当我使用端口时,我的网站运行良好。我在这里做错了什么?

【问题讨论】:

  • nginx 返回错误 502 还是 gunicorn?
  • 我认为它是 nginx,因为在浏览器中我收到错误消息 502 网关错误,在它下面是 nginx/ubuntu 14.04,它仍然令人困惑,我在终端上看不到任何类型的连接响应.我怎么知道 gunicorn 是否引起了问题
  • nginx错误日志里面的信息是什么?
  • 您是否在运行启用 SELinux 的 Unix 系统?我最近也遇到过这种情况。如果是,请告诉我,我会发布解决方案
  • 不,我在本地运行 Ubuntu,在服务器上没有安装任何 selinux 包

标签: django nginx gunicorn unix-socket bad-gateway


【解决方案1】:

将您的套接字文件放入 /var/run 而不是 /tmp

不客气。

这个答案花了我两个小时,fml...

我在https://serverfault.com/questions/463993/nginx-unix-domain-socket-error/464025#464025找到它

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我也在做同样的教程,所以这是我的解决方案: http://docs.gunicorn.org/en/stable/deploy.html

    注意:我没有使用 Upstart,而是使用 SystemD 服务

    1) 在/etc/systemd/system/nginx.service进行服务

    [Unit]
    Description=Gunicorn server for {SITENAME}
    After=network.target
    
    [Service]
    User={user}
    Group=www-data
    WorkingDirectory=/home/{user}/sites/{SITENAME}/source
    ExecStart=/home/{user}/sites/{SITENAME}/virtualenv/bin/gunicorn --workers 3 --bind unix:/tmp/{SITENAME}.socket superlists.wsgi:application
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    2) 我按照http://docs.gunicorn.org/en/stable/deploy.html 的后续步骤制作了 gunicorn.socketgunicorn.conf,但我只是注意到我的套接字状态为非活动状态,所以我觉得没必要。

    /usr/lib/tmpfiles.d/gunicorn.conf 中的 gunicorn.conf 文件

    d /run/gunicorn 0755 someuser someuser -
    

    接下来启用服务,以便它们在启动时自动启动:

    $ systemctl 启用 nginx.service $ systemctl enable gunicorn.socket

    要么重新启动,要么手动启动服务:

    $ systemctl start nginx.service $ systemctl start gunicorn.socket

    一些有用的提示:

    • 确保您的服务已启动并正在运行

      $ systemctl status gunicorn.service

    • 检查 Nginx 配置是否正常

      $ sudo nginx -t

    • 检查有没有放错地方的字母
    • 确保将您的域作为字符串放入您的 ALLOWED_HOSTS 中,我花了大约 1 小时才意识到我错过了“”

    ALLOWED_HOSTS = [**'**{SITENAME}**'**]

    我花了大约 6 个小时才让它运行起来,但这是我第一次这样做,而且我对 Unix 的零知识我认为还可以。

    希望对你有帮助,继续努力直到成功!!

    【讨论】:

    • 谢谢@Tiago,一切都很好,直到我遇到了 Unix Socket 问题的死胡同,现在我只使用端口,它们工作正常,将尝试您的解决方案并使用 SystemD 代替服务用 gunicorn 代替。
    • 你如何使用端口?您是否相信当我部署真实站点而不是第一阶段时,我又遇到了同样的问题?我不知道该做什么更多...花了一天的时间尝试但没有成功
    【解决方案3】:

    尝试将您的用户添加到 nginx 组,例如:

    sudo usermod -a -G user nginx
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 2012-05-28
      • 2018-12-05
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多