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

Docker部署Python后端无法找到PATH_INFO环境变量(Ubuntu版本差异)

问题解决:Docker部署Python后端找不到PATH_INFO环境变量

问题根源

你混淆了CGI和WSGI两种运行模式的环境变量获取逻辑:

  • PATH_INFO是CGI规范定义的环境变量,仅在CGI运行模式下由Web服务器注入到进程环境中。
  • 你用bjoern作为WSGI服务器启动应用,而WSGI规范中,请求相关变量(包括PATH_INFO)是通过WSGI调用的第一个参数(environ字典)传递的,并非系统环境变量。

之前Ubuntu21.04上能运行属于偶然情况(当时环境恰好存在该变量),并非正确实现;Ubuntu22.04环境中没有这个变量才是正常状态。

修复方案

1. 修正App的WSGI规范适配

WSGI应用必须是一个可调用对象,接受environ和start_response两个参数。如果你的app是Flask、Django这类框架实例,本身已符合WSGI规范,问题出在你错误依赖了系统环境变量,而非WSGI传入的environ。

把获取PATH_INFO的代码改成从WSGI传入的environ中读取:

# 错误写法(依赖系统环境变量os.environ)
path = environ.get("PATH_INFO", "/").lower()

# 正确写法(依赖WSGI调用传入的environ参数)
def app(environ, start_response):
    path = environ.get("PATH_INFO", "/").lower()
    # 后续业务逻辑
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return [b'Hello World']

2. 统一应用启动方式

你的docker_entry.py用bjoern启动WSGI应用是正确的部署方式,而app代码里的CGIHandler().run(app)属于CGI模式启动逻辑,两者不要混用。

如果本地调试需要CGI模式,保留if __name__ == "__main__"分支即可;线上用bjoern启动时该分支不会执行,不影响部署。核心是确保app的业务逻辑只使用WSGI传入的environ,而非系统环境变量。

3. 固定依赖版本确保一致性

确保Docker镜像内的Python依赖(尤其是bjoern)版本统一,避免版本差异导致的WSGI参数传递问题。可以在requirements.txt中固定版本:

bjoern==3.2.2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:07:31