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

Windows Server 2022上IIS部署Flask应用时wfastcgi.py报错求助

IIS 10 + wfastcgi 3.0.0 出现 OSError: [Errno 22] Invalid Argument 问题排查与解决

问题场景

在Windows Server 2022的IIS 10上部署Python 3.9 Flask应用,表单提交数据能成功存入MongoDB,但后端无法继续处理后续逻辑,wfastcgi日志持续抛出如下错误:

Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\wfastcgi.py", line 774, in main
    record = read_fastcgi_record(fcgi_stream)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\wfastcgi.py", line 158, in read_fastcgi_record
    data = stream.read(8)     # read record
OSError: [Errno 22] Invalid argument
2023-05-27 13:56:42.139969: Running on_exit tasks
2023-05-27 13:56:42.141971: wfastcgi.py 3.0.0 closed
2023-05-27 13:56:45.739017: Unhandled exception in wfastcgi.py: Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\wfastcgi.py", line 774, in main
    record = read_fastcgi_record(fcgi_stream)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\wfastcgi.py", line 158, in read_fastcgi_record
    data = stream.read(8)     # read record
OSError: [Errno 22] Invalid argument
2023-05-27 13:56:45.743023: Unhandled exception in wfastcgi.py: Traceback (most recent call last)

当前web.config配置:

<configuration>  
  <system.webServer>
    <handlers>
        <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Users\Administrator\AppData\Local\Programs\Python\Python39\python.exe|C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
        <directoryBrowse enabled="true" />
  </system.webServer>
  <appSettings>
    <add key="WSGI_HANDLER" value="my_app.app" /> <!-- {name_of_file}.{name_of_flask_app}-->
    <add key="PYTHONPATH" value="C:\inetpub\wwwroot\flask-ins" />
      <add key="WSGI_LOG" value="C:\inetpub\wwwroot\flask-ins\app.log" />
  </appSettings>
    <system.web>
        <authentication mode="Forms" />
    </system.web>
</configuration>  

环境:Python 3.9、Windows Server 2022、IIS 10、wfastcgi 3.0.0

解决方案

1. 修复wfastcgi的流读取逻辑

这个错误源于Windows下FastCGI流读取的兼容性问题,直接修改wfastcgi.py代码:

  • 找到文件路径:C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\wfastcgi.py
  • 在文件顶部添加import time
  • 定位到read_fastcgi_record函数,替换原读取逻辑:
    def read_fastcgi_record(stream):
        try:
            data = b''
            # 分块读取确保获取完整的8字节头部
            while len(data) < 8:
                chunk = stream.read(8 - len(data))
                if not chunk:
                    raise EOFError("Unexpected end of stream")
                data += chunk
            # 以下保留原函数的剩余逻辑
            version, type, request_id, content_length, padding_length = struct.unpack('!BBHHB', data[:7])
            ...
        except OSError as e:
            if e.errno == 22:
                # 捕获无效参数错误,短暂重试
                time.sleep(0.01)
                return read_fastcgi_record(stream)
            else:
                raise
    

2. 优化IIS的FastCGI配置

在web.config的<system.webServer>节点下添加<fastCgi>配置,明确进程池参数,避免连接复用异常:

<system.webServer>
  <handlers>
      <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Users\Administrator\AppData\Local\Programs\Python\Python39\python.exe|C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
  </handlers>
  <!-- 添加FastCGI进程配置 -->
  <fastCgi>
    <application
      fullPath="C:\Users\Administrator\AppData\Local\Programs\Python\Python39\python.exe"
      arguments="C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Lib\site-packages\wfastcgi.py"
      maxInstances="4"
      instanceMaxRequests="1000"
      idleTimeout="300"
      activityTimeout="30"
      requestTimeout="60"
      protocol="NamedPipe"
      flushNamedPipe="false"
    />
  </fastCgi>
  <directoryBrowse enabled="true" />
</system.webServer>

3. 检查Flask应用的响应逻辑

数据能存入MongoDB说明请求已到达后端,但后续处理失败可能是因为请求没有正确返回响应,导致FastCGI流异常:

  • 确保所有表单提交的路由都有明确的return语句,比如:
    @app.route('/submit', methods=['POST'])
    def submit():
        # 存入MongoDB的逻辑
        db.collection.insert_one(request.form.to_dict())
        # 必须返回响应,不能无返回
        return redirect(url_for('success'))
        # 或者 return jsonify({'status': 'success'}), 200
    

4. 验证权限设置

  • 确认IIS应用池的身份(默认是ApplicationPoolIdentity)对以下目录有读写权限:
    • Python安装目录:C:\Users\Administrator\AppData\Local\Programs\Python\Python39
    • 网站根目录:C:\inetpub\wwwroot\flask-ins
  • 可临时将应用池身份改为LocalSystem测试,排除权限问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:02:50