nginx配合python_人生苦短我用python[0x02] nginx与python结合
原標(biāo)題:人生苦短我用python[0x02] nginx與python結(jié)合
**文章內(nèi)容為原創(chuàng),歡迎轉(zhuǎn)載請注明出處**
背景
nginx是一款高性能的http服務(wù)器,python是一門無論做系統(tǒng)開發(fā)還是業(yè)務(wù)邏輯開發(fā)都是非常不錯的動態(tài)語言,現(xiàn)在流行微服務(wù),微服務(wù)往往又以http協(xié)議居多,LAMP是一直以來比較受歡迎的技術(shù)組合,Apache+PHP,PHP確實也是一門用來做web開發(fā)不錯的語言,如果涉及到一些系統(tǒng)方面的調(diào)用可能用上來就沒有python那么順手,apahce相對于nginx講,在功能方面會比較全面,性能就有所落后,nginx顯得更靈活和高效。今天我們要講的是用nginx作為http服務(wù)的框架,用python來開發(fā)后端的邏輯實現(xiàn),這樣的組合很適合把一些系統(tǒng)接口包裝成http接口對外提供服務(wù)。
nginx與python結(jié)合的姿勢
通常http服務(wù)與后端對接往往用的是CGI(Common Gateway Interface)的方式對接,比如apache服務(wù)器可以對接一個用c語言編寫的可執(zhí)行文件,只要這個c語言編寫的執(zhí)行文件符合CGI的規(guī)范就可以處理并返回來自apache服務(wù)器的http請求。nginx與python對接,目前使用最為廣泛的方式是WSGI(Web Server Gateway Interface),跟CGI類似,WSGI只是一個標(biāo)準(zhǔn),他不是一種實現(xiàn)方式,目前開源項目uWSGI是大家用得比較多的實現(xiàn),本文將會用uWSGI給大家講解nginx與python的結(jié)合,并給出一些簡單的例子說明python如何處理來自前端nginx的http請求,如何把處理結(jié)果返回給http調(diào)用者。
下載安裝nginx
http://nginx.org/en/download.html
#到nginx官網(wǎng)下載最新版本的源碼包到/opt目錄
#解壓后進(jìn)入代碼目錄進(jìn)行編譯和安裝
#如果configure過程提示沒有pcre,則需要先安裝pcre-devel庫
./configure --prefix=/opt/nginx
make
make install
#一切順利的話,nginx已經(jīng)安裝好在/opt/nginx目錄下,我們先去安裝uWSGI然后再回頭設(shè)置nginx的配置文件
下載安裝uWSGI
https://uwsgi-docs.readthedocs.io/en/latest/Download.html
#到uWSGI官網(wǎng)下載最新版本的源碼包到/opt目錄
#解壓后進(jìn)入代碼目錄進(jìn)行編譯
make
#編譯順利完成后,會在當(dāng)前目錄下看到uwsgi的可執(zhí)行文件
#比如我們的目錄是 /opt/uwsgi-2.0.8/uwsgi
準(zhǔn)備python uWSGI腳本
#我們把所有uWSGI的python腳本都放在/opt/uwsgi目錄下
mkdir /opt/uwsgi
cd /opt/uwsgi
#先建立一個uwsgi的軟連接
ln -s /opt/uwsgi-2.0.8/uwsgi uwsgi
#寫一個啟動uWSGI進(jìn)程的腳本
cat run_uwsgi.sh
#!/bin/sh
./uwsgi -s 127.0.0.1:3031 -M -p 16 #監(jiān)聽本機(jī)3031端口,16個子進(jìn)程
--harakiri=120 #處理超時時間是120秒
--pythonpath /opt/uwsgi #python目錄
--chdir /opt/uwsgi
--wsgi-file main.py #uWSGI的入口文件是main.py,下面會有main.py內(nèi)容
--daemonize /var/log/uwsgi.log #日志輸出文件
--touch-logreopen=/var/log/touch-uwsgi-logreopen #設(shè)置可以通知uWSGI重新打開日志文件
uWSGI入口文件 main.py
import web
import os
import json
from urllib import unquote
urls = ("/.*", "main")
class main:
def GET(self):
try:
#獲取GET參數(shù)
query = unquote(web.ctx.env['QUERY_STRING'])
#返回內(nèi)容就是nginx返回給http調(diào)用者的內(nèi)容,這里只返回GET請求內(nèi)容
return query
except Exception as e:
return e
def POST(self):
try:
#獲取POST數(shù)據(jù)
post_data = json.loads(web.data())
#同GET一樣,返回POST數(shù)據(jù)
return post_data
except Exception as e:
return e
app = web.application(urls, globals())
application = app.wsgifunc()
配置nginx.conf
#在nginx server,比如在80端口server塊里面增加后端uWSGI信息
#增加一個/uwsgi/的子目錄,專門用于處理uWSGI服務(wù)
location ~ /uwsgi/(.*) {
include uwsgi_params;
uwsgi_send_timeout 120s; #設(shè)置超時時間
uwsgi_read_timeout 120s;
uwsgi_pass 127.0.0.1:3031; #跟uWSGI服務(wù)端口一致
運行uWSGI和nginx
#啟動uWSGI服務(wù)
sh /opt/uwsgi/run_uwsgi.sh
#檢查uwsgi是否啟動成功監(jiān)聽服務(wù)端口
netstat -lnp|grep uwsgi
#啟動nginx
/opt/nginx/sbin/nginx
#測試uWSGI GET
curl "http://127.0.0.1/uwsgi/?arg1=123&arg2=abc"
#測試uWSGI POST
curl -d "hello" "http://127.0.0.1/uwsgi/"
下期預(yù)告
人生苦短我用python[0x06] list分片與推導(dǎo)返回搜狐,查看更多
責(zé)任編輯:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的nginx配合python_人生苦短我用python[0x02] nginx与python结合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑水冷散热更换cpu(水冷散热怎么换)
- 下一篇: emacs python ide_Ema