Ubuntu 上使用 Nginx + Gunicorn 部署 Django 項(xiàng)目

我的 Django 博客項(xiàng)目是部署在阿里云 ECS 服務(wù)器上面的,服務(wù)器的系統(tǒng)是64位的 Ubuntu 16.04 系統(tǒng),部署的方式是使用 Nginx + Gunicorn 實(shí)現(xiàn),數(shù)據(jù)使用的是 MySQL。部署其實(shí)是一個(gè)大坑,我在部署的過(guò)程中也是踩過(guò)很多坑,所以這篇文章就來(lái)介紹一下我的項(xiàng)目的完整部署過(guò)程,希望看到的人能少走彎路。

項(xiàng)目準(zhǔn)備

首先需要把自己本地的項(xiàng)目放到服務(wù)器上面來(lái),我使用的是 Github 克隆項(xiàng)目,這種從代碼庫(kù)克隆的方式是比較推薦的,因?yàn)榭梢猿掷m(xù)的使用 pull 來(lái)讓服務(wù)器上面的項(xiàng)目保持跟代碼倉(cāng)庫(kù)中同步。Github 的安裝、配置和使用這里省略,如果需要請(qǐng)自行去查閱相關(guān)資料完成操作。

從 Github 上克隆項(xiàng)目

選擇一個(gè)放置項(xiàng)目的文件夾,比如我把項(xiàng)目統(tǒng)一放在了自己的一個(gè)用戶(hù)的根目錄下面,這個(gè)目錄的路徑是 /home/alex

于是可以切換到當(dāng)前用戶(hù)的目錄下克隆項(xiàng)目:

~$ git clone git@github.com:Hopetree/izone.git tendcode

上面這句 git 的命令是意思是將 izone.git 這個(gè)項(xiàng)目克隆到本地并命名為 tendcode,當(dāng)然,項(xiàng)目的名稱(chēng)你可以按照自己的喜歡去命名。

創(chuàng)建一個(gè)虛擬環(huán)境

項(xiàng)目移植成功了,我們還需要來(lái)移植一個(gè)單獨(dú)給項(xiàng)目使用的環(huán)境,所以需要使用虛擬環(huán)境。虛擬環(huán)境的安裝和配置操作方式這里也不做說(shuō)明,這里只介紹創(chuàng)建虛擬環(huán)境的過(guò)程。

我雖然在本地的 Windows 上面一直使用的 virtualenvwrapper 來(lái)操作虛擬環(huán)境,但是在服務(wù)器上面還是比較喜歡直接使用 virtualenv,這里就來(lái)以這種創(chuàng)建虛擬環(huán)境的方式說(shuō)明。

在當(dāng)前用戶(hù)根目錄(跟剛才克隆項(xiàng)目同目錄)下創(chuàng)建一個(gè)虛擬環(huán)境 izone_env,使用如下命令:

~$ virtualenv izone_env

此時(shí)當(dāng)前目錄的結(jié)構(gòu)是這樣的:

/home/alex/tendcode
/home/alex/izone_env

復(fù)制虛擬環(huán)境

虛擬環(huán)境雖然已經(jīng)創(chuàng)建,但是環(huán)境中還沒(méi)有安裝項(xiàng)目的依賴(lài),所以現(xiàn)在要根據(jù)項(xiàng)目的依賴(lài)文件去安裝依賴(lài)。

首先在當(dāng)前用戶(hù)目錄下使用如下命令進(jìn)入虛擬環(huán)境:

~$ source izone_env/bin/activate

然后將當(dāng)前目錄切換到你的項(xiàng)目的依賴(lài)文件 requirements.txt 的目錄下,比如我的項(xiàng)目的依賴(lài)文件就在項(xiàng)目的一級(jí)目錄下面,比如它的地址是這樣的:

/home/alex/tendcode/requirements.txt

那么此時(shí)應(yīng)該切換到這樣:

(izone_env) ~$ cd tendcode

然后使用如下命令安裝依賴(lài):

(izone_env) ~$ pip install -r requirements.txt

此時(shí),項(xiàng)目的基本運(yùn)行條件已經(jīng)準(zhǔn)備好了,下面開(kāi)始運(yùn)行項(xiàng)目。

項(xiàng)目運(yùn)行

在部署項(xiàng)目之前,先要保證項(xiàng)目在服務(wù)器上面能夠正常運(yùn)行,這是最起碼的條件。

