在樹莓派上執行 django 和 gunicorn
所以我想在這裡遵循這個:
除了最新的樹莓派。我認為或認為我已經正確配置了所有內容……
在上面的那個教程中,它讓你從創建一個 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 壞網關。通常會告訴我 /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 文件執行
所以看起來襪子並沒有被創建,儘管 gunicorn.socket 文件確實設置了一個 /run/gunicorn.sock 文件。只是 /tmp/covid19.sock 文件不是。
我覺得我很親密,只需要一點幫助來連接點。
(我的 nginx 也設置為偵聽埠 8080,但我沒有看到我在 gunicorn.service 文件中告訴它在 8080 上執行的位置?)
為了完整起見,我的 covid19.conf 文件來自 /etc/nginx/ 中可用的站點
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; } }
好的,我剛剛使用相同的說明設置了一個 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
。我將套接字文件放在我的使用者主目錄中以避免任何權限問題(我以前遇到過這個問題),所以我建議這樣做。
AFAIK gunicorn 通過套接字與 nginx 通信,因此不需要告訴它監聽的埠 - nginx 進行監聽,然後將其傳遞給 gunicorn。
我認為您可能需要檢查日誌,但我認為它位於 gunicorn.service 文件中的額外行與我首先要開始的套接字位置之間;完成這些事情(沒有參考,主文件夾中的套接字)我已經啟動並執行沒有問題。
高溫高壓