一、前期準(zhǔn)備工作
1、版本
- Ubuntu 18
- python 3.6.5
- Django 1.11.12
- Nginx 1.14.0
- Gunicorn 19.9.0
- gevent 1.4.0
2、安裝(服務(wù)器)
- nginx
sudo apt install nginx
- 安裝python3(已經(jīng)安裝請忽略)
# ubuntu 18 自帶的就是3.6.5 其它Ubuntu版本的請使用命令安裝 sudo apt update sudo apt install python3.6
- 安裝pip(已經(jīng)安裝請忽略)
sudo apt-get install python3-pip
- 安裝虛擬環(huán)境
sudo pip install virtualenv
二、Django項(xiàng)目
1、修改相關(guān)配置
-
關(guān)閉debug,修改hosts
image -
修改數(shù)據(jù)連接, 例如下圖所示
image - 將靜態(tài)文件打包
image
使用命令collectstatic
image
收集完成之后如下圖所示
image - 導(dǎo)出項(xiàng)目所依賴的庫到項(xiàng)目根目錄
pip freeze > requirements.txt
- 注意
一定要確保你的項(xiàng)目在本地運(yùn)行沒有問題,否則在服務(wù)器終端下出了問題對于新手來說不好解決
2、項(xiàng)目上傳
- 注意
最好將本地項(xiàng)目復(fù)制一份,然后將項(xiàng)目下的虛擬環(huán)境刪除 - 在windows下可以使用圖形化界面工具WinScp或者Xshel
scp -r 本地項(xiàng)目根目錄絕對路徑 服務(wù)器用戶名@服務(wù)器ip地址:上傳服務(wù)器的目錄
- linux或者mac使用命令
scp -r 本地項(xiàng)目根目錄絕對路徑 服務(wù)器用戶名@服務(wù)器ip地址:上傳服務(wù)器的目錄
scp /home/xxx/work/PycharmProjects/DjangoDeployExample test@192.168.0.112:/home/www/django
3、連接遠(yuǎn)程服務(wù)器創(chuàng)建虛擬環(huán)境
- 說明
由于python兼容性的問題,不建議在全局環(huán)境中部署,而且一個(gè)服務(wù)器有可能部署多個(gè)項(xiàng)目,所以推薦在虛擬環(huán)境中部署 - 連接遠(yuǎn)程服務(wù)器
ssh 用戶名@IP地址 -p 端口號(默認(rèn)80)
- 安裝虛擬環(huán)境
sudo pip install virtualenv
- 創(chuàng)建虛擬環(huán)境
# 1.在項(xiàng)目的根目錄(建議),也可以在其他地方均可 cd /home/www/django # 創(chuàng)建虛擬環(huán)境,名字隨意 virtualenv venv
- 激活虛擬環(huán)境
source .venv//bin/activate
image
4、導(dǎo)入虛擬環(huán)境
- 使用pip
pip install -r requirement.txt
三、Gunicorn
1、安裝
- 在項(xiàng)目的虛擬環(huán)境安裝gunicorn
# 如果下載速度過慢使用國內(nèi)源 pip3 install gunicorn -i https://pypi.douban.com/simple
- 在項(xiàng)目的虛擬環(huán)境中安裝gevent
# 基于協(xié)程的庫,提高并發(fā)量 pip3 install gevent -i https://pypi.douban.com/simple
2、通過Gunicorn啟動(dòng)項(xiàng)目
2.1、命令啟動(dòng)(不推薦)
- 命令
# 常見的參數(shù) gunicorn -w 10 -k 'gevent' -b 0.0.0.0:9000 DjangoDeployExample.wsgi:application --reload -t 500 -D --access-logfile logs/gunicorn.log
- 參數(shù)說明
參數(shù) 說明 備注 -w 10 開啟10個(gè)進(jìn)程 根據(jù)服務(wù)器配置來定 -k 'gevent' 使用gevent異步模式,提高了響應(yīng)速度。 必須先安裝好gevent -b 0.0.0.0:9000 表示綁定ip地址和端口 DjangoDeployExample.wsgi:application settings.py文件同級目錄的wsgi.py中 這里使用的是相對路徑 -–reload 監(jiān)聽到項(xiàng)目文件變動(dòng)自動(dòng)重啟gunicorn 生效 -D 讓命令后臺執(zhí)行 如果想看命令錯(cuò)誤可不要 -t 500 配置每個(gè)請求的超時(shí)時(shí)間為500秒 –access-logfile logs/gunicorn.log 將請求日志保存到該文件中 logs目錄必須創(chuàng)建 -
示例圖
image
image - 備注
詳細(xì)參數(shù),請看其他附錄
2.2、通過配置文件啟動(dòng)(常用)
- 創(chuàng)建gunicorn.conf文件
# 并行工作進(jìn)程數(shù) workers = 4 # 指定每個(gè)進(jìn)程的線程數(shù) threads = 2 # 監(jiān)聽內(nèi)網(wǎng)端口8000 bind = '192.168.58.44:8000' # 設(shè)置守護(hù)進(jìn)程(linux有效) daemon = 'true' # 工作模式協(xié)程 worker_class = 'gevent' # 設(shè)置最大并發(fā)量 worker_connections = 2000 # 設(shè)置進(jìn)程文件目錄 pidfile = '/home/xxx/work/DjangoDeployExample/product/gunicorn//gunicorn.pid' # 設(shè)置訪問日志和錯(cuò)誤信息日志路徑 accesslog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_acess.log' errorlog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_error.log' # 設(shè)置日志記錄水平 loglevel = 'error'
- 啟動(dòng)
gunicorn -c gunicorn.conf DjangoDeployExample.wsgi:application
- 注意
- 注意用戶權(quán)限問題,比如pid文件 訪問日志 errorlog 如果權(quán)限不夠可以給目錄授權(quán)一下
四、nginx
1、說明
本教程是通過命令安裝,一般默認(rèn)安裝在
/etc/nginx/
,下載安裝包的安裝的可以根據(jù)自己的目錄來配置,具體的一些細(xì)節(jié)這里不介紹,具體請自行查詢注意:在系統(tǒng)的命令窗口中使用,上面都是在虛擬環(huán)境下使用
2、命令介紹
- 查看nginx是否啟動(dòng)
ps aux|grep nginx
image - 檢查nginx配置文件是否有錯(cuò):
# -t 測試 nginx的配置文件 sudo nginx -t xxx/xxx/nginx.conf
- 通過配置文件啟動(dòng)
sudo nginx -c xxx/xxx/nginx.conf
- 關(guān)閉nginx
nginx -s stop # 其它方式 sudo pkill -9 nginx
3、反向代理
- nginx.conf配置文件
不建議直接修改nginx的配置文件,最好復(fù)制一份通過指定配置文件啟動(dòng)# 用戶 用戶名 用戶組 user zhangwei zhangwei; #設(shè)置值和CPU核心數(shù)一致 worker_processes auto; # 全局錯(cuò)誤日志 (注意權(quán)限) error_log /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/error.log; # pid文件所在目錄 (注意權(quán)限) pid /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx//nginx.pid; # events塊配置 events { # 事件驅(qū)動(dòng)模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport use epoll; # 單個(gè)work進(jìn)程允許的最大連接數(shù),默認(rèn)為512 worker_connections 65535; } # http塊配置 http { # 文件擴(kuò)展名與文件類型映射表。設(shè)定mime類型(郵件支持類型),類型由mime.types文件定義 # include /etc/nginx/mime.types; #默認(rèn)文件類型,默認(rèn)為text/plain default_type application/octet-stream; # http模塊的的訪問日志 access_log /home/zhangwei/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/access.log; # #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。 #(sendfile系統(tǒng)調(diào)用不需要將數(shù)據(jù)拷貝或者映射到應(yīng)用程序地址空間中去) sendfile on; # 連接超時(shí)時(shí)間,默認(rèn)為75s,可以在http,server,location塊 keepalive_timeout 65; server { listen 80; # 有域名的話綁定域名,沒域名寫ip地址 server_name www.hello.com; # 全局錯(cuò)誤的界面 error_page 404 /404.html; # 反向代理的路徑(和upstream綁定),location后面設(shè)置映射的路徑 location / { # 注意代理的ip地址一定要和gunicorn里的端口一致 proxy_pass http://192.168.58.44:8000; proxy_pass_header Authorization; proxy_pass_header WWW-Authenticate; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 處理靜態(tài)文件 location /static { alias /home/xxx/work/PycharmProjects/DjangoDeployExample/static; # 過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點(diǎn), # 如果頻繁更新,則可以設(shè)置得小一點(diǎn)。 expires 30d; } # 多媒體資源等文件 路徑 location /media { alias /home/xxx/work/PycharmProjects/DjangoDeployExample/media/; # 過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點(diǎn), # 如果頻繁更新,則可以設(shè)置得小一點(diǎn)。 expires 30d; } } }
- 本案例直接將nginx放在工程下
sudo nginx -c xxx/xxx/nginx.conf
- 注意
- 一定要注意文件的權(quán)限問題日志 pid文件的權(quán)限問題
- 代理的ip地址一定要和gunicorn里的端口一致
- mime.types注意引入的路徑,因?yàn)椴皇切薷哪J(rèn)的nginx配置文件
五、附錄
1、gunicorn詳細(xì)參數(shù)
命令 | 簡寫 | 參數(shù)類型 | 說明 |
---|---|---|---|
--config | -c | 字符串 | 配置文件路徑,路徑形式的字符串格式 |
--bind | -b | ip地址 | 綁定服務(wù)器套接字 |
--workers | -w | 整型 | 用于處理工作進(jìn)程的數(shù)量,為正整數(shù),默認(rèn)為1。worker 推薦的數(shù)量為當(dāng)前的CPU個(gè)數(shù)*2 + 1 |
--backlog | 整型 | 等待服務(wù)的客戶的數(shù)量, 必須是正整數(shù),一般設(shè)定在64~2048的范圍內(nèi) | |
--worker-class | -k | 字符串 | 要使用的工作模式,默認(rèn)為sync 可選值 gevent tornado |
--threads | 整型 | 處理請求的工作線程數(shù),使用指定數(shù)量的線程運(yùn)行每個(gè)worker。為正整數(shù),默認(rèn)為1 | |
--worker-connections | 整型 | 最大客戶端并發(fā)數(shù)量,默認(rèn)情況下這個(gè)值為1000 | |
max_requests | 整型 | 超過這么多秒后工作將被殺掉,并重新啟動(dòng)。一般設(shè)定為30秒 | |
--timeout | -t | 整型 | |
--keep-alive | 整型 | `連接上等待請求的秒數(shù),默認(rèn)情況下值為2。一般設(shè)定在1~5秒之間 | |
--limit-request-line | 整型 | HTTP請求行的最大大小,此參數(shù)用于限制HTTP請求行的允許大小,默認(rèn)情況下,這個(gè)值為4094。值是0~8190的數(shù)字。此參數(shù)可以防止任何DDOS攻擊 | |
--limit-request-fields | 整型 | 限制HTTP請求中請求頭字段的數(shù)量。此字段用于限制請求頭字段的數(shù)量以防止DDOS攻擊,與limit-request-field-size 一起使用可以提高安全性。默認(rèn)情況下,這個(gè)值為100,這個(gè)值不能超過32768 |
|
--limit-request-field-size | 整型 | 限制HTTP請求中請求頭的大小,默認(rèn)情況下這個(gè)值為8190。值是一個(gè)整數(shù)或者0,當(dāng)該值為0時(shí),表示將對請求頭大小不做限制 | |
--reload | 無 | 代碼更新時(shí)將重啟工作,默認(rèn)為False。此設(shè)置用于開發(fā),每當(dāng)應(yīng)用程序發(fā)生更改時(shí),都會(huì)導(dǎo)致工作重新啟動(dòng)。 | |
--check-config | 布爾 | 顯示配置文件信息 | |
--chdir | 路徑 | 切換到指定的工作目錄 | |
--daemon | -D, | 布爾 | 守護(hù)Gunicorn進(jìn)程,默認(rèn)False |
-pid | -p | 文件 | 設(shè)置pid文件的文件名,如果不設(shè)置將不會(huì)創(chuàng)建pid文件 |
--worker-tmp-dir DIR | 路徑 | 設(shè)置工作臨時(shí)文件目錄,如果不設(shè)置會(huì)采用默認(rèn)值 | |
--access-logfile | 文件 | 要寫入的訪問日志目錄 | |
--error-logfile | 文件 | 要寫入錯(cuò)誤日志的文件目錄 | |
--log-file | 文件 | 要寫入日志的文件目錄 |