天天看點

Nginx+UWSGI+Django配置全過程

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

繼續閱讀