使用 Nginx 和 Gunicorn 部署 Django 部落格

Bgods發表於2019-10-19

原文:使用 Nginx 和 Gunicorn 部署 Django 部落格

1、部署前的專案配置

Django專案中會有一些CSS,JavaScript等靜態檔案,為了能夠方便地讓Nginx處理這些靜態檔案的請求,我們把專案中的全部靜態檔案收集到一個統一的目錄下,這個目錄通常位於Django專案的根目錄,並且命名為static。為了完成這些任務,需要在專案的配置檔案settings.py裡做一些必要的配置:

# 加入下面的配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT指明瞭靜態檔案的收集目錄,即專案根目錄(BASE_DIR)下的靜資料夾。

為了安全起見,在生產環境下需要關閉 DEBUG 。以及選項對話設定網求允許訪問的域名開啟的settings.py檔案,找到 DEBUG 狀語從句: ALLOWED_HOSTS 這兩個選項對話,將它們設定成如下的值:

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', 'bgods.cn']

2、設定伺服器目錄結構

  • 上傳專案程式碼之前,先設定一下伺服器的檔案結構:
/home/bg/
    sites/
        bgods.cn/
            env/
            mysite/

一臺伺服器可能部署多個網站,所有網站程式碼都放在sites /目錄下.bgods.cn /這個資料夾以網站的域名命名,便於區分.env /是python虛擬環境目錄.mysite /是Django部落格專案目錄。

注意:目錄名替換為你自己的域名,涉及以後到 bgods.cn的地方通常都要替換你自己的域名

  • 建立目錄
bg@localhost:~$ mkdir -p ~/sites/bgods.cn
bg@localhost:~$ mkdir -p ~/sites/bgods.cn/mysite
  • 建立虛擬環境
bg@localhost:~$ cd ~/sites/bgods.cn
bg@localhost:~/sites/bgods.cn$ virtualenv --python=python3.6 env
  • 上傳Django的專案程式碼到伺服器
    方法有多種,我這裡使用的是XFTP5上傳,方便簡單,不懂的自行百度

3、安裝專案依賴

在之前先啟用虛擬環境,安裝專案的全部依賴。

  • 啟用虛擬環境
bg@localhost:~/sites/bgods.cn$ source env/bin/activate
(env) bg@localhost:~/sites/bgods.cn$ cd mysite/
  • 進入專案路徑,並使用PIP安裝專案全部依賴
(env) bg@localhost:~/sites/bgods.cn/mysite$ pip3 install -r requirements.txt

關於以上命令,請檢視 requirements.txt

4、收集靜態檔案

虛擬環境下繼續執行python manage.py collectstatic命令收集靜態檔案到靜目錄下:

(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py collectstatic

5、生成資料庫

虛擬環境下繼續執行python manage.py migrate命令建立資料庫檔案:

(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py migrate
  • 建立超級使用者

虛擬環境下繼續執行python manage.py createsuperuser命令建立一個超級使用者,方便我們進入Django管理後臺。這和本地開發時是一樣的,具體請參照:在Django Admin後臺文章。

(env) bg@localhost:~/sites/bgods.cn/mysite$ python manage.py createsuperuser

接下來配置Nginx來處理使用者請求。先在伺服器的/ etc / nginx / sites-available /目錄下新建一個配置檔案,檔名設定為我的域名:

# /etc/nginx/sites-available/bgods.cn
server {
    charset utf-8;
    listen 80;
    server_name bgods.cn;
    location /static {
        alias /home/bg/sites/bgods.cn/mysite/static; 
    }
    location /media {
        alias /home/bg/sites/bgods.cn/mysite/media;
    }
    location / {
        proxy_set_header Host $host;
        proxy_pass http://unix:/tmp/bgods.cn.socket;
    }
}

我們在 /etc/nginx/sites-available/ 放置了配置檔案,接下來需要建立一個符號連結,把這個配置檔案加入到啟用的網站列表中去,被啟用網站的目錄在 /etc/nginx/sites-enabled/,你可以理解為從 sites-available/ 目錄下傳送了一個配置檔案的快捷方式到 sites-enabled/ 目錄。具體命令如下:

(env) bg@localhost:~/sites/bgods.cn/mysite$ sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/bgods.cn

Gunicorn 一般用來管理多個程式,有程式掛了Gunicorn 可以把它拉起來,防止伺服器長時間停止服務,還可以動態調整 worker 的數量,請求多的時候增加 worker 的數量,請求少的時候減少。

  • 在虛擬環境下,安裝 Gunicorn:
(env) bg@localhost:~/sites/bgods.cn/mysite$ pip3 install gunicorn
  • 在 settings.py 檔案中新增 gunicorn 應用
# /home/bg/sites/bgods.cn/mysite/mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'ckeditor',
    'ckeditor_uploader',
    'gunicorn', #新增 gunicorn 應用
]
  • 用 Gunicorn 啟動伺服器程式:
(env) bg@localhost:~/sites/bgods.cn/mysitel$ gunicorn --bind unix:/tmp/bgods.cn.socket mysite.wsgi:application

注意:mysite.wsgi:application這裡的mysite對應的是/home/bg/sites/bgods.cn/mysite/mysite,根據自己的修改,在瀏覽器輸入域名,可以看到訪問成功了!

現在 Gunicorn 是我們手工啟動的,萬一哪天伺服器崩潰重啟了又得重新手工啟動。為此我們寫一個自動啟動指令碼,這樣當伺服器重新啟動後,指令碼會幫我們重啟 Gunicorn。先按 Ctrl + c 停止剛才啟動的伺服器程式。

這裡以Ubuntu16.04為例:

1、建立指令碼

首先在/lib/systemd/system/目錄下,建立一個指令碼 bg.service(字尾是service)

# /lib/systemd/system/bg.service
[Unit]
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
# 你的使用者
User=bg
# 你的目錄
WorkingDirectory=/home/bg/sites/bgods.cn/mysite
# gunicorn啟動命令
ExecStart=/home/bg/sites/bgods.cn/env/bin/gunicorn --bind unix:/tmp/bgods.cn.socket mysite.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target

2、啟動指令碼

(env) bg@localhost:~/sites/bgods.cn/mysitel$ sudo systemctl start bg.service # 執行指令碼
(env) bg@localhost:~/sites/bgods.cn/mysitel$ sudo systemctl enable bg.service   # 設定開機自啟動指令碼

以後如果更新了程式碼,只要執行下面的命令重啟一下 Nginx 和 Gunicorn 就可以使新的程式碼生效了:

sudo systemctl restart bg.service nginx.service

3、systemctl常用命令

以下是systemctl的一些命令,以上面建立的bg.service為例(如果是普通使用者需要在前面加須藤再執行)

  • 重新載入服務檔案:systemctl daemon-reload
  • 啟動一個服務:systemctl start bg.service
  • 關閉一個服務:systemctl stop bg.service
  • 重啟一個服務:systemctl restart bg.service
  • 顯示一個服務的狀態:systemctl status bg.service
  • 在開機時啟用一個服務:systemctl enable bg.service
  • 在開機時禁用一個服務:systemctl disable bg.service
  • 檢視服務是否開機啟動:systemctl is-enabled bg.service
  • 檢視已啟動的服務列表:systemctl list-unit-files | grep enabled
  • 檢視啟動失敗的服務列表:systemctl --failed
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章