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

Apache Tomcat使用WebSocket返回404问题求助(AWS Elastic Beanstalk环境)

解决AWS Elastic Beanstalk Tomcat实例内部访问WebSocket端点404问题

嘿,我之前在AWS Elastic Beanstalk上部署Tomcat WebSocket的时候也踩过类似的坑,给你几个实际试过的排查方向,应该能帮你找到问题:

1. 先核对WebSocket端点的路径配置

  • 先检查你代码里@ServerEndpoint注解的路径,比如是不是写了/ws/message,但你在实例内访问的时候漏了上下文?比如本地测试时你的应用上下文是/myapp,但EB上部署后Tomcat默认把war包放到ROOT目录,上下文变成了/,那访问路径就得是ws://localhost:8080/ws/message,不能带/myapp。
  • 别用普通的curl http://localhost:8080/xxx测试WebSocket端点!WebSocket握手需要特定请求头,普通HTTP GET请求会直接返回404,得用WebSocket客户端工具测试,比如装个wscat(实例里执行sudo yum install nodejs && npm install -g wscat),然后用wscat -c ws://localhost:8080/你的端点路径来测试。

2. 检查Tomcat的WebSocket注册日志

  • 去实例里的Tomcat日志目录看看,一般在/var/log/tomcat8/,打开catalina.out或者localhost.log,搜索有没有类似Registering WebSocket endpoint with path的日志。如果找不到这条日志,说明你的WebSocket端点根本没被Tomcat注册,那问题出在代码或web.xml配置上。
  • 核对web.xml里有没有加WebSocket的监听器:
    <listener>
        <listener-class>org.apache.tomcat.websocket.server.WsContextListener</listener-class>
    </listener>
    
    要是你用的是Java EE标准的ServerApplicationConfig实现类,也要确认这个类有没有被正确打包进war包。

3. 确认Tomcat实际监听的端口

  • 有时候EB的自定义配置可能改了Tomcat的端口,先在实例里执行netstat -tulpn | grep java,看看Tomcat是不是在监听8080端口。如果是其他端口,那你访问的时候就得用对应的端口,比如8009或者自定义的端口。

4. 排查实例本地的防火墙和权限

  • 虽然是本地访问实例内部端口,但还是要确认iptables有没有限制:执行iptables -L,看看有没有拒绝本地访问8080的规则。要是用的是CentOS的firewalld,就执行firewall-cmd --list-ports,确保8080在允许列表里。
  • 另外,Tomcat的运行用户有没有权限绑定端口?不过8080是非特权端口,一般不会有问题,但还是可以看看catalina.out里有没有端口绑定失败的报错。

5. 验证EB部署的war包是否正确

  • 有时候本地测试的war包和部署到EB的不一样,比如漏了依赖或者端点类没打包进去。可以在实例里解压war包看看:cd /var/lib/tomcat8/webapps/ROOT && unzip -q ROOT.war,检查WEB-INF/classes里有没有你的WebSocket端点类,WEB-INF/lib里有没有冲突的jar包(比如不要把tomcat-websocket.jar打包进去,Tomcat本身已经有这个依赖了)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:01:48