Nginx

在樹莓派上執行 django 和 gunicorn

  • October 28, 2020

所以我想在這裡遵循這個:

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 壞網關。通常會告訴我 /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 文件中的額外行與我首先要開始的套接字位置之間;完成這些事情(沒有參考,主文件夾中的套接字)我已經啟動並執行沒有問題。

高溫高壓

引用自:https://serverfault.com/questions/1039616