在之前的幾篇博客中對Django的功能做了初步實踐,這里鏈接貼一下:
Django之--通過MVC架構的html模板展示Hello World!
到這里基本的測試暫時告一段落,但是在實際開發中是不可能用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)
二、為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')