補(bǔ)充項(xiàng)目缺少的文件

這一步驟并不是一定需要的,這取決于你的項(xiàng)目。由于我的項(xiàng)目上傳到 Github 上之前有忽略掉一個(gè)個(gè)人信息項(xiàng)目的配置文件,所以需要在克隆項(xiàng)目之后在服務(wù)器自行創(chuàng)建一份。比如我的博客項(xiàng)目中需要單獨(dú)創(chuàng)建的是跟 settings.py 同級(jí)目錄下面的一個(gè) base_settings.py 文件,文件的具體內(nèi)容可以查看我 Github 項(xiàng)目中的說(shuō)明。如果你的項(xiàng)目不需要補(bǔ)充文件,可以跳過(guò)這一步。

創(chuàng)建數(shù)據(jù)庫(kù)

如果項(xiàng)目同樣適用的是 MySQL 數(shù)據(jù)庫(kù)的話,在項(xiàng)目運(yùn)行之前需要先創(chuàng)建數(shù)據(jù)庫(kù),比如我的項(xiàng)目中指定了數(shù)據(jù)庫(kù)的基本信息,我創(chuàng)建數(shù)據(jù)庫(kù)(進(jìn)入mysql命令行下)的命令如下:

mysql > CREATE DATABASE `tendcode` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

這句命令的意思是創(chuàng)建一個(gè)名稱(chēng)為 tendcode 的數(shù)據(jù)庫(kù),并且將數(shù)據(jù)庫(kù)的編碼設(shè)定為 utf8mb4,這個(gè)按照自己的項(xiàng)目需求去創(chuàng)建即可。

遷移數(shù)據(jù)庫(kù)

現(xiàn)在可以按照 Django 項(xiàng)目的數(shù)據(jù)庫(kù)遷移步驟來(lái)操作了,當(dāng)然,下面的操作都是在虛擬環(huán)境中進(jìn)行的。

1、創(chuàng)建數(shù)據(jù)遷移,命令如下:

(izone_env) ~/tendcode$ python manage.py makemigrations
(izone_env) ~/tendcode$ python manage.py migrate

2、創(chuàng)建管理員賬號(hào):

(izone_env) ~/tendcode$ python manage.py createsuperuser

3、靜態(tài)文件的收集:

(izone_env) ~/tendcode$ python manage.py collectstatic

啟動(dòng)項(xiàng)目

(izone_env) ~/tendcode$ python manage.py runserver 0.0.0.1:8000

如果你的服務(wù)器上面的8000端口開(kāi)啟了,那么可以訪問(wèn)你的服務(wù)器 IP 地址的8000端口看看項(xiàng)目是否正常運(yùn)行:

http://server_domain_or_IP:8000

到這里順便說(shuō)一下,由于我的項(xiàng)目是有域名的,所以在項(xiàng)目中要先添加自己的域名,就像這樣:

ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '.tendcode.com']

開(kāi)始部署

安裝和配置 Gunicorn

1、首先需要在虛擬環(huán)境中安裝 Gunicorn:

(izone_env) ~/tendcode$ pip install gunicorn

2、創(chuàng)建項(xiàng)目的 Gunicorn 配置文件(退出虛擬環(huán)境):

~$ sudo vim /etc/systemd/system/gunicorn_tendcode.service

3、配置信息如下:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=alex
Group=www-data
WorkingDirectory=/home/alex/tendcode
ExecStart=/home/alex/izone_env/bin/gunicorn --access-logfile - --workers 2 --bind unix:/home/alex/tendcode/tendcode.sock izone.wsgi:application

[Install]
WantedBy=multi-user.target

上面的配置信息中需要根據(jù)自己的項(xiàng)目改的有以下幾個(gè)地方:

  • User 填寫(xiě)自己當(dāng)前用戶(hù)名稱(chēng)
  • WorkingDirectory 填寫(xiě)項(xiàng)目的地址
  • ExecStart 中第一個(gè)地址是虛擬環(huán)境中 gunicorn 的目錄,所以只需要改前半部分虛擬環(huán)境的地址即可
  • workers 2 這里是表示2個(gè)進(jìn)程,可以自己改
  • unix 這里的地址是生成一個(gè) sock 文件的地址,直接寫(xiě)在項(xiàng)目的根目錄即可
  • izone.wsgi 表示的是項(xiàng)目中 wsgi.py 的地址,我的項(xiàng)目中就是在 izone 文件夾下的

