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