mod_proxy_uwsgi
+ uwsgi + upstart 部署網上運行 python wsgi 的應用時,大部分的資料都是使用 nginx 、uwsgi ,不多資料說起到 apache2 下如何進行處理。可是平時的部署環境其實很難跳過 apache2 ,不少環境已經帶 apache2 ,很差另外安裝一個 nginx ,所以,通過一番測試後,建議使用 apache2 + mode_proxy_uwsgi
+ uwsgi + upstart/systemd 的配置。整個配置並不複雜,請按照具體的步驟逐個處理。python
如下的安裝步驟是在 ubuntu 14.04 和 python3 中完成的。nginx
安裝 flask 和 uwsgi ::apache
pip3 install flask pip3 install uwsgi
首先,編寫一個簡單應用用於測試,能夠使用 flask 或 django ,若是對 wsgi 熟悉,也能夠直接使用 wsgi。這裏是一個 flask 的示例 /var/www/test_app.py
::django
import flask application = flask.Flask(__name__) @application.route('/') def index(): return 'Hello, world!' if __name__ == '__main__': application.run()
而後,作個簡單的測試,啓動服務器 ::flask
python3 /var/www/test_app.py
打開一個新的終端,用 curl 請求 ::ubuntu
curl -v http://127.0.0.1:5000
可看到輸出爲 Hello, world!
服務器
uwsgi 的運行方式有多種,這裏只用命令行參數的方式運行,並寫入到 upstart 中自動啓動 /etc/init/uwsgi-test.conf
::app
description "uwsgi test" start on runlevel [2345] stop on runlevel [!2345] env LC_ALL=zh_CN.UTF-8 env LANG=zh_CN.UTF-8 env PYTHONIOENCODING=utf-8 exec uwsgi --socket 127.0.0.1:5000 --master --workers 2 --wsgi-file /var/www/test_app.py
爲了能正確地處理 utf-8 編碼的內容和日誌輸出,env 部分不能少。在 uwsgi 的配置可放到 ini 格式的配置文件中,並可指定一個 virtualenv 環境,防止破壞了主機的 python 環境,更多的配置選項見 http://uwsgi-docs.readthedocs.io/en/latest/curl
而後啓動 uwsgi ::socket
start uwsgi-test
在 ubuntu 中,安裝 apache2 和相關的工具 ::
apt-get install apache2 apache2-utils libapache2-mod-proxy-uwsgi
啓用 mod_proxy_uwsgi
::
a2enmod proxy a2enmod proxy_uwsgi
注意,必須同時啓用 proxy 模塊,不然 apache2 會報錯,錯誤信息爲 ::
Cannot load /usr/lib/apache2/modules/mod_proxy_uwsgi.so into server: /usr/lib/apache2/modules/mod_proxy_uwsgi.so: undefined symbol: ap_proxy_backend_broke。
編寫一個配置文件 test.conf
放在 /etc/apache2/conf-available
::
ProxyPass /test uwsgi://127.0.0.1:5000
啓用配置文件
a2enconf test
並重啓 apache2 ::
service apache2 restart
如今用 curl 測試一下 ::
curl -v http://127.0.0.1/test
可看到輸出爲 Hello, world!
。
至此,所有工做已完成。