nginx+uwsgi+django環境部署

nginx+uwsgi+django環境部署

先簡單介紹下nginx、uwsgi、django分別是什麼,nginx是web伺服器擅長處理靜態請求,uwsgi也是一個web伺服器擅長處理動態請求,django是python的一個web框架,nginx+uwsgi+django是生產環境中常見的部署搭配,客戶端發起一個http請求後首先被nginx接收並分析請求,如果是動態請求nginx則通過socket把請求轉向uwsgi去處理,uwsgi處理結束後再返回給nginx,nginx再返回給客戶端,如果是靜態請求,nginx則自行處理並將處理結果直接返回個客戶端,這樣基本上完成了一個完整的請求過程。

首先確保伺服器上已經安裝好python、django等且已經建立了一個可執行的項目,如果這一步還沒有完成,請先自行去完成django的安裝已經項目建立,可通過 python manage.py runserver 命令來檢驗項目是否完整建成。本文中將以wechat為django項目名稱,目錄為 /usr/share/nginx/html/wechat,這個目錄是為網站二級域名配置的一個站點目錄,網站一級域名站點目錄為 /usr/share/nginx/html。

pip install uwsgi 安裝uwsgi,安裝成功後,使用 uwsgi --http :8000 --wsgi-file wechat/wsgi.py 來確認uwsgi是否能正常啟動web服務(注意wechat要換成自己的項目名稱,並確認文件位置正確),uwsgi支持通過 ini 等配置文件來啟動的,所以我們將使用配置文件來啟動uwsgi,項目目錄下新建一個目錄script(這個隨意自己,也可以不用,為了方便管理,只要確認文件位置正確就行),在新目錄script下新建 uwsgi.ini 配置文件,配置內容如下

# uwsig使用配置文件啟動

[uwsgi]

# 項目目錄

chdir=/usr/share/nginx/html/wechat/

# 指定項目的application

module=wechat.wsgi

# 指定sock的文件路徑

#socket=:8000

# 指定IP埠

http=:8000

# 啟用主進程

master=true

# 自動移除unix Socket和pid文件當服務停止的時候

vacuum=true

buffer-size=32768

這是主要的配置項,還有更多的配置,暫不考慮,這些足以能正常啟動uwsgi了,這裡需要注意的一點的是,前面提到過uwsgi也是一個web伺服器同樣能完成nginx的工作,在這裡nginx並不是必要的,但是為了生產環境的性能和服務穩定經常和nginx搭配使用,nginx和uwsgi使用socket來保持聯繫,因此如果想單獨使用uwsgi作為web伺服器或者測試uwsgi伺服器的話,上面配置項中的socket需要改為http,等配好了nginx,又必須要改回socket連接。現在使用 uwsgi --ini uwsgi.ini 來啟動uwsgi服務(注意配置文件的實際位置及當前目錄位置),正常的話uwsgi服務以及起來了,可以在瀏覽器中訪問測試,大家可以把配置項中的http改為socket來測試下,改成socket的話頁面就不能正常訪問了。

接下來配置nginx,nginx的安裝就不多說了,安裝成功後,找到nginx配置文件,一般在 /etc/nginx/ 或 /etc/nginx/conf.d/ 目錄下,由於我前面有提到過,我是在nginx下配置了兩個站點,配置項都在 /etc/nginx/conf.d/default.conf中,其他情況大家可以在nginx配置文件的同級目錄下新建一個你項目的nginx配置文件,比如新建一個wechat.conf,只要確保能被nginx正常載入就行,這裡的nginx配置文件比較簡單,

server {

listen 80;

server_name wechat.weatherfood.com;

root /usr/share/nginx/html/wechat;

include /etc/nginx/default.d/*.conf;

location / {

root /usr/share/nginx/html/wechat;

index index.php index.html index.htm;

uwsgi_pass 127.0.0.1:8000;

include /etc/nginx/uwsgi_params;

}

error_page 404 /404.html;

location = /40x.html {

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

重點是這兩個配置項,確認uwsgi_params文件位置正確就行,其中uwsgi_pass就是nginx與uwsgi保持聯繫的關鍵配置

uwsgi_pass 127.0.0.1:8000;

include /etc/nginx/uwsgi_params;

配置好nginx後,service nginx reload 重啟下nginx,同時確認uwsgi.ini中socket配置項是開啟而http配置項是關閉的,同時重啟下uwsgi服務,至此nginx、uwsgi、django的環境部署已經完成。

在以上整個過程中肯定會碰到各種問題,我自己也是折騰了一天才部署好,寫下這邊文章主要記錄下大致流程。

還有一個問題,uwsgi我們是通過配置文件來啟動的,雖然可以使用後台運行命令,這樣其實並不方便,能不能加入到系統服務裡面去呢,就像nginx那樣一個service就都可以搞定,在這裡我們使用 supervisor來管理uwsgi進程,需要注意的是目前 supervisor 不支持python3 ,安裝並配置好 supervisor後我們可以使用類似supervisorctl -c /etc/supervisord.conf start wechat 這樣的命令來管理uwsgi服務了,關於supervisor的具體配置並不複雜請自行去研究,但需要注意的是更改了supervisor配置後需要重啟才能生效。

這就是nginx+uwsgi+django環境部署的完整流程了,過程寫的比較粗糙,需要特別注意的地方基本都提到了,文中有不對的地方也請各位雅正,如果在部署的過程中有問題,也歡迎交流。

文章來源於公眾號 - 挨著我


推薦閱讀:

Nginx反向代理為什麼可以提高網站性能?
利用nginx fastcgi_cache及golang-lru解決介面瓶頸
為什麼考慮到溢出用減法來比較更好?
nginx提示錯誤 Access denied.?
如何配置nginx+uwsgi+django?

TAG:Nginx | Django框架 | uwsgi |