Nginx+UWSGI+Django配置全過程

Nginx + uwsgi + Django 安裝配置


一、安裝Nginx uwsgi Django


安裝tengine

yum install pcre-devel -y 

wget http://tengine.taobao.org/download/tengine-2.1.1.tar.gz

tar xf tengine-2.1.1.tar.gz
cd tengine-2.1.1
./configure
make 
make installl


#安裝位置默認在/usr/local/nginx


安裝Django

wget https://www.djangoproject.com/m/releases/1.4/Django-1.4.22.tar.gz
tar xf Django-1.4.22.tar.gz
cd Django-1.4.22
python setup.py install

安裝uwsgi

pip install uwsgi


二、配置


1、測試uwsgi代理功能

測試文件test.py

#!/usr/bin/env python
#coding:utf8

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

    執行命令:

uwsgi --http :8000 --wsgi-file test.py

    在瀏覽器中訪問,http://localhost:8000 如果出現Hello World 則說明uwsgi代理正常工作

2、測試uwsgi 啓動django項目

創建項目:

# django-admin startproject myapp

在myapp/myapp/有一個wsgi.py文件


執行命令:

# cd myapp

# uwsgi --http :8000 --wsgi-file myapp/wsgi


在瀏覽器中訪問http://localhost:8000

如果網頁正常則一切順利。。。。。。

說明:從客戶商到 uWSGI 再到 Django 是正常的,uwsgi可以正常啓動django項目


3、配置nginx + uwsgi + django

首先配置使用http的方式:

編輯配置文件/usr/local/nginx/conf/nginx.conf

內容如下:

user  nginx; #使用nginx用戶
	worker_processes  2;

	events {
    	use epoll;
    	worker_connections  65535;
	}
	http {
    	include       mime.types;
    	default_type  application/octet-stream;
    	sendfile        on;
    	tcp_nopush     on;
    	keepalive_timeout  65;
    	gzip  on;

    	upstream django {
    	    server 127.0.0.1:8001;
    	}
    	server {
    	    listen       80;
    	    server_name  localhost;
    	    client_max_body_size 75M;
	
    	    location / {
    	        uwsgi_pass django;
    	        include uwsgi_params;
    	    }
    	    error_page   500 502 503 504  /50x.html;
    	    location = /50x.html {
    	        root   html;
    	    }
    	}
     }	

執行命令:

uwsgi --http :8001 --wsgi-file myapp/wsgi

使用瀏覽器訪問http://localhost 應該用正常訪問,出現以下圖片:

wKiom1XdTRTjyyPXAAGbKGgXMf4577.jpg

  用UNIX socket取代tcp port 

修改nginx.conf
	upstream django {
    	    #server 127.0.0.1:8001;
    	    server unix:///test/myapp.sock;
    	}

    來創建/test這個目錄

    mkdir /test

    chown nginx:nginx /test #如果不修改用戶權限,nginx無法訪問此socket 無法實現代理 

    會報如下錯誤:

    connect() to unix:///test/myapp.sock failed (13: Permission denied)

啓動:

uwsgi --socket /test/myapp.sock --wsgi-file myapp.wsgi


    到此nginx+uwsgi+django已經初步實現了,下面來爲uwsgi設置一個配置文件


4、配置myapp_uwsgi.ini

在Django項目目錄下創建myapp_uwsgi.ini 內容如下:

[uwsgi]
uid = nginx  #使用nginx用戶和組
gid = nginx
chdir = /usr/local/myapp #指定項目目錄
module = myapp.wsgi #加載myapp/wsgi.py這個模塊
master = true  #啓動主進程。
processes = 2 #啓動2個工作進程
listen = 120 #設置socket的監聽隊列大小(默認:100)
socket = /test/myapp.sock #指定socket文件
pidfile = /var/run/uwsgi.pid #指定pid文件
vacuum = true #當服務器退出的時候自動刪除unix socket文件和pid文件。
enable-threads = true #允許用內嵌的語言啓動線程。這將允許你在app程序中產生一個子線程
buffer-size = 32768 #設置用於uwsgi包解析的內部緩存區大小爲64k。默認是4k。

reload-mercy = 8 #設置在平滑的重啓(直到接收到的請求處理完才重啓)一個工作子進程中,等待這個工作結束的最長秒數。這個配置會使在平滑地重啓工作子進程中,如果工作進程結束時間超過了8秒就會被強行結束(忽略之前已經接收到的請求而直接結束)
max-requests = 5000 #爲每個工作進程設置請求數的上限。當一個工作進程處理的請求數達到這個值,那麼該工作進程就會被回收重用(重啓)。你可以使用這個選項來默默地對抗內存泄漏
limit-as = 256 #通過使用POSIX/UNIX的setrlimit()函數來限制每個uWSGI進程的虛擬內存使用數。這個配置會限制uWSGI的進程佔用虛擬內存不超過256M。如果虛擬內存已經達到256M,並繼續申請虛擬內存則會使程序報內存錯誤,本次的http請求將返回500錯誤。
harakiri = 60 #一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,並且當前處理這個請求的工作進程會被回收再利用(即重啓)
daemonize = /var/log/myapp_uwsgi.log # 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器


啓動:

uwsgi --ini myapp_uwsgi.ini

測試是否正常,如果不正常,可以查看日誌,排錯。


到此Nginx  +  Uwsgi + Django配置完成 ,並正常使用。整個過程走了很坑,找了很文章和資料,uwsgi還有很多選項,參考了網友的文章


參考鏈接:

http://www.jianshu.com/p/e6ff4a28ab5a

http://heipark.iteye.com/blog/1847421





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章