在树莓派上运行 django 和 gunicorn

在树莓派上运行 django 和 gunicorn

因此我尝试遵循以下方法:

https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04

除了最新的树莓派。我思考或者认为我已经正确配置了一切......

在上面的教程中,它指导你创建一个 django 项目,让它在 gunicorn 下运行,甚至使用以下命令进行测试:

激活虚拟环境然后

cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi

这部分有效,一旦出现,就像我做了一个 python3 manage.py runserver 0.0.0.0:8000

然后我可以进入浏览器并输入主机名:

webserver2.abc.com:8000

并且所有工作应用程序都会出现。

如果我停止 gunicorn 命令并输入 deactivate,我会尝试使用我在 /etc/systemd/system 中添加的 .service 来运行它。它似乎运行了,并且

 sudo systemctl status gunicorn


● gunicorn.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-10-21 13:24:51 MDT; 50s ago
 Main PID: 7645 (gunicorn)
    Tasks: 4 (limit: 4915)
   Memory: 55.0M
   CGroup: /system.slice/gunicorn.service
           ├─7645 /home/pi/myvirtualenv_covid19/covid19env/bin/python /home/pi/myvirtualenv_covid19/covid19env/bin/gunicorn --workers 3 --bind unix:/tmp/covid19.sock covid19.wsgi:application
           ├─7651 /home/pi/myvirtualenv_covid19/covid19env/bin/python /home/pi/myvirtualenv_covid19/covid19env/bin/gunicorn --workers 3 --bind unix:/tmp/covid19.sock covid19.wsgi:application
           ├─7652 /home/pi/myvirtualenv_covid19/covid19env/bin/python /home/pi/myvirtualenv_covid19/covid19env/bin/gunicorn --workers 3 --bind unix:/tmp/covid19.sock covid19.wsgi:application
           └─7653 /home/pi/myvirtualenv_covid19/covid19env/bin/python /home/pi/myvirtualenv_covid19/covid19env/bin/gunicorn --workers 3 --bind unix:/tmp/covid19.sock covid19.wsgi:application

Oct 21 13:24:51 webserver2 systemd[1]: Started gunicorn daemon.
Oct 21 13:24:51 webserver2 gunicorn[7645]: [2020-10-21 13:24:51 -0600] [7645] [INFO] Starting gunicorn 20.0.4
Oct 21 13:24:51 webserver2 gunicorn[7645]: [2020-10-21 13:24:51 -0600] [7645] [INFO] Listening at: unix:/run/gunicorn.sock (7645)
Oct 21 13:24:51 webserver2 gunicorn[7645]: [2020-10-21 13:24:51 -0600] [7645] [INFO] Using worker: sync
Oct 21 13:24:51 webserver2 gunicorn[7645]: [2020-10-21 13:24:51 -0600] [7651] [INFO] Booting worker with pid: 7651
Oct 21 13:24:51 webserver2 gunicorn[7645]: [2020-10-21 13:24:51 -0600] [7652] [INFO] Booting worker with pid: 7652
Oct 21 13:24:51 webserver2 gunicorn[7645]: [2020-10-21 13:24:51 -0600] [7653] [INFO] Booting worker with pid: 7653

确认。

因此它似乎正在运行,但这次再次访问 webserver2.abc.com:8000 不起作用,这是 /etc/systemd/system 中的 gunicorn.service

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

[Service]
User=pi
WorkingDirectory=/home/pi/myvirtualenv_covid19/covid19
ExecStart=/home/pi/myvirtualenv_covid19/covid19env/bin/gunicorn --workers 3 --bind unix:/tmp/covid19.sock covid19.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

好奇没有要绑定的端口?也许我的 django 项目中缺少额外的配置???

其次,让 nginx 看到这些似乎是一个问题,因为如果我转到

http://webserver2.abc.com:8080/

给出 502 bad gateway。通常会告诉我 /var/log/nginx 中的错误:

2020/10/21 13:33:11 [crit] 1836#1836: *65 connect() to unix:/tmp/covid19.sock failed (2: No such file or directory) while connecting to upstream, client: 10.75.1.245, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/covid19.sock:/", host: "webserver2.abc.com:8080"

它似乎正在运行,但 /tmp 中没有 sock 文件,这让我相信 gunicorn 不是从 systemd/system .service 文件运行的

因此,看起来似乎没有创建 sock,尽管 gunicorn.socket 文件确实设置为有一个 /run/gunicorn.sock 文件。只是没有 /tmp/covid19.sock 文件。

我感觉我已经很接近了,只需要一点帮助来把这些点连接起来。

(另外,我的 nginx 设置为监听端口 8080,但是我没有在 gunicorn.service 文件中看到在哪里告诉它在 8080 上运行?)

并且为了完整性,我的 covid19.conf 文件来自 /etc/nginx/ 中的 sites-available

server {
    listen 8080;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /home/pi/myvirtualenv_covid19/covid19;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/tmp/covid19.sock;
    }
}

答案1

好的,我刚刚按照相同的说明设置了一个 Pi 来为我的 django 应用程序提供服务(实际上,我在找到要遵循的 digitalocean 指南之前就发现了你的问题,因为我知道我不想要 20.04/upstart)。

按照指南操作对我来说没问题,所以我会尽力提供帮助。我注意到需要注意的事情是:

[Unit]
Description = gunicorn daemon
**Requires=gunicorn.socket**
After=network.target

[Service]
User=pi
WorkingDirectory=/home/pi/myvirtualenv_covid19/covid19
ExecStart=/home/pi/myvirtualenv_covid19/covid19env/bin/gunicorn --workers 3 --bind     unix:/tmp/covid19.sock covid19.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

requires=gunicorn.socket我的里面没有这个。

我将套接字文件放在我的主目录中,以便我的用户避免任何权限问题(我以前遇到过这个问题),所以我建议这样做。

据我所知,gunicorn 通过套接字与 nginx 通信,因此不需要告诉它要监听的端口 - nginx 会进行监听,然后将其传递给 gunicorn。

我认为您可能需要检查日志,但我认为它位于 gunicorn.service 文件中的额外行和套接字的位置之间,这将是我首先要启动的地方;完成这些事情后(无参考,主文件夹中的套接字),我的系统已启动并运行,没有任何问题。

高血压

相关内容