使用Nginx+uWsgi實現(xiàn)Python的Django框架站點動靜分離
由于:
Django處理靜態(tài)文件不太友好;
以后有可能需要處理php或者其他資源的請求;
所以考慮結(jié)合nginx,使用nignx做它擅長的路由分發(fā)功能;同時做動靜分離,即Http請求統(tǒng)一由Nginx進行分發(fā),靜態(tài)文件由Nginx處理,并返回給客戶端;而動態(tài)的請求,則分發(fā)到uWsgi,由uWsgi再分發(fā)給Django進行處理。即客戶端 <-> nginx <-> socket <-> uwsgi <-> Django
一、環(huán)境
系統(tǒng):centOS 6
- python: 2.7(注意:Django要在2.7版本或以上的python來 )
- nginx
- uswgi
所以,安裝前,先在控制臺輸入python —version查看當(dāng)前python的默認(rèn)版本,如果在2.7以下,則修改默認(rèn)版本。(詳見附錄)
二、安裝nginx、uWsgi
安裝
nginxsudo yum install nginx
安裝
pipsudo yum install python-pip
安裝
uWsgisudo pip uwsgi
三、測試nginx、uWsgi
1. 測試nginx啟動測試nginx,看是否安裝成功啟動 sudo service nginx start然后在瀏覽器中,輸入ip地址,看是否出現(xiàn)nginx的歡迎頁面,出現(xiàn)則說明安裝成功
2. 測試uWsgi在服務(wù)器上做任意目錄下(一般在home下的某一目錄),新建test.py,如下:
# test.pydef application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"
啟動以Http方式訪問的uWsgi,在test.py同一目錄下,輸入如下命令行(8001是監(jiān)聽的端口,可以改成你想要的端口)
uwsgi --http :8001 --wsgi-file test.py
然后在瀏覽器中,輸入ip地址:8001,看是否響應(yīng)hello world,是則說明安裝成功
P.S. 由于開始時,uwsgi的安裝使用了錯誤的python版本,所以在我的服務(wù)器上,uwsgi正確地可執(zhí)行命令暫時是:/usr/src/download/uwsgi-2.0.10/uwsgi即完整的命令行是(本文所有的uwsgi命令同此):/usr/src/download/uwsgi-2.0.10/uwsgi --http :8001 --wsgi-file test.py
--http :8001 --wsgi-file test.py至此,uwsgi和nginx安裝成功。接下來把nginx、uwsgi、django關(guān)聯(lián)起來。在它們的協(xié)作之下,達到我們想要的目標(biāo)。
四、連接Django和uWsgi
如上uWsgi的測試那樣,uWsgi監(jiān)聽8001端口,并把請求分發(fā)給test.py,python會執(zhí)行這個文件,如果我們把test.py分給Django的入口文件,那么就實現(xiàn)了Django和uWsgi的連接。所以,要做的事情有兩步:
在項目目錄下創(chuàng)建wsgi.py文件
啟動uWsgi,使用它的wsgi-file指向wsgi.py
wsgi.py內(nèi)容如下:
""" WSGI config for WHPAIWechat project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ """ import osfrom django.core.wsgi import get_wsgi_applicationos.environ.setdefault("DJANGO_SETTINGS_MODULE", "WHPAIWechat.settings") application = get_wsgi_application()
啟動以Http方式訪問uWsgiuwsgi --http :8000 --chdir /home/jiayandev/WHPAIWechat/ --wsgi-file WHPAIWechat/wsgi.py
瀏覽器訪問 ip地址:8000,加上必要的路由,即可訪問之前寫好的python程序:例如[http://112.74.73.31:8000/wechat/call]
P.S. 你是否關(guān)注到,啟動uwsgi即可,而無需再啟動Django了?
五、連接uWsgi和nginx
接下來,打通 uWsgi和 nginx之間的連接,它們是通過socket來連接的。第四節(jié)所講的鏈接 swgi和Django,我們用瀏覽器訪問是能得到正確的響應(yīng)的,說明連接成功。那么只要在nginx上,實現(xiàn)某些規(guī)則下,把前端的請求轉(zhuǎn)發(fā)到此端口即可。要做的事情非常簡單,即配置nginx的配置文件即可,一般在 /etc/nginx/conf.d/default.conf中。這里,我只設(shè)置幾條簡單的規(guī)則
url包含.css、.js等服務(wù)器特定目錄,設(shè)置根目錄
以上都不匹配的的訪問分發(fā)到uwsgi上的, nginx轉(zhuǎn)發(fā)給uswgi處理
更多規(guī)則可以視業(yè)務(wù)情況而定,完整的配置如下:
upstream django { server 127.0.0.1:8000; # 注意8000是上述uwsgi監(jiān)聽的端口 } server { listen 80 default_server; server_name _; #charset koi8-r; #access_log logs/host.access.log main; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.html$ { root /usr/share/nginx/html/front; index index.html index.htm; } location ~ \.(png|jpg|jpeg|css|img|js|flv|swf|download|eot|svg|ttf|woff|woff2|otf)$ { root /usr/share/nginx/html/front; } # 以上都不匹配的的訪問分發(fā)到uwsgi上 location / { include /etc/nginx/uwsgi_params; #詳細看下文 uwsgi_pass django; } * # PHP分到 9000端口** # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #}* }
同時,uswgi_param內(nèi)容如下,照抄即可
uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name;
配置完成后,重啟或者reload nginx配置即可生效
重啟:
sudo service nginx restart
reload:
sudo service nginx reload
然后直接訪問,看看有什么不一樣:
http://youIP/front/index.html
http://youIP/statics/index.html
http://youIP/(加上路由信息),例如 http://112.74.73.31/wechat/call
我們這里主要先關(guān)注訪問django,如果http://112.74.73.31/wechat/call返回的信息跟第四節(jié)的一樣,說明nginx和uwsgi也連接起來了,至此,nginx、uwsgi、django順利連接完成。
六、優(yōu)化uwsgi的啟動
第三節(jié)、第四節(jié)介紹的啟動uwsgi服務(wù)時,我們都是使用命令行的方式啟動和設(shè)置參數(shù)的,這樣不好記,有可能會忘記參數(shù) 等等。這里介紹另一種設(shè)置參數(shù)的方式,即用配置文件記錄uwsgi的參數(shù),啟動時,從配置文件里加載參數(shù)。參數(shù)如下
#WHPAIWechat_uwsgi.ini[uwsgi] socket = 127.0.0.1:8000 chdir = /home/jiayandev/WHPAIWechat/ wsgi-file = WHPAIWechat/wsgi.py processes = 4 threads = 2 master=True #設(shè)置此參數(shù),有一個主進程 pidfile= pidfile/project-master.pid #主進程id寫入文件里 vacuum=True #退出時,清理環(huán)境 daemonize = uwsgi.log #守護進程的方式運行,log日志存在此log文件里
啟動uwsgi命令變成uwsgi WHPAIWechat_uwsgi.ini
- 解決nginx+uwsgi部署Django的所有問題(小結(jié))
- Django + Uwsgi + Nginx 實現(xiàn)生產(chǎn)環(huán)境部署的方法
- 詳解Django+Uwsgi+Nginx的生產(chǎn)環(huán)境部署
- nginx+uwsgi啟動Django項目的詳細步驟
- 詳解Django+Uwsgi+Nginx 實現(xiàn)生產(chǎn)環(huán)境部署
- Centos部署django服務(wù)nginx+uwsgi的方法
- Django uwsgi Nginx 的生產(chǎn)環(huán)境部署詳解
- Nginx+Uwsgi+Django 項目部署到服務(wù)器的思路詳解
- centos7下基于nginx+uwsgi部署Django項目的實現(xiàn)
相關(guān)文章
詳解Python調(diào)用系統(tǒng)命令的六種方法
這篇文章主要介紹了詳解Python調(diào)用系統(tǒng)命令的六種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5輸入對話框QInputDialog詳細使用方法與實例,需要的朋友可以參考下2020-02-02Python裝飾器實現(xiàn)方法及應(yīng)用場景詳解
這篇文章主要介紹了Python裝飾器實現(xiàn)方法及應(yīng)用場景詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03python簡單鼠標(biāo)自動點擊某區(qū)域的實例
今天小編就為大家分享一篇python簡單鼠標(biāo)自動點擊某區(qū)域的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06