nginx+uwsgi部署Django

本文用來記錄Django部署的一些筆記,文中描述的系統環境爲Ubuntu,採用的服務器爲nginx以及用uwsgi來鏈接Django,這也是目前Django比較主流的部署套餐。html

部署鏈接原理

  瀏覽器發起web請求<——>nginx接收請求<——>uwsgi處理請求<—–>django程序python

 

環境安裝

nginx

  安裝nginxlinux

sudo apt-get install nginx

 

  運行並查看狀態nginx

/etc/init.d/nginx start
/etc/init.d/nginx status

 

Uwsgi

  先安裝python-dev,不然uwsgi安裝可能會報錯web

apt-get install python-dev

 

  安裝uwsgi django

pip install uwsgi

  安裝完後添加環境變量: vim

    打開文件:sudo vim .bashrc,添加如下內容:瀏覽器

export PATH=/home/nmask/.local/bin/:$PATH

而後運行source .bashrc使之生效,就能夠在命令行直接運行uwsgibash

 

環境測試

測試nginx

/etc/init.d/nginx start


  測試uwsgi
打開http://localhost:80,能看到nginx說明nginx安裝成功。服務器

項目根目錄下建立test.py文件,寫入:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World」

 

項目根目錄下運行: 

uwsgi --http :8001 --wsgi-file test.py#表示運行test文件,8001端口


訪問http://localhost:8001,若是能看到hello world,說明uwsgi安裝成功。 

利用uwsgi運行django項目
uwsgi --http :8001 --chdir /home/nmask/mydjango --wsgi-file mydjango/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:8080

http : 協議類型和端口號經常使用選項:

  • processes : 開啓的進程數量
  • workers : 開啓的進程數量,等同於processes(官網的說法是spawn the specified number ofworkers / processes)
  • chdir : 指定運行目錄(chdir to specified directory before apps loading)
  • wsgi-file : 載入wsgi-file(load .wsgi file)
  • stats : 在指定的地址上,開啓狀態服務(enable the stats server on the specified address)
  • threads : 運行線程。因爲GIL的存在,我以爲這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads)
  • master : 容許主進程存在(enable master process)
  • daemonize : 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器(daemonize uWSGI)。實際上最經常使用的,仍是把運行記錄輸出到一個本地文件上。
  • pidfile : 指定pid文件的位置,記錄主進程的pid號。
  • vacuum : 當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)

以配置文件形式設置

myweb_uwsgi.ini

項目根目錄下建立:myweb_uwsgi.ini文件(名字能夠是任意的),寫入:

# myweb_uwsgi.ini file
[uwsgi]
 
# Django-related settings
 
socket = :8000#推薦將socket換成http
 
# the base directory (full path)
chdir = /home/nmask/mydjango
# Django s wsgi file
module = mydjango.wsgi
 
# process-related settings
# master
master = true
 
# maximum number of worker processes
processes = 4
 
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

利用uwsgi運行django:(與前面命令行的方式同樣,這樣爲了方便寫成了文件) 

uwsgi --ini myweb_uwsgi.ini

 

配置文件參數:

  • socket:指uwsgi運行的端口
  • Chdir:運行的目錄
  • Module:運行的文件

 

配置nginx

  打開/etc/nginx/nginx.conf,http內添加如下內容:

server {
listen 8890;
server_name 127.0.0.1#0.0.0.0爲任意IP都可訪問
charset UTF-8;
access_log /var/log/nginx/myweb_access.log;
error_log /var/log/nginx/myweb_error.log;
 
client_max_body_size 75M;
 
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/fnngj/pydj/myweb/static/;
}
}

說明:這裏的8000端口是uwsgi的端口,nginx運行將開啓8890端口,也就是nginx的8890端口與uwsgi的8000端口相互通訊。 

 

部署運行

運行uwsgi

nohup uwsgi --ini myweb_uwsgi.ini &

 

運行nginx:

/etc/init.d/nginx start

最後訪問http://IP地址:8890,能夠看到django項目已經被運行在nginx上了。

注意:在更新Django代碼後,最好重啓一下uwsgi進程,避免出現不可預知的Bug!

#關閉uwsgi和nginx
sudo nginx -s stop
killall -9 uwsgi

 

坑點

 

報錯

No module named django.core.wsgi

啓動uwsgi時報如下錯誤:ImportError: No module named django.core.wsgi for uwsgi

  uwsgi在python虛擬環境中啓動時,配置文件裏面要加虛擬的路徑。 

  打開django.init(本身建立)寫入:

home=/path/to/venv/

  運行: 

uwsgi --ini django.ini --protocol=http


uwsgi http is ambiguous
 

  這也是由於虛擬環境的緣由,建議退出python的虛擬環境,而後pip install uwsgi。

相關文章
相關標籤/搜索