9、ubuntu下使用uwsgi+nginx+supervisor部署django項(xiàng)目

文章將詳細(xì)介紹如何利用uwsgi、nginx和supervisor部署django項(xiàng)目到騰訊云的服務(wù)器,申請(qǐng)和安裝證書(shū),接著申請(qǐng)備案,最終實(shí)現(xiàn)網(wǎng)站的上線。

### 在開(kāi)發(fā)機(jī)上的準(zhǔn)備工作:

1、ssh安裝:https://blog.csdn.net/netwalk/article/details/12952051

2、filezilla安裝(linux下遠(yuǎn)程上傳文件到服務(wù)器等功能,類似于windows下的WinSCP工具):

下載鏈接:https://www.filezilla.cn/download/client

3. 用`pip3 freeze > requirements.txt`將當(dāng)前環(huán)境的包導(dǎo)出到`requirements.txt`文件中,方便在部署的時(shí)候安裝。

### 在服務(wù)器上的準(zhǔn)備工作:

1. 安裝`MySQL`服務(wù)器和客戶端:

? ? ```shell

? ? sudo apt install mysql-server mysql-client

? ? sudo apt-get install libmysqld-dev

? ? ```

參考我的另一篇文章:http://m.itdecent.cn/p/763941b72e9c

2. 進(jìn)入虛擬環(huán)境中,然后進(jìn)入到項(xiàng)目所在目錄,執(zhí)行命令:`pip install -r requirements.txt`,安裝好相應(yīng)的包。

3. 在`mysql`數(shù)據(jù)庫(kù)中,創(chuàng)建相應(yīng)的數(shù)據(jù)庫(kù),創(chuàng)建的數(shù)據(jù)庫(kù)名字和密碼等可參考setting.py文件中配置數(shù)據(jù)庫(kù)部分的代碼,如:

DATABASES = {

? ? 'default': {

? ? ? ? 'ENGINE': 'django.db.backends.mysql',

? ? ? ? 'NAME': 'your database', #數(shù)據(jù)庫(kù)名

? ? ? ? 'HOST': '127.0.0.1',

? ? ? ? 'PORT': '3306', # 端口

? ? ? ? 'USER': 'your username', # 數(shù)據(jù)庫(kù)用戶名

? ? ? ? 'PASSWORD': 'your password' # 密碼

? ? }

}

進(jìn)入數(shù)據(jù)庫(kù):

? ? ```shell

? ? mysql -u root -p yourpassword

? ? create database yourdatabase CHARACTER SET utf8 COLLATE utf8_general_ci;

? ? ```

參考:https://blog.csdn.net/sinat_39302317/article/details/81082801

4. 配置setting.py文件,設(shè)置`ALLOW_HOST`為你的域名,以及ip地址。

5. 設(shè)置`DEBUG=False`,避免如果網(wǎng)站產(chǎn)生錯(cuò)誤,而將錯(cuò)誤信息暴漏給用戶。

6. 執(zhí)行`python manage.py migrate`命令,將遷移文件,映射到數(shù)據(jù)庫(kù)中,創(chuàng)建相應(yīng)的表。如果在這一步出現(xiàn):

File "E:\Python37\lib\site-packages\django\db\backends\mysql\base.py", line 37, in <module>

raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

解決辦法:`sudo vim E:\Python37\lib\site-packages\django\db\backends\mysql\base.py`,在37行附近注釋掉這部分代碼:

raise Exception:

? ? mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__

7.收集靜態(tài)文件,終端執(zhí)行命令:`python manage.py collectstatic`。

8. 執(zhí)行`python manage.py runserver 0.0.0.0:8001 --insecure`,然后在你自己電腦上,在瀏覽器中輸入`http://你的服務(wù)器的ip地址:8001/`。

### 安裝uwsgi

