詳解使用Nginx和uWSGI配置Python的web項(xiàng)目的方法
基于python的web項(xiàng)目,常見(jiàn)的部署方法有:
- fcgi:用spawn-fcgi或者框架自帶的工具對(duì)各個(gè)project分別生成監(jiān)聽(tīng)進(jìn)程,然后和http服務(wù)互動(dòng)。
- wsgi:利用http服務(wù)的mod_wsgi模塊來(lái)跑各個(gè)project。
不過(guò)還有個(gè)uwsgi,它既不用wsgi協(xié)議也不用fcgi協(xié)議,而是自創(chuàng)了一個(gè)uwsgi的協(xié)議,據(jù)作者說(shuō)該協(xié)議大約是fcgi協(xié)議的10倍那么快。uWSGI的主要特點(diǎn)如下:
- 超快的性能。
- 低內(nèi)存占用(實(shí)測(cè)為apache2的mod_wsgi的一半左右)。
- 多app管理。
- 詳盡的日志功能(可以用來(lái)分析app性能和瓶頸)。
- 高度可定制(內(nèi)存大小限制,服務(wù)一定次數(shù)后重啟等)。
環(huán)境ubuntu 12.04 IP:10.1.6.79
安裝nginx
apt-get install nginx-full nginx-common
nginx配置/etc/nginx/sites-enabled/example
server {
listen 80;
server_name 10.1.6.79;
access_log /var/log/nginx/example_access.log;
error_log /var/log/nginx/example_error.log;
root /var/www/example;
location / {
uwsgi_pass 127.0.0.1:9001;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param SERVER_SOFTWARE nginx/$nginx_version;
}
}
安裝uwsgi
apt-get install uwsgi uwsgi-plugin-python
如果你想安裝所有的uwsgi插件,則可以安裝uwsgi-plugin-all軟件包
uwsgi配置/etc/uwsgi/apps-enabled/default.xml
<uwsgi>
<plugin>python</plugin>
<socket>127.0.0.1:9001</socket>
<pythonpath>/var/www/example/app/</pythonpath>
<app mountpoint="/">
<script>wsgi_configuration_module</script>
</app>
<master/>
<processes>4</processes>
<reload-mercy>8</reload-mercy>
<cpu-affinity>1</cpu-affinity>
<max-requests>2000</max-requests>
<limit-as>512</limit-as>
<reload-on-as>256</reload-on-as>
<reload-on-rss>192</reload-on-rss>
<no-orphans/>
<vacuum/>
</uwsgi>
uwsgi配置文件中的參數(shù)也可以在命令行通過(guò)uwsgi指定,配置文件除了xml格式外,還可以寫(xiě)成ini格式的,軟件包安裝完畢后在/usr/share/doc/uwsgi/examples/conffile目錄下會(huì)有一些xml和ini格式配置文件的例子。
wsgi_configuration_module.py腳本內(nèi)容
#!/usr/bin/python
import os
import sys
sys.path.append('/var/www/example/app')
os.environ['PYTHON_EGG_CACHE'] = '/var/www/example/.python-egg'
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
啟動(dòng)uwsgi
uwsgi -x /etc/uwsgi/apps-enabled/default.xml --daemonize /var/log/uwsgi/app/default.log
uwsgi 的參數(shù):
-M 開(kāi)啟Master進(jìn)程
-p 4 開(kāi)啟4個(gè)進(jìn)程
-s 使用的端口或者socket地址
-d 使用daemon的方式運(yùn)行, 注意, 使用-d后, 需要加上log文件地址, 比如-d /var/log/uwsgi.log
-R 10000 開(kāi)啟10000個(gè)進(jìn)程后, 自動(dòng)respawn下
-t 30 設(shè)置30s的超時(shí)時(shí)間, 超時(shí)后, 自動(dòng)放棄該鏈接
–limit-as 32 將進(jìn)程的總內(nèi)存量控制在32M
-x 使用配置文件模式
并發(fā)4個(gè)線程
uwsgi -s :9090 -w myapp -p 4
主控制線程+4個(gè)線程
uwsgi -s :9090 -w myapp -M -p 4
執(zhí)行超過(guò)30秒的client直接放棄
uwsgi -s :9090 -w myapp -M -p 4 -t 30
限制內(nèi)存空間128M
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128
服務(wù)超過(guò)10000個(gè)req自動(dòng)respawn
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000
后臺(tái)運(yùn)行等
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
除了直接用uwsgi命令啟動(dòng)外,還可以用init.d下的腳本啟動(dòng), 不過(guò)需先修 改/etc/default/u wsgi中默認(rèn)配置文件的路徑,然后通過(guò)/etc/init.d/uwsgi start啟動(dòng)
#INHERITED_CONFIG=/usr/share/uwsgi/conf/default.ini INHERITED_CONFIG=/etc/uwsgi/apps-enabled/default.xml
啟動(dòng)nginx
/etc/init.d/nginx start
效果如下:

