一、爲什麼需要Gunicorn和Nginx?¶
Flask自帶的開發服務器(flask run)僅適合本地調試,不支持高併發且不安全,無法直接對外提供生產級服務。生產環境中通常需要兩個工具配合:
- Gunicorn:作爲WSGI服務器,負責運行Flask應用,處理客戶端請求並返回結果(類似“應用服務器”)。
- Nginx:作爲反向代理服務器,負責處理靜態資源(如圖片、CSS、JS)、負載均衡、SSL加密,並將動態請求轉發給Gunicorn(類似“門衛+管理員”)。
二、準備工作¶
假設你已安裝Python環境,且有一個簡單的Flask應用(以app.py爲例,內容如下):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Flask!"
if __name__ == '__main__':
app.run()
三、安裝必要工具¶
- 安裝Gunicorn(WSGI服務器):
pip install gunicorn
- 安裝Nginx(反向代理服務器):
- Ubuntu/Debian:sudo apt-get update && sudo apt-get install nginx
- CentOS/RHEL:sudo yum install nginx
- 檢查安裝是否成功:nginx -v(顯示版本號即成功)
四、啓動Gunicorn服務¶
Gunicorn需指定Flask應用的入口和端口,語法如下:
gunicorn [參數] 模塊名:Flask實例名
示例:假設Flask應用在app.py中,入口爲app(即app = Flask(__name__)),啓動Gunicorn:
# 綁定到127.0.0.1:8000,開啓4個worker(根據CPU核心數調整,通常爲CPU核心數*2+1)
gunicorn -w 4 -b 127.0.0.1:8000 app:app
- 參數解釋:
-w 4:指定4個worker進程(w=worker,進程數建議:CPU核心數*2 + 1,避免過多worker導致資源佔用過高)。-b 127.0.0.1:8000:綁定地址和端口(僅本地訪問,生產環境需暴露公網時需調整,但建議先本地測試)。app:app:app是模塊名(app.py),第二個app是Flask實例名(app = Flask(__name__))。
驗證Gunicorn:打開瀏覽器訪問http://127.0.0.1:8000,或用命令行測試:
curl http://127.0.0.1:8000 # 應返回 "Hello, Flask!"
五、配置Nginx反向代理¶
Nginx需將客戶端請求轉發給Gunicorn(即127.0.0.1:8000),並處理靜態資源。
1. 創建Nginx配置文件¶
Ubuntu/Debian系統中,Nginx配置文件通常放在/etc/nginx/sites-available/目錄下。新建配置文件(如flask_app):
sudo nano /etc/nginx/sites-available/flask_app
2. 編寫Nginx配置¶
將以下內容粘貼到配置文件中,替換server_name爲你的域名或服務器IP(本地測試用localhost):
server {
listen 80; # 監聽80端口(HTTP)
server_name localhost; # 替換爲你的域名(如example.com)
# 處理動態請求:轉發到Gunicorn
location / {
proxy_pass http://127.0.0.1:8000; # Gunicorn地址
proxy_set_header Host $host; # 傳遞請求頭
proxy_set_header X-Real-IP $remote_addr; # 傳遞真實IP
}
# 處理靜態文件(如CSS、JS、圖片):Nginx直接讀取本地文件
location /static {
alias /path/to/your/flask/static; # 替換爲你的Flask靜態文件目錄
expires 30d; # 靜態文件緩存30天
}
}
注意:若Flask應用無靜態文件,可刪除location /static塊。
3. 啓用配置並重啓Nginx¶
- 將配置文件軟鏈接到
sites-enabled(Nginx默認加載該目錄):
sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled/
- 檢查配置語法是否錯誤:
sudo nginx -t # 顯示 "syntax is ok" 表示語法正確
- 重啓Nginx:
sudo systemctl restart nginx # 或 service nginx restart
六、驗證最終效果¶
此時訪問服務器IP或域名(如http://localhost),應看到Flask應用返回的“Hello, Flask!”。
七、進階:Gunicorn進程管理(開機自啓)¶
爲避免服務器重啓後需手動啓動Gunicorn,可通過systemd配置開機自啓:
- 創建systemd服務文件:
sudo nano /etc/systemd/system/gunicorn.service
- 寫入以下內容(替換路徑和參數):
[Unit]
Description=Gunicorn instance to serve Flask app
After=network.target
[Service]
User=your_username # 替換爲實際用戶名(如ubuntu)
WorkingDirectory=/path/to/your/flask/app # 替換爲應用目錄
ExecStart=/home/your_username/.local/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app # Gunicorn命令
[Install]
WantedBy=multi-user.target
- 啓動並設置開機自啓:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn # 開機自啓
八、常見問題排查¶
-
Nginx無法轉發請求:
- 檢查Gunicorn是否運行:ps aux | grep gunicorn
- 檢查Nginx端口是否佔用:lsof -i:80(若80端口被佔用,修改Nginx配置文件的listen參數)
- 檢查防火牆:sudo ufw allow 80/tcp(Ubuntu)或sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT -
靜態文件無法加載:
- 確認location /static的alias路徑是否正確(如/home/ubuntu/myapp/static)
- 重啓Nginx:sudo systemctl restart nginx
總結¶
通過Gunicorn作爲WSGI服務器運行Flask應用,結合Nginx作爲反向代理,即可實現生產級別的部署。核心步驟是“啓動Gunicorn → 配置Nginx轉發請求”,後續可通過HTTPS、負載均衡等進一步優化。