啟動(dòng)配置文件

文件配置完成之后,使用下面的命令啟動(dòng)服務(wù):

~$ sudo systemctl start gunicorn_tendcode
~$ sudo systemctl enable gunicorn_tendcode

查看服務(wù)的狀態(tài)可以使用命令:

~$ sudo systemctl status gunicorn_tendcode

上面的命令啟動(dòng)沒(méi)有問(wèn)題可以看看自己的項(xiàng)目的跟目錄下面,應(yīng)該會(huì)多一個(gè) tendcod.sock 文件的。

后續(xù)如果對(duì) gunicorn 配置文件做了修改,那么應(yīng)該先使用這個(gè)命令之后重啟:

~$ sudo systemctl daemon-reload

然后再使用重啟命令:

~$ sudo systemctl restart gunicorn_tendcode

配置 Nginx

首先創(chuàng)建一個(gè) Nginx 配置文件,不要使用默認(rèn)的那個(gè):

~$ sudo nano /etc/nginx/sites-available/mynginx

配置信息如下:

server {
    # 端口和域名
    listen 80;
    server_name www.tendcode.com;
    
    # 日志
    access_log /home/alex/tendcode/logs/nginx.access.log;
    error_log /home/alex/tendcode/logs/nginx.error.log;

    # 不記錄訪問(wèn)不到 favicon.ico 的報(bào)錯(cuò)日志
    location = /favicon.ico { access_log off; log_not_found off; }
    # static 和 media 的地址
    location /static/ {
        root /home/alex/tendcode;
    }
    location /media/ {
        root /home/alex/tendcode;
    }
    # gunicorn 中生成的文件的地址
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/alex/tendcode/tendcode.sock;
    }
}

server {
    listen 80;
    server_name tendcode.com;
    rewrite ^(.*) http://www.tendcode.com$1 permanent;
}

第一個(gè) server 是主要的配置,第二 server 是實(shí)現(xiàn)301跳轉(zhuǎn),即讓不帶 www 的域名跳轉(zhuǎn)到帶有 www 的域名上面。

連接 Nginx 配置

上面的配置檢查好之后,使用下面的命令來(lái)將這個(gè)配置跟 Nginx 建立連接,使用命令:

~$ sudo ln -s /etc/nginx/sites-available/mynginx /etc/nginx/sites-enabled

運(yùn)行完畢之后可以查看一下 Nginx 的運(yùn)營(yíng)情況,看看會(huì)不會(huì)報(bào)錯(cuò):

~$ sudo nginx -t

如果上面這句沒(méi)有報(bào)錯(cuò),那么恭喜你,你的配置文件沒(méi)有問(wèn)題,可以繼續(xù)下一步,如果報(bào)錯(cuò)了,需要按照?qǐng)?bào)錯(cuò)的信息去更改配置文件中對(duì)應(yīng)行的代碼,好好檢查一下吧!

沒(méi)報(bào)錯(cuò)的話,重啟一下 Nginx:

~$ sudo systemctl restart nginx

好了,重啟 Nginx 之后可以登錄自己配置的域名,看看自己的項(xiàng)目是不是已經(jīng)成功的運(yùn)行了呢!

后續(xù)維護(hù)

之后的項(xiàng)目維護(hù)中,如果更改了 gunicorn 的配置文件,那么需要依次執(zhí)行下面兩條語(yǔ)句去重啟服務(wù),如果只是修改了 Django 項(xiàng)目的內(nèi)容,只需要單獨(dú)執(zhí)行第二條重啟命令即可:

~$ sudo systemctl daemon-reload
~$ sudo systemctl restart gunicorn_tendcode

如果修改了 Nginx 的配置文件,那么需要依次執(zhí)行下面兩條語(yǔ)句去重啟服務(wù):

~$ sudo nginx -t
~$ sudo systemctl restart nginx

以上就是我的項(xiàng)目部署的全部過(guò)程,希望看到這篇文章的人如果想要使用同樣的方式部署 Django 項(xiàng)目的話,可以參考一下,有問(wèn)題也可以指出。

文章原文:http://www.tendcode.com/article/set-up-django-with-nginx-and-gunicorn/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容