因此我尝试遵循以下方法:
除了最新的树莓派。我思考或者认为我已经正确配置了一切......
在上面的教程中,它指导你创建一个 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 文件中的额外行和套接字的位置之间,这将是我首先要启动的地方;完成这些事情后(无参考,主文件夹中的套接字),我的系统已启动并运行,没有任何问题。
高血压