歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 使用gunicorn部署web.py應用

使用gunicorn部署web.py應用

日期:2017/2/27 16:01:19   编辑:Linux教程
經常看到有人問python的web應用如何部署的問題。

常見的方案是用apache的mod_wsgi,或者高端一點的用uWsgi。但是個人覺得這些都太復雜了,使用維護都不方便,我一般是推薦用gunicorn,配合Apache或Nginx,可以實現簡單高效的應用部署和維護。

為此特地寫了這麼個文檔來介紹,並且本文提交pull request到web.py項目的cookbook,只是Aaron Swartz去世之後,web.py不知道是誰在維護,提交了一個月也沒人處理,看了一下pull request列表,還有2年前的請求在掛著……

所以我只好fork了一個,加上這個頁面,未來我作的維護,都會更新在這個分支上。
通過Gunicorn在Apache和Nginx下部署

下面的代碼基於Gunicorn 0.14.6在Debian 6.0.6和FreeBSD 9.0系統下測試。

目前最新版本的Gunicorn在使用方法上沒有區別。 其它Linux發行版、各種BSD、Mac OS X等系統應該也沒問題。 但不推薦Windows系統,因為目測會多出很多不必要的困難。
Note:
  • 你可以重命名 code.py為任何你自己願意的名字,該例子還是以code.py為例。
  • /path-to/webpy-app 為包含你的 code.py代碼的路徑。
  • /path-to/webpy-app/code.py 應該是你的**python file**的完整路徑。

可以在命令行運行 gunicorn --version 查看當前gunicorn的版本。

安裝Gunicorn

參見Gunicorn官網:
http://gunicorn.org/#quickstart

官網的建議是用virtualenv方式安裝,這是個好方法。這裡不再介紹virtualenv(個人推薦用virtualenvwrapper), 以下以已安裝好的virtualenv環境為例介紹,當然你也可以跳過virtualenv,直接全局安裝(需要加上sudo)。

pip install gunicorn

用Gunicorn部署web.py應用

Gunicorn是用於部署wsgi應用的,任何支持wsgi的應用都可以,不止是web.py。

整個部署過程分為兩個部分:
  • 用Gunicorn運行web.py/wsgi應用
  • 配置web server前端的反向代理

用Gunicorn運行web.py應用

前面已經說過,Gunicorn是用來部署wsgi應用的,所以首先要修改code.py,使之成為一個wsgi應用。

# ...
app = web.application(urls, globals())
# 在這裡加入下面這句,即可
application = app.wsgifunc()

最簡單的運行方式就是:

gunicorn code:application

其中code就是指code.py,application就是那個wsgifunc的名字。

這樣運行的話, gunicorn 默認作為一個監聽 127.0.0.1:8000 的web server,可以在本機通過: http://127.0.0.1:8000 訪問。

如果要通過網絡訪問,則需要綁定不同的地址(也可以同時設置監聽端口):

gunicorn -b 192.168.0.123:8080 code:application

在多核服務器上,為了支持更多的並發訪問並充分利用資源,可以使用更多的 gunicorn 進程:

gunicorn -w 8 code:application

這樣就可以啟動8個進程同時處理HTTP請求,提高系統的使用效率及性能。

另外, gunicorn 默認使用同步阻塞的網絡模型(-k sync),對於大並發的訪問可能表現不夠好, 它還支持其它更好的模式,比如:gevent或meinheld。

# gevent
gunicorn -k gevent code:application
# meinheld
gunicorn -k egg:meinheld#gunicorn_worker code:application

當然,要使用這兩個東西需要另外安裝,具體請參考各自的文檔。

以上設置還可以通過 -c 參數傳入一個配置文件實現。
配置Apapache的反向代理

簡單的反向代理配置如下(以在VirtualHost裡為例):
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
ProxyPreserveHost On
ProxyErrorOverride Off

將對根路徑的所有訪問請求全部代理到 http://127.0.0.1:8000 的 gunicorn 服務上。
配置Nginx的反向代理

簡單的反向代理配置如下(同樣是以virtual host為例):
location / {
try_files $uri @test;
}

location @test {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8000;
}

將對根路徑的所有訪問請求全部代理到 http://127.0.0.1:8000 的 gunicorn 服務上。

實際應用中可能需要設置更多的 proxy_set_header 變量,視應用需求而定。
Copyright © Linux教程網 All Rights Reserved