在IIS上为Tomcat配置反向代理时8009端口出现问题
问题分析与解决方案
错误原因
你的问题核心是IIS反向代理未正确处理WebSocket的HTTP升级请求,导致Tomcat无法识别WebSocket连接请求,从而抛出HTTP upgrade is not supported by this protocol错误。具体来说:
- IIS默认不会自动转发WebSocket所需的
Upgrade和Connection头部,Tomcat收到的请求缺失这些关键头部,无法触发WebSocket协议升级 - 未启用IIS的WebSocket协议支持,也未在ARR代理中开启WebSocket支持
解决步骤
1. 安装IIS WebSocket协议组件
在Windows Server 2022的服务器管理器中:
- 打开添加角色和功能,依次选择Web服务器(IIS)-> 应用程序开发 -> 勾选WebSocket协议,完成安装
2. 修改IIS反向代理配置(web.config)
更新你的rewrite规则,添加WebSocket头部传递支持,以及允许修改对应的服务器变量:
<rewrite> <allowedServerVariables> <!-- 允许传递WebSocket相关头部 --> <add name="HTTP_UPGRADE" /> <add name="HTTP_CONNECTION" /> </allowedServerVariables> <rules> <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:8080/TestWeb/{R:1}" /> <!-- 转发WebSocket升级所需的头部 --> <serverVariables> <set name="HTTP_UPGRADE" value="{HTTP_UPGRADE}" /> <set name="HTTP_CONNECTION" value="{HTTP_CONNECTION}" /> </serverVariables> </rule> </rules> </rewrite>
3. 启用ARR的WebSocket支持
打开IIS管理器的Application Request Routing Cache:
- 点击左侧的Server Proxy Settings
- 在弹出的设置窗口中,勾选Enable WebSocket support选项,保存配置
额外说明:Tomcat本身支持HTTPS
你之前认为Tomcat无法处理HTTPS是误解,Tomcat可以直接配置HTTPS连接器,不需要依赖IIS代理。如果后续想直接用Tomcat处理HTTPS,可以修改Tomcat的server.xml,添加类似以下的HTTPS连接器配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/your-certificate.jks" type="RSA" /> </SSLHostConfig> </Connector>
需要将证书转为JKS格式(可使用keytool工具),并替换上述配置中的证书路径。
内容的提问来源于stack exchange,提问作者HarryF
相关产品推荐
相关产品推荐

