You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多Gunicorn Worker导致Flask应用无法发起HTTPS请求问题排查

解决Gunicorn多Worker下SSL解密失败问题

问题根源

使用--preload参数时,Gunicorn会在主进程中预加载所有应用代码,包括初始化的HTTPS连接会话、SSL上下文等资源。当fork出多个Worker进程后,这些Worker会共享主进程中已创建的SSL资源状态——而SSL连接是基于进程级别的状态维护的,多进程共享同一状态会导致加密/解密流程混乱,最终触发[SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC]错误。

解决方案

1. 禁用--preload参数

直接移除--preload,让每个Worker进程独立加载应用代码并初始化自己的SSL资源。修改启动命令为:

gunicorn --workers 10 your_app:app

此方案简单直接,虽会增加启动时间,但能彻底避免进程间SSL状态冲突。

2. 延迟初始化SSL相关资源(保留--preload)

若需要保留--preload优化启动速度,需确保SSL资源在Worker进程fork完成后再初始化,而非主进程预加载阶段。可通过Gunicorn的post_fork钩子实现:

from gunicorn.app.base import BaseApplication
import requests
from your_app import app

def post_fork(server, worker):
    # 每个Worker进程独立初始化SSL会话
    global api_session
    api_session = requests.Session()

class CustomGunicornApp(BaseApplication):
    def __init__(self, app, options=None):
        self.options = options or {}
        self.application = app
        super().__init__()

    def load_config(self):
        for key, value in self.options.items():
            if key in self.cfg.settings and value is not None:
                self.cfg.set(key.lower(), value)
        # 注册post_fork钩子
        self.cfg.set("post_fork", post_fork)

    def load(self):
        return self.application

if __name__ == "__main__":
    run_options = {
        "workers": 10,
        "preload": True
    }
    CustomGunicornApp(app, run_options).run()

也可在Flask的@app.before_request钩子中延迟初始化,确保每次请求使用的SSL资源属于当前Worker进程。

3. 隔离全局SSL资源

检查代码中是否存在全局的requests.Session、urllib3.PoolManager或自定义SSL上下文对象——这类全局资源在--preload模式下会被所有Worker共享,引发状态混乱。
将全局资源改为局部变量,比如在视图函数内创建会话:

@app.route("/call-external-api")
def call_external_api():
    # 每次请求创建独立会话
    with requests.Session() as session:
        resp = session.get("https://target-https-endpoint.com")
        return resp.json()

内容的提问来源于stack exchange,提问作者MJZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:05:39