Apache + Gunicorn 利用反向代理模式放棄一直裝不好的 wsgi

一直以來我在尋找比較不會出問題的 wsgi 安裝方式,常常都是今天能用,明天不一定。這台機器能用換一台機器又不一定。真的很怪。也沒時間看到底怎麼一回事(其實也花了超多時間了

後來偶然發現可以用反向代理的方式去設定,而不用用到 WSGI。所謂反向代理 我們可以當作是 apache 收到要求後才對內的某個服務 port 發出請求。這樣的好處就是這台機器對外的 port 都是固定的不管你是用 php 還是 node.js 或是 python 都可以共存給 apache 去做代理。只要設定不同的內部 port 即可。

我們都知道 flask 自己本身就可以建構出一個伺服器只要 flask run 就可以變出一個伺服器出來在一個特定的 port 。這時候我們就可以使用 apache 代理將 80 轉拋給這個 port

所以其實我們可以 Apache+ Flask run 把日子過完~~~沒錯但是這樣幹可以調整的彈性就變低很多。我們可以搭配專門的服務管理程式 Gunicorn 來處理。


首先先設定 Apache


我們先確認有安裝必須要有的 mod
httpd -M

這時候列出來的清單需要有以下幾種
proxy_module (shared)
lbmethod_byrequests_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)

沒有的話先去安裝一下吧!

接著設定 apache的 host

<VirtualHost *:80>
    ProxyPreserveHost On
    ServerName www.yourdomain.com
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>

這樣的話就是設定 當使用者連到 www.yourdomain.com:80 的時候,就會轉去問 8080。
這時候我們只要確保 8080 是有提供服務的即可。


利用 Gunicorn 啟動服務

安裝非常簡單:
python3 -m pip install gunicorn
我會這樣打是因為我的 pip install 因為 python2 和 3 共存的關係在發瘋,所以直接用 python3 -m pip 取代

應用程式根目錄下我們需要建立一個 wsgi.py 的程式給 Gunicorn 讀取

# wsgi.py
from app import app

這樣就可以了。


我們只要在我們的程式根目錄下輸入
gunicorn --reload --bind=0.0.0.0:8080 wsgi:app -D

Gunicorn 就會讓 app.py 這個程式開始運行

--reload 表示會跟著程式檔案更新重整
--bind=0.0.0.0:8080  服務啟動在 8080 這個 port
wsgi:app  用 wsgi.py 這個程式去啟動 app
-D 背景運行





參考連結:
https://cloud.tencent.com/developer/article/1163681
https://peterli.website/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8nginx-gunicorn%E8%88%87supervisor-%E9%83%A8%E7%BD%B2%E4%B8%80%E5%80%8Bflask-app/


留言