文章將詳細(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)