在数字海洋上部署 Django、Gunicorn、Nginx、Virtualenv 给我 502 Bad Gateway & Gunicorn can't read Secret Key

Posted

技术标签:

【中文标题】在数字海洋上部署 Django、Gunicorn、Nginx、Virtualenv 给我 502 Bad Gateway & Gunicorn can\'t read Secret Key【英文标题】:Deploying Django, Gunicorn, Nginx, Virtualenv on Digital ocean gives me 502 Bad Gateway & Gunicorn can't read Secret Key在数字海洋上部署 Django、Gunicorn、Nginx、Virtualenv 给我 502 Bad Gateway & Gunicorn can't read Secret Key 【发布时间】:2017-09-20 04:46:51 【问题描述】:

我已经尝试部署 2 天了,即使我浏览了许多文章、*** 问题和 Digital Ocean 教程,我似乎也无法让它工作。

我的主要教程是这个:https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04?comment=47694#create-and-configure-a-new-django-project

当我绑定我的 gunicorn 文件(参见下面的命令)并转到 my_ip_address:8001 时一切正常

gunicorn --bind 0.0.0.0:8001 vp.wsgi:application 

但在我创建和编辑 gunicorn.service 文件的部分:

sudo nano /etc/systemd/system/gunicorn.service 

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=tony
Group=www-data
WorkingDirectory=/home/tony/vp/vp/
ExecStart=/home/tony/vp/vpenv/bin/gunicorn --workers 3 --bind unix:/home/tony/vp/vp/vp.sock vp.wsgi:application

[Install]
WantedBy=multi-user.target

还有我的 nginx 文件出于隐私考虑,我用 my_ip_address 替换了我的 ip 地址

sudo nano /etc/nginx/sites-available/vp

server 
    listen 80;
    server_name my_ip_address;

    location = /facivon.ico  access_log off; log_not_found off; 
    location /static/ 
        root /home/tony/vp;
    

    location / 
            include proxy_params;
            proxy_pass http://unix:/home/tony/vp/vp/vp.sock;
        

我收到一个错误的网关 502 错误。

即使在重新加载所有内容后:

(vpenv) ~/vp/vp$ sudo systemctl daemon-reload 
(vpenv) ~/vp/vp$ sudo systemctl start gunicorn
(vpenv) ~/vp/vp$ sudo systemctl enable gunicorn
(vpenv) ~/vp/vp$ sudo systemctl restart nginx

于是我查看了gunicorn的状态:

(vpenv) ~/vp/vp$ sudo systemctl status gunicorn

并得到错误:

 gunicorn.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sun 2017-04-23 13:41:09 UTC; 18s ago
 Main PID: 15438 (code=exited, status=3)

Apr 23 13:41:09 vp-first gunicorn[15438]:     SECRET_KEY = os.environ["VP_SECRET_KEY"]
Apr 23 13:41:09 vp-first gunicorn[15438]:   File "/home/tony/vp/vpenv/lib/python3.5/os.py", line 7
Apr 23 13:41:09 vp-first gunicorn[15438]:     raise KeyError(key) from None
Apr 23 13:41:09 vp-first gunicorn[15438]: KeyError: 'VP_SECRET_KEY'
Apr 23 13:41:09 vp-first gunicorn[15438]: [2017-04-23 13:41:09 +0000] [15445] [INFO] Worker exitin
Apr 23 13:41:09 vp-first gunicorn[15438]: [2017-04-23 13:41:09 +0000] [15438] [INFO] Shutting down
Apr 23 13:41:09 vp-first gunicorn[15438]: [2017-04-23 13:41:09 +0000] [15438] [INFO] Reason: Worke
Apr 23 13:41:09 vp-first systemd[1]: gunicorn.service: Main process exited, code=exited, status=3/
Apr 23 13:41:09 vp-first systemd[1]: gunicorn.service: Unit entered failed state.
Apr 23 13:41:09 vp-first systemd[1]: gunicorn.service: Failed with result 'exit-code'.
 ^X

我已将我的密钥放置在 ~./bashrc(并且做了 source ~./bashrc)和我的 virtualenv 激活文件中(并且做了 source vpenv/bin/activate)。

.sock 文件找不到了!

一些注意事项:

之前,我遇到了 gunicorn 无法启动的另一个错误,我的 gunicorn 和 nginx 配置路径如下所示:

独角兽:

WorkingDirectory=/home/tony/vp/
    ExecStart=/home/tony/vp/vpenv/bin/gunicorn --workers 3 --bind unix:/home/tony/vp/vp.sock vp.wsgi:application

Nginx:

location / 
                include proxy_params;
                proxy_pass http://unix:/home/tony/vp/vp.sock;
            

如您所见,路径是 vp/vp.sock 而不是现在的 vp/vp/vp.sock。

当我这样做时:

$ ps -aux | grep gunicorn

我明白了:

tony     15624  0.0  0.1  12944   976 pts/3    S+   13:57   0:00 grep --color=auto gunicorn

这意味着有一个错误。

我的nginx错误日志文件:

2017/04/23 13:41:19 [crit] 15491#15491: *2 connect() to unix:/home/tony/vp/vp/vp.sock failed (2: No such file or directory) while connecting to upstream, client: Client.IP, server: Server.IP, request: "GET / HTTP/1.1", upstream: "http://unix:/home/tony/vp/vp/vp.sock:/", host: "Server.IP"
2017/04/23 13:41:19 [crit] 15491#15491: *2 connect() to unix:/home/tony/vp/vp/vp.sock failed (2: No such file or directory) while connecting to upstream, client: Client.IP, server: Server.IP, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/home/tony/vp/vp/vp.sock:/favicon.ico", host: "Server.IP", referrer: "http://Server.IP/"

这是我的 wsgi.py 文件:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

application = get_wsgi_application()

是的,我使用了多个设置文件。

我不得不说这是我第一次部署,但我尽我所能了解一切。

希望你能帮忙!!!

【问题讨论】:

【参考方案1】:

我创建的新用户没有访问.bashrc的权限

我所做的是将环境变量放在我的 gunicorn.service 文件中,如下所示:

[Service]
Environment=VP_SECRET_KEY=<value>

重启一切:

sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl restart nginx

完成了!

【讨论】:

以上是关于在数字海洋上部署 Django、Gunicorn、Nginx、Virtualenv 给我 502 Bad Gateway & Gunicorn can't read Secret Key的主要内容,如果未能解决你的问题,请参考以下文章

数字海洋 NGINX 和 gunicorn 上的 CORS 标头访问控制缺少 django

Nginx 无法在数字海洋上提供 django 静态或媒体文件

markdown Django部署 - 数字海洋

django gunicorn sock 文件不是由 wsgi 创建的

使用 nginx gunicorn 在 digitalocean 上部署 django react

如何使用 Nginx 和 GUnicorn 在单个服务器上部署多个 Django 应用程序?