我在 Windows Server 2012 上运行 Apache Tomcat 作为我唯一的 HTTP 服务器。
Tomcat 已作为服务安装并绑定到端口 80。该server.xml
文件已address="0.0.0.0"
添加到连接器,并且 Windows 防火墙对所有端口 80 请求开放。
我的应用程序需要向用户发送电子邮件警报。通过本地托管的 SMTP 服务 (Apache James) 直接发送不可靠。为了确保这些电子邮件的发送,我选择通过我们的主要电子邮件服务 Microsoft 的在线 Office365 服务转发我的电子邮件。要通过此服务转发,TLS 加密和其他安全措施是必要的。正如您可能想象的那样,Microsoft 的 SMTP 服务运行良好,但我很难让任何其他基于 Windows 或 Java 的服务正确转发。为了启用电子邮件发送,我安装了内置的 Windows Server SMTP 服务。
此配置一直运行良好,直到昨晚安装了最新一轮的 Windows 更新。现在,我无法访问我的 Tomcat 服务器,并且端口 80 上的所有请求均未成功。Tomcat 日志显示:
SEVERE: Error initializing endpoint
java.lang.Exception: Socket bind failed: [730013] An attempt was made to access a socket in a way forbidden by its access permissions.
at org.apache.tomcat.util.net.AprEndpoint.init(AprEndpoint.java:589)
...
我通过 Google 搜索得到了许多链接,都表明 IIS 套接字池是罪魁祸首。
我尝试保留端口 80 供 tomcat 使用netsh http add iplisten 192.168.1.8
,这样 Tomcat 就可以启动并在本地绑定。现在我可以使用http://localhost/
或http://127.0.0.1/
在本地机器上查看我的 Tomcat 站点。但是,通过http://192.168.1.8/
或 通过任何网络连接进行访问仍然失败。
我找不到有关如何在 Windows Server 2012 上完全禁用 IIS 套接字池的任何文档(所有链接均指向旧版本和脚本,这些版本和脚本似乎已在当前服务器版本中删除/取代。
更新:安装(未弃用的)Windows SMTP 服务似乎也会安装并自动运行 IIS。安装过程仅显示管理工具 - 但当您检查 IIS 管理控制台时,会发现默认网站独占了端口 80。当然,它会在启动任何第三方 Web 服务器之前接管控制权。唉。将 IIS 站点更改为其他端口或完全停止它似乎可以让 Tomcat 再次工作。