1. 通過(guò)sudo apt install uwsgi`。(uwsgi必須安裝在系統(tǒng)級(jí)別的Python環(huán)境中,不能安裝到虛擬環(huán)境中)。

2. 使用命令`uwsgi --http :8000 --module asr_web.wsgi --vritualenv=[python環(huán)境的路徑]`。用`uwsgi`啟動(dòng)項(xiàng)目,如果能夠在瀏覽器中訪問(wèn)到這個(gè)頁(yè)面,說(shuō)明`uwsgi`可以加載項(xiàng)目了。但是這種方式加載項(xiàng)目很不友好,可以通過(guò)編寫(xiě)配置文件的方式啟動(dòng)項(xiàng)目,如下一步:

### 編寫(xiě)uwsgi配置文件:

在項(xiàng)目的路徑下面,創(chuàng)建一個(gè)文件叫做`asr_web_uwsgi.ini`的文件,然后填寫(xiě)以下代碼:

```shell

[uwsgi]

# Django相關(guān)的配置,必須全部為絕對(duì)路徑

# 項(xiàng)目的路徑

chdir = /home/ubuntu/asr_web

# Django的wsgi文件

module = asr_web.wsgi

# Python環(huán)境路徑

home = /usr/local/lib/python3.6

# 主進(jìn)程

master = true

# 最大數(shù)量的工作進(jìn)程

processes? ? ? = 10

# socket文件路徑,絕對(duì)路徑

socket? ? ? ? ? = /home/ubuntu/asr_web/asr_web.sock

# 設(shè)置socket的權(quán)限

chmod-socket? ? = 666

# 退出的時(shí)候是否清理環(huán)境

vacuum? ? ? ? ? = true

```

保存退出,然后使用命令`uwsgi --ini `asr_web_uwsgi.ini`。

### 安裝nginx:

1. nginx是一個(gè)web服務(wù)器。用來(lái)加載靜態(tài)文件和接收http請(qǐng)求的。通過(guò)命令`sudo apt install nginx`即可安裝。

2. `nginx`常用命令:

? ? * 啟動(dòng)nginx:sudo service nginx start

? ? * 關(guān)閉nginx:sudo service nginx stop

? ? * 重啟nginx:sudo service nginx restart

### 收集靜態(tài)文件:

靜態(tài)文件應(yīng)該讓nginx來(lái)服務(wù),而不是讓django來(lái)做。首先確保你的`settings.py`文件中有一個(gè)`STATIC_ROOT`配置,這個(gè)配置應(yīng)該指定你的靜態(tài)文件要放在哪個(gè)目錄下??梢詧?zhí)行以下命令:`python manage.py collectstatic`來(lái)收集所有靜態(tài)文件,將這些靜態(tài)文件放在指定的目錄下。

### 項(xiàng)目和nginx綁定,修改default配置文件:

1、修改default文件權(quán)限:sudo chmod 777? /etc/nginx/sites-enabled/default

2、編輯default文件,sudo vim /etc/nginx/sites-enabled/default

server {

? ? # 你的網(wǎng)站將會(huì)監(jiān)聽(tīng)的端口號(hào),如果監(jiān)聽(tīng)80端口,部署后訪問(wèn)localhost自動(dòng)跳轉(zhuǎn)到nginx默認(rèn)的歡迎界面

? ? listen? ? ? 80;

? ? # 綁定的域名

? ? server_name [服務(wù)器IP或者域名]; # substitute your machine's IP address or FQDN

? ? charset? ? utf-8;

? ? # 最大上傳速率

? ? client_max_body_size 75M;? # adjust to taste

? ? #設(shè)置長(zhǎng)連接

? ? keepalive_timeout? 70;

? ? #HSTS策略

? ? add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

? ? # Django media(設(shè)置成自己的路徑)

? ? location /media? {

? ? ? ? alias /home/ubuntu/asr_web/media;? # 您的Django項(xiàng)目的媒體文件——根據(jù)需要進(jìn)行修改

? ? }

? ? #Django 靜態(tài)文件路徑(設(shè)置成自己的路徑)

? ? location /static {

? ? ? ? alias /home/ubuntu/asr_web/static; # 您的Django項(xiàng)目的靜態(tài)文件——根據(jù)需要進(jìn)行修改

? ? }

? ? # 最后,將所有非媒體請(qǐng)求發(fā)送到Django服務(wù)器

? ? location / {

? ? ? ? include? ? /etc/nginx/uwsgi_params; # the uwsgi_params file you installed

? ? ? ? uwsgi_pass 服務(wù)器IP

? ? }

? ? #減少點(diǎn)擊劫持

? ? add_headerX-Frame-Options DENY;

? ? #禁止服務(wù)器自動(dòng)解析資源類型

? ? add_headerX-Content-Type-Options nosniff;

? ? #防XSS攻擊

? ? add_headerX-Xss-Protection1;

}

