Flask部署入門:Gunicorn與Nginx配置教程

一、爲什麼需要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()

三、安裝必要工具

  1. 安裝Gunicorn(WSGI服務器):
   pip install gunicorn
  1. 安裝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:appapp是模塊名(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配置開機自啓:

  1. 創建systemd服務文件:
   sudo nano /etc/systemd/system/gunicorn.service
  1. 寫入以下內容(替換路徑和參數):
   [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
  1. 啓動並設置開機自啓:
   sudo systemctl start gunicorn
   sudo systemctl enable gunicorn  # 開機自啓

八、常見問題排查

  1. 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

  2. 靜態文件無法加載
    - 確認location /staticalias路徑是否正確(如/home/ubuntu/myapp/static
    - 重啓Nginx:sudo systemctl restart nginx

總結

通過Gunicorn作爲WSGI服務器運行Flask應用,結合Nginx作爲反向代理,即可實現生產級別的部署。核心步驟是“啓動Gunicorn → 配置Nginx轉發請求”,後續可通過HTTPS、負載均衡等進一步優化。

小夜