當我們在用django開發的web項目時,開發測試過程中用到的是django自帶的測試服務器,由於其安全及穩定等性能方面的局限性,django官方並不建議將測試服務器用在實際生產。
nginx+uwsgi+django是我們常用的django部署方式。nginx作為最前端的服務器,他負責接收所有的客戶端請求,對於請求的靜態文件,由nginx服務器自己完成,因為它具有很好處理靜態文件的能力,性能進行過優化,支持高並發量;uWSGI服務器作為支持服務器,是用來服務nginx的,nginx將請求的動態文件交給uWSGI進行處理。uWSGI實現了uwsgi、wsgi和http協議,uwsgi協議是uWSGI自定義的協議,定義的是框架(django)和服務器對接的接口。
下面以阿里雲ubuntu部署為例:
一、 安裝python虛擬環境及項目所需python包:
1.安裝virtualenv和virtualenvwrapper
pip install virtualenv
pip install virtualenvwrapper
2.創建虛擬環境
命令: mkvirtualenv [env_name]
$: mkvirtualenv -p python3 django_env_py3 (可指定用python3)
虛擬環境相關命令: workon 進入虛擬環境 deactivate 退出虛擬環境 rmvirtualenv 刪除虛擬環境
3. 安裝項目所需python包:
按包名單個安裝: $: pip install 包名
批量安裝:
$: pip freeze > env_requirement.txt
$: pip install -r renv_requirement.txt
二、uWSGI服務器部署:
已經安裝好uwsgi后(pip install uwsgi),只需要增加配置, 告訴uWSGI-server的框架入口函數在哪,就能讓django和uWSGI服務器對接上。
1. 在django項目的setting.py文件的同級目錄下,增加一個配置文件 uwsgi.ini
2. 對配置文件進行配置
[uwsgi]
# 配置服務器的監聽ip和端口,讓uWSGI作為nginx的支持服務器的話,設置socke就行;如果要讓uWSGI作為單獨的web-server,用http
# http = 127.0.0.1:3309
socket = 127.0.0.1:3309
# 配置項目目錄(此處設置為項目的根目錄)
chdir = /home/python/Desktop/my_pro
# 配置入口模塊 (django的入口函數的模塊,即setting同級目錄下的wsgi.py)
wsgi-file = my_pro/wsgi.py
# 開啟master, 將會多開一個管理進程, 管理其他服務進程
master = True
# 服務器開啟的進程數量
processes = 2
# 以守護進程方式提供服, 輸出信息將會打印到log中
daemonize = wsgi.log
# 服務器進程開啟的線程數量
threads = 4
# 退出的時候清空環境變量
vacuum = true
# 進程pid
pidfile = uwsgi.pid
# 配uWSGI搜索靜態文件目錄(及django項目下我們存放static文件的目錄,用uWSGI作為單獨服務器時才需要設置,此時我們是用nginx處理靜態文件)
# check-static = /home/python/Desktop/ttsx
3. 啟動uWSGI服務器
在配置文件uwsgi.ini所在目錄下,用我們剛才配置好的配置文件啟動uWSGI:
$: uwsgi --ini uwsgi.ini
三、nginx服務器部署:
uWSGI服務器已經部署好了,我們只需要安裝並啟動nginx,然后將nginx服務器的動態文件請求轉發給uWSGI服務器,將靜態文件請求交給自己來處理。
1. 安裝nginx:
需下載准備好nginx的包文件, 以及nginx安裝依賴庫的包文件OPENSSL:
a. 首先安裝nginx所依賴的庫: PCRE
$: sudo apt-get install libpcre3 libpcre3-dev
b. 安裝OPENSSL庫,下載地址https://www.openssl.org/source/
下載將其解壓文件放到/usr/local/lib/openssl-1.0.2l目錄下
$: /usr/local/lib/openssl-1.0.2l
c. 在這里我們使用編譯的安裝nginx,指定將nginx的安裝到/ust/opt/目錄下。
解壓包文件,進入nginx包文件目錄:
配置:
$: ./configure --prefix=/opt/nginx --with-openssl=/usr/local/lib/openssl-1.0.21
(--prefix指定nginx的安裝目錄, --with-openssl指定我們要使用的openssl版本,也就是我們剛才安裝的路徑)
編譯: $: make
安裝: $: make install
d. 啟動nginx:
$: cd /opt/nginx/sbin/
$: ./nginx
相關命令:./nginx -s stop 強制停止 ./nginx -s quit 處理完當前所有連接后停止
./nginx -s reload 重新加載配置文件進行重啟 查看進程: ps -ajx | grep nginx
2. 配置nginx:
1. 修改nginx的配置文件
$: vim /opt/nginx/conf/nginx.conf
修改其收到請求處理的兩條配置:
location /
{
include uwsgi_params; # 設置將所有請求轉發給uwsgi服務器處理
uwsgi_pass: 127.0.0.1:3309; # 指定uwsgi服務器url
}
location /static
{
alias /hom/xxx/xxx/pro_name/static/; # 設置將/static的靜態請求交給nginx,並指定靜態文件的目錄
}
四、admin后台管理界面靜態文件配置:
以上,nginx+uWSGI+django已經可以正常運行了,但是登陸django的admin后台管理界面,網頁的靜態文件無法找到。
那是因為我們在前面設置nginx的靜態文件目錄時,static目錄下一般只是我們項目應用開發中自己的靜態文件,
但是django后台admin用到的靜態文件並不在這,所以找不到。所以我們需要把所有的靜態文件打包放在一個目錄下。
1. 在項目的根目錄下新建一個目錄,可以取名為all_static。
2. 在setting.py文件下增加一行配置,指定所有靜態文件的根目錄:
STATIC_ROOT = os.path.join(BASE_DIR, 'all_static')
3.執行django管理器命令,會自動將我們項目所有的靜態文件放到上面設置的靜態文件根目錄下:
./managy.pu collectstatic