寫(xiě)完配置文件后,為了測(cè)試配置文件是否設(shè)置成功,運(yùn)行命令:`service nginx configtest`,如果不報(bào)錯(cuò),說(shuō)明成功。

每次修改完了配置文件,都要記得運(yùn)行`service nginx restart`。

###nginx配置騰訊云證書(shū)

1、證書(shū)下載解壓放到nginx安裝路徑下,這里我的路徑是:/etc/nginx/sites-enabled下

2、修改配置文件:Nginx 版本為 nginx/1.15.0 以上請(qǐng)使用 listen 443 ssl 代替 listen 443 和 ssl on,sudo vim /etc/nginx/sites-enabled/default,以下為配置內(nèi)容:

server {

? ? # 你的網(wǎng)站將會(huì)監(jiān)聽(tīng)的端口號(hào),如果監(jiān)聽(tīng)80端口,部署后訪問(wèn)localhost自動(dòng)跳轉(zhuǎn)到nginx默認(rèn)的歡迎界面

? ? # listen? ? ? 80;

? ? # 綁定的域名

? ? # server_name [服務(wù)器IP或者域名]; # substitute your machine's IP address or FQDN

? ? charset? ? utf-8;

? ? # 最大上傳速率

? ? client_max_body_size 75M;? # adjust to taste

? ? #設(shè)置長(zhǎng)連接

? ? keepalive_timeout? 70;

? ? #HSTS策略

? ? add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

? ? # Django media(設(shè)置成自己的路徑)

? ? location /media? {

? ? ? ? alias /home/ubuntu/asr_web/media;? # 您的Django項(xiàng)目的媒體文件——根據(jù)需要進(jìn)行修改

? ? }

? ? #Django 靜態(tài)文件路徑(設(shè)置成自己的路徑)

? ? location /static {

? ? ? ? alias /home/ubuntu/asr_web/static; # 您的Django項(xiàng)目的靜態(tài)文件——根據(jù)需要進(jìn)行修改

? ? }

? ? # 最后,將所有非媒體請(qǐng)求發(fā)送到Django服務(wù)器

? ? location / {

? ? ? ? include? ? /etc/nginx/uwsgi_params; # the uwsgi_params file you installed

? ? ? ? uwsgi_pass 127.0.0.1:8001 #django內(nèi)網(wǎng)服務(wù)器IP

? ? }

? ? #減少點(diǎn)擊劫持

? ? add_headerX-Frame-Options DENY;

? ? #禁止服務(wù)器自動(dòng)解析資源類型

? ? add_headerX-Content-Type-Options nosniff;

? ? #防XSS攻擊

? ? add_headerX-Xss-Protection1;

? ? #SSL 訪問(wèn)端口號(hào)為 443

? ? listen 443;

? ? ssl on;

? ? #填寫(xiě)綁定證書(shū)的域名

? ? server_name 你的域名;

? ? #證書(shū)文件名稱

? ? ssl_certificate www.domain.com_bundle.crt;

? ? #私鑰文件名稱

? ? ssl_certificate_key www.domain.com.key;

? ? ssl_session_timeout 5m;

? ? #請(qǐng)按照以下協(xié)議配置

? ? ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

? ? #請(qǐng)按照以下套件配置,配置加密套件,寫(xiě)法遵循 openssl 標(biāo)準(zhǔn)。

? ? ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

? ? ssl_prefer_server_ciphers on;

}

