Nginx + Gunicorn 部署 Django 項目

Nginx + Gunicorn 部署 Django 項目 #

只是簡單地記錄了一下一個非常 low 的部署方法,沒有任何的 CI/CD,這部分內容日後更新:

Clone 項目 & 安裝環境 #

在 GitHub 上設置好 Deploy Key 之後即可在服務器上 Clone 下自己的倉庫,並且在項目內創建 Virtualenv:

python -m venv env

進入了 env 之後,就是安裝本地需要的庫啦:

pip3 install -r requirements.txt

由於使用了消息隊列 Celery,還需要安裝 redis 等,也就是一些 apt 的事情。

一切搞定之後就使用 Gunicorn 啓動(臨時解決方案是放在 screen 中跑,長期解決方案是 systemd),在項目目錄下:

gunicorn <project\_name>.wsgi

當然,一個稍微好一點的方式是把 Gunicorn 放在 systemd 中運行,可以通過在 /etc/systemd/system/ 下創建一個 gunicorn.service ,文件內容如下:

\[Unit\]
Description = Django Gunicorn
After = network.target

\[Service\]
User = ubuntu
Group = ubuntu
WorkingDirectory = /var/www/project\_name
ExecStart = /var/www/project\_name/env/bin/gunicorn --access-logfile - --workers 3 project\_name.wsgi

\[Install\]
WantedBy = multi-user.target

然後就可以通過 systemctl start|stop|enable gunicorn 來搞定啦,Yey!

準備 Django 文件 #

由於 Django 默認 Static 文件是丟的到處都是的,且 Django 的設計理念就是不讓 Django (而是 Nginx)來輸出靜態文件,所以我們需要把所有的靜態文件丟到一個地方之後讓 Nginx 來搞定,我們先指定 Static 文件放在哪兒,於我的話,我打算放在 project_name/static/ 目錄下,所以在 settings.py 中有如下寫法:

\# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC\_URL = '/static/'

PROJECT\_ROOT = os.path.dirname(os.path.abspath(\_\_file\_\_))
STATIC\_ROOT = os.path.join(PROJECT\_ROOT, 'static')

然後讓 Django 把靜態文件移動一下,指令如下:

python manage.py collectstatic

反向代理 #

之後 Nginx 反向代理,需要注意的是,如果沒有 proxy_set_header X-Forwarded-Proto $scheme; 的話,會出現 CSRF 的問題(當然前提是你先保證自己的 form 底下真的有 CSRF Token)。

2020-09-02 更新,出現 CSRF 的問題一般是沒有設置 Trusted Domain 導致的,可以在對應的 settings.py 下加入:

CSRF\_TRUSTED\_ORIGINS = \['project\_name.nova.moe'\]

即可解決 CSRF 的問題,另附上 Nginx 的配置樣例。

server {
        listen 80;
        server\_name project\_name.nova.moe;
        location / {
                proxy\_set\_header X-Forwarded-Proto $scheme;
                proxy\_pass http://127.0.0.1:8000;
        }
            location /static/ {
                root /var/project\_name/project\_name;
            }
}