測(cè)試uwsgi是否可用
測(cè)試腳本test.py
#!/usr/bin/python
def application(env,start_response):
start_response('200 OK',[('Content_Type','text/html')])
return "Congraduation!!! uWSGI Testing OK!!!
#啟動(dòng)web server uwsgi --http :9090 --wsgi-file test.py
瀏覽器輸入IP:端口:192.168.1.99:9090
可以看到”Congraduation!!! uWSGI Testing OK!!!”
小結(jié)
uwsgi 實(shí)際上也是一個(gè) http 服務(wù)器,只不過(guò)它只面向 python 網(wǎng)絡(luò)應(yīng)用程序。雖然 uwsgi 也是 http 服務(wù)器,但是卻不能直接使用它部署 python web 應(yīng)用程序,否則會(huì)出錯(cuò)。
在本文中,uwsgi 所扮演的的角色是后端 http 服務(wù)器,nginx 扮演的角色是前端 http 服務(wù)器,hello.py 是客戶(hù)端應(yīng)用程序。 用戶(hù)從網(wǎng)頁(yè)瀏覽器中發(fā)出請(qǐng)求,nginx 服務(wù)器收到請(qǐng)求后,會(huì)通過(guò)它的 uwsgi 模塊將用戶(hù)的請(qǐng)求轉(zhuǎn)發(fā)給 uwsgi 服務(wù)器,uwsgi 服務(wù)器處理完畢后將結(jié)果返回給 nginx,瀏覽器將最終的結(jié)果展現(xiàn)給用戶(hù)。
相關(guān)文章
Nginx FastCGI緩存的實(shí)現(xiàn)示例
Nginx的FastCGI緩存是一種性能優(yōu)化手段,通過(guò)緩存動(dòng)態(tài)內(nèi)容減少對(duì)后端服務(wù)器的請(qǐng)求,提高系統(tǒng)響應(yīng)速度,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
Nginx可視化管理工具結(jié)合cpolar實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)的步驟詳解
Nginx Proxy Manager 是一個(gè)開(kāi)源的反向代理工具,本文將給大家介紹在Linux 安裝Nginx Proxy Manager并且結(jié)合 cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)管理界面,同等,當(dāng)我們使用Nginx Proxy Manager配置其他本地服務(wù),并且需要遠(yuǎn)程訪問(wèn),也是同樣的方式,需要的朋友可以參考下2023-09-09
Nginx對(duì)某個(gè)目錄設(shè)置密碼保護(hù)例子
這篇文章主要介紹了Nginx對(duì)某個(gè)目錄設(shè)置密碼保護(hù)例子,使用htpasswd 生成用戶(hù)名和密碼,并解決了打開(kāi)PHP文件變成文件下載的問(wèn)題,需要的朋友可以參考下2014-06-06
Nginx內(nèi)容緩存以及常見(jiàn)參數(shù)配置詳析
這篇文章主要給大家介紹了關(guān)于Nginx內(nèi)容緩存以及常見(jiàn)參數(shù)配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Nginx文件已經(jīng)存在全局反向代理問(wèn)題排查記錄
反向代理除了實(shí)現(xiàn)負(fù)載均衡之外,還提供如緩存來(lái)減少上游服務(wù)器的壓力,下面這篇文章主要給大家介紹了關(guān)于Nginx文件已經(jīng)存在全局反向代理問(wèn)題排查的相關(guān)資料,需要的朋友可以參考下2022-07-07
nginx FastCGI錯(cuò)誤Primary script unknown解決辦法
這篇文章主要介紹了nginx錯(cuò)誤Primary script unknown解決辦法,需要的朋友可以參考下2014-03-03