3、通過(guò)以下命令驗(yàn)證配置文件:nginx -t

如果出現(xiàn)successful字樣,說(shuō)明配置成功,否則請(qǐng)檢查配置文件的語(yǔ)法,路徑是否準(zhǔn)確。

4、重啟nginx服務(wù)器:sudo service nginx restart。

5、瀏覽器輸入 https://www.你的域名,進(jìn)行訪問(wèn)或者終端使用ping命令測(cè)試。在這時(shí)瀏覽器會(huì)提示需要工信部等部門(mén)進(jìn)行備案,可以參考騰訊云申請(qǐng)教程:https://cloud.tencent.com/product/ba,大概 需要20個(gè)工作日的審批。

參考官網(wǎng):https://cloud.tencent.com/document/product/400/35244

參考博客園:https://www.cnblogs.com/wu-chao/p/9114432.html

###最后是網(wǎng)站備案上線:參考騰訊云官網(wǎng):https://cloud.tencent.com/product/ba

### 使用supervisor配置:

讓supervisor管理uwsgi,可以在uwsgi發(fā)生意外的情況下,會(huì)自動(dòng)的重啟(按需配置)。

1. `supervisor`的安裝:在系統(tǒng)級(jí)別的python環(huán)境下`sudo apt install supervisor`。

2. 在項(xiàng)目的根目錄下創(chuàng)建一個(gè)文件叫做`asr_web_supervisor.conf`。內(nèi)容如下:

? ? ```python

? ? # supervisor的程序名字

? ? [program:mysite]

? ? # supervisor執(zhí)行的命令

? ? command=uwsgi --ini asr_web_uwsgi.ini

? ? # 項(xiàng)目的目錄

? ? directory = /home/ubuntu/asr_web

? ? # 開(kāi)始的時(shí)候等待多少秒

? ? startsecs=0

? ? # 停止的時(shí)候等待多少秒

? ? stopwaitsecs=0

? ? # 自動(dòng)開(kāi)始

? ? autostart=true

? ? # 程序掛了后自動(dòng)重啟

? ? autorestart=true

? ? # 輸出的log文件

? ? stdout_logfile=/srv/asr_web/log/supervisord.log

? ? # 輸出的錯(cuò)誤文件

? ? stderr_logfile=/srv/asr_web/log/supervisord.err

? ? [supervisord]

? ? # log的級(jí)別

? ? loglevel=info

? ? # 使用supervisorctl的配置

? ? [supervisorctl]

? ? # 使用supervisorctl登錄的地址和端口號(hào)

? ? serverurl = http://127.0.0.1:9001

? ? # 登錄supervisorctl的用戶名和密碼

? ? username = 用戶名

? ? password = 密碼

? ? [inet_http_server]

? ? # supervisor的服務(wù)器

? ? port = :9001

? ? # 用戶名和密碼

? ? username = 用戶名

? ? password = 密碼

? ? [rpcinterface:supervisor]

? ? supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

? ? ```

然后使用命令`supervisord -c asr_web_supervisor.conf運(yùn)行就可以了。

以后如果想要啟動(dòng)`uwsgi`,就可以通過(guò)命令`supervisorctl -c asr_web_supervisor.conf`進(jìn)入到管理控制臺(tái),然后可以執(zhí)行以下命令進(jìn)行管理:

? ? * status? ? ? ? ? ? ? ? # 查看狀態(tài)

? ? * start program_name? ? #啟動(dòng)程序

? ? * restart program_name? #重新啟動(dòng)程序

? ? * stop program_name? ? # 關(guān)閉程序

? ? * reload? ? ? ? ? ? ? ? # 重新加載配置文件

? ? * quit? ? ? ? ? ? ? ? ? # 退出控制臺(tái)

最后編輯于
?著作權(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)容