Nginx + uwsgi + Django 安裝配置
一、安裝Nginx uwsgi Django
安裝tengine
1
2
3
4
5
6
7
8
9
<code>yum </code><code>install</code> <code>pcre-devel -y </code>
<code>wget http:</code><code>//tengine</code><code>.taobao.org</code><code>/download/tengine-2</code><code>.1.1.</code><code>tar</code><code>.gz</code>
<code>tar</code> <code>xf tengine-2.1.1.</code><code>tar</code><code>.gz</code>
<code>cd</code> <code>tengine-2.1.1</code>
<code>.</code><code>/configure</code>
<code>make</code>
<code>make</code> <code>installl</code>
#安裝位置預設在/usr/local/nginx
安裝Django
<code>wget https:</code><code>//www</code><code>.djangoproject.com</code><code>/m/releases/1</code><code>.4</code><code>/Django-1</code><code>.4.22.</code><code>tar</code><code>.gz</code>
<code>tar</code> <code>xf Django-1.4.22.</code><code>tar</code><code>.gz</code>
<code>cd</code> <code>Django-1.4.22</code>
<code>python setup.py </code><code>install</code>
安裝uwsgi
<code>pip </code><code>install</code> <code>uwsgi</code>
二、配置
1、測試uwsgi代理功能
測試檔案test.py
<code>#!/usr/bin/env python</code>
<code>#coding:utf8</code>
<code>def</code> <code>application(env, start_response):</code>
<code> </code><code>start_response(</code><code>'200 OK'</code><code>, [(</code><code>'Content-Type'</code><code>,</code><code>'text/html'</code><code>)])</code>
<code> </code><code>return</code> <code>[</code><code>"Hello World"</code><code>]</code>
執行指令:
<code>uwsgi --http :8000 --wsgi-</code><code>file</code> <code>test</code><code>.py</code>
在浏覽器中通路,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
内容如下:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<code>user nginx; </code><code>#使用nginx使用者</code>
<code> </code><code>worker_processes 2;</code>
<code> </code><code>events {</code>
<code> </code><code>use epoll;</code>
<code> </code><code>worker_connections 65535;</code>
<code> </code><code>}</code>
<code> </code><code>http {</code>
<code> </code><code>include mime.types;</code>
<code> </code><code>default_type application</code><code>/octet-stream</code><code>;</code>
<code> </code><code>sendfile on;</code>
<code> </code><code>tcp_nopush on;</code>
<code> </code><code>keepalive_timeout 65;</code>
<code> </code><code>gzip</code> <code>on;</code>
<code> </code><code>upstream django {</code>
<code> </code><code>server 127.0.0.1:8001;</code>
<code> </code><code>}</code>
<code> </code><code>server {</code>
<code> </code><code>listen 80;</code>
<code> </code><code>server_name localhost;</code>
<code> </code><code>client_max_body_size 75M;</code>
<code> </code>
<code> </code><code>location / {</code>
<code> </code><code>uwsgi_pass django;</code>
<code> </code><code>include uwsgi_params;</code>
<code> </code><code>}</code>
<code> </code><code>error_page 500 502 503 504 </code><code>/50x</code><code>.html;</code>
<code> </code><code>location = </code><code>/50x</code><code>.html {</code>
<code> </code><code>root html;</code>
<code> </code><code>}</code>
<code>uwsgi --http :8001 --wsgi-</code><code>file</code> <code>myapp</code><code>/wsgi</code>
使用浏覽器通路http://localhost 應該用正常通路,出現以下圖檔:
<a href="http://s3.51cto.com/wyfs02/M01/72/19/wKiom1XdTRTjyyPXAAGbKGgXMf4577.jpg" target="_blank"></a>
用UNIX socket取代tcp port
<code>修改nginx.conf</code>
<code> </code><code>upstream django {</code>
<code> </code><code>#server 127.0.0.1:8001;</code>
<code> </code><code>server unix:</code><code>///test/myapp</code><code>.sock;</code>
來建立/test這個目錄
mkdir /test
chown nginx:nginx /test #如果不修改使用者權限,nginx無法通路此socket 無法實作代理
會報如下錯誤:
connect() to unix:///test/myapp.sock failed (13: Permission denied)
啟動:
<code>uwsgi --socket </code><code>/test/myapp</code><code>.sock --wsgi-</code><code>file</code> <code>myapp.wsgi</code>
到此nginx+uwsgi+django已經初步實作了,下面來為uwsgi設定一個配置檔案
4、配置myapp_uwsgi.ini
在Django項目目錄下建立myapp_uwsgi.ini 内容如下:
<code>[uwsgi]</code>
<code>uid = nginx </code><code>#使用nginx使用者群組</code>
<code>gid = nginx</code>
<code>chdir = </code><code>/usr/local/myapp</code> <code>#指定項目目錄</code>
<code>module = myapp.wsgi </code><code>#加載myapp/wsgi.py這個子產品</code>
<code>master = </code><code>true</code> <code>#啟動主程序。</code>
<code>processes = 2 </code><code>#啟動2個工作程序</code>
<code>listen = 120 </code><code>#設定socket的監聽隊列大小(預設:100)</code>
<code>socket = </code><code>/test/myapp</code><code>.sock </code><code>#指定socket檔案</code>
<code>pidfile = </code><code>/var/run/uwsgi</code><code>.pid </code><code>#指定pid檔案</code>
<code>vacuum = </code><code>true</code> <code>#當伺服器退出的時候自動删除unix socket檔案和pid檔案。</code>
<code>enable</code><code>-threads = </code><code>true</code> <code>#允許用内嵌的語言啟動線程。這将允許你在app程式中産生一個子線程</code>
<code>buffer-size = 32768 </code><code>#設定用于uwsgi包解析的内部緩存區大小為64k。預設是4k。</code>
<code>reload-mercy = 8 </code><code>#設定在平滑的重新開機(直到接收到的請求處理完才重新開機)一個工作子程序中,等待這個工作結束的最長秒數。這個配置會使在平滑地重新開機工作子程序中,如果工作程序結束時間超過了8秒就會被強行結束(忽略之前已經接收到的請求而直接結束)</code>
<code>max-requests = 5000 </code><code>#為每個工作程序設定請求數的上限。當一個工作程序處理的請求數達到這個值,那麼該工作程序就會被回收重用(重新開機)。你可以使用這個選項來默默地對抗記憶體洩漏</code>
<code>limit-as = 256 </code><code>#通過使用POSIX/UNIX的setrlimit()函數來限制每個uWSGI程序的虛拟記憶體使用數。這個配置會限制uWSGI的程序占用虛拟記憶體不超過256M。如果虛拟記憶體已經達到256M,并繼續申請虛拟記憶體則會使程式報記憶體錯誤,本次的http請求将傳回500錯誤。</code>
<code>harakiri = 60 </code><code>#一個請求花費的時間超過了這個harakiri逾時時間,那麼這個請求都會被丢棄,并且目前處理這個請求的工作程序會被回收再利用(即重新開機)</code>
<code>daemonize = </code><code>/var/log/myapp_uwsgi</code><code>.log </code><code># 使程序在背景運作,并将日志打到指定的日志檔案或者udp伺服器</code>
<code>uwsgi --ini myapp_uwsgi.ini</code>
測試是否正常,如果不正常,可以檢視日志,排錯。
到此Nginx + Uwsgi + Django配置完成 ,并正常使用。整個過程走了很坑,找了很文章和資料,uwsgi還有很多選項,參考了網友的文章
參考連結:
http://www.jianshu.com/p/e6ff4a28ab5a
http://heipark.iteye.com/blog/1847421
本文轉自 ZhouLS 51CTO部落格,原文連結:http://blog.51cto.com/zhou123/1688434