Nginx+uWSGI啟動Django


在之前的幾篇博客中對Django的功能做了初步實踐,這里鏈接貼一下:

Django的安裝和啟動

Django之--網頁展示Hello World!

Django之--通過MVC架構的html模板展示Hello World!

Django之--MVC的Model

Django之--POST方法處理表單請求

Django之--模板加載圖片

到這里基本的測試暫時告一段落,但是在實際開發中是不可能用python manage.py runserver這種方式啟動web server的,因此接下來測試如何使用uwsgi+nginx的方式啟動Django。

一、安裝uWSGI和Nginx

pip3.6 install uwsgi
yum -y install nginx

WSGI / uwsgi / uWSGI 這三個概念的區別:(引用自:http://www.cnblogs.com/alex3714/p/6538374.html) 

WSGI是一種Web服務器網關接口。它是一個Web服務器(如nginx,uWSGI等服務器)與web應用(如用Flask框架寫的程序)通信的一種規范。 
uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。 
而uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器。 
uwsgi協議是一個uWSGI服務器自有的協議,它用於定義傳輸信息的類型(type of information),每一個uwsgi packet前4byte為傳輸信息類型描述,它與WSGI相比是兩樣東西。

二、為uWSGI編寫配置文件

vi /etc/uwsgi.ini

[uwsgi]
chdir=/root/Django/mysite/  --即網站根目錄。
module=mysite.wsgi:application  --標識app位置。
static-map=/static=/root/Django/mysite/static  --表示模板引用的靜態文件的目錄,使用圖片時必須設置。
socket=192.168.1.193:8000  --用於接收nginx請求的socket,可以是文件,而且建議是文件,這里懶的改了。
master = true    
vhost = true      
no-site = true     
workers = 2         
reload-mercy = 10     
vacuum = true        
max-requests = 1000   
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi.pid
daemonize = /tmp/uwsgi.log  --uWSGI日志,安裝uwsgi調試時有用。

三、修改Nginx配置文件

upstream部分一般用於配置負載均衡,這里就不寫了。

server {
    listen       80 default_server;  --表示監聽80端口,我們最后也通過訪問此端口來訪問網站的。
    listen       [::]:80 default_server;
    server_name  192.168.1.193;  #定義server訪問名,表示只處理此訪問名的請求,如果不設置會默認當前第一個server域,因此不設置也行。
    access_log /etc/nginx/access.log main; #nginx日志
    root         /usr/share/nginx/html;
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
    location / { #默認請求訪問
	include	/etc/nginx/uwsgi_params;
	uwsgi_pass  192.168.1.193:8000; #請求自動轉發給192.168.1.193:8000的uWSGI socket,與上面uWSGI的socket參數要一致。
    index  index.html index.htm;
	client_max_body_size 35m;
    }
    error_page 404 /404.html;
        location = /40x.html {
    }
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

 

四、運行uWSGI和nginx

啟動uwsgi和nginx:

uwsgi --ini=/etc/uwsgi.ini
service nginx start

此時你就可以通過你在urls.py定義的網址來訪問頁面了。但是需要注意的nginx上邊我監聽的是80端口,因此你只需要訪問80端口就好,他會把請求全部轉發到8000端口的uwsgi處理。

顯示的頁面如下圖所示(默認的80端口):

 

最后:

必須要說的是不使用nginx只用uwsgi也可以實現以上的功能,但是此時你需要為uwsgi.ini配置http參數,socket參數可以省略,如果只使用uwsgi那么你可以通過http參數定義的端口訪問以上頁面。使用nginx的最大好處之一是實現對后端uwsgi的負載均衡,這樣可以提升並發量,此外nginx對靜態請求的處理能力要強過uwsgi,因此如果靜態請求較多,那么可以將這部分內容用nginx處理。

補充:

最近在用uwsgi+nginx設置https訪問項目時遇到了uwsgi無法啟動的問題,網上大多數回答都是要么沒裝django(我特么智障不裝django來問問題??!!)要么用了virtualenv(確實沒用這玩意兒),到最后還是在十多個stackoverflow的相似話題里找到了一個合胃口的,具體網頁原諒我忘記了隱約記得是非前排的、32個贊的回答。

uwsgi日志報錯如下:

*** Operational MODE: preforking ***
Traceback (most recent call last):
  File "./mysite/wsgi.py", line 13, in <module>
    from django.core.wsgi import get_wsgi_application
ModuleNotFoundError: No module named 'django'
unable to load app 0 (mountpoint='') (callable not found or import error)

我開始以為是系統默認python命令是python2的緣故,但是改為3也是不行,后來看到那位大佬的回復后隱約找到了這個問題應該是django和uwsgi的版本更新速度不協調的問題,這個不是我自己能解決的,暫時的解決辦法就是在項目的主app下的wsgi.py文件里加上如下的語句(事實上你單獨import sys,然后看sys.path是包含這個路徑的,只是uwsgi不知道):

import sys
sys.path.append('/usr/local/lib/python3.6/site-packages')

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM