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
- Python安装目录:
- 可临时将应用池身份改为
LocalSystem测试,排除权限问题
内容的提问来源于stack exchange,提问作者Nayan
相关产品推荐
相关产品推荐

