使用 apache2 + `mod_proxy_uwsgi` + uwsgi + upstart 部署

使用 apache2 + 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 配置

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

安裝和配置 apache2

在 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!

至此,所有工做已完成。

相關文章
相關標籤/搜索