在Amazon Linux 2023 EC2实例上通过PM2部署React+Vite应用后无法通过公网IP访问的求助
看起来你已经把部署流程搭得差不多了,但卡在公网访问这一步,我来帮你一步步排查问题:
1. 最可能的原因:Vite默认只绑定localhost,外部无法访问
你现在用的prod脚本是直接启动Vite开发服务器,但Vite默认只会监听127.0.0.1(也就是只有EC2本机能访问),外部请求根本打不进来。
解决方法:修改package.json里的prod命令,加上--host 0.0.0.0让它监听所有网卡:
"scripts": { "dev": "env-cmd -f .env.development vite --port 5173 --host 0.0.0.0", "prod": "env-cmd -f .env.production vite --port 5173 --host 0.0.0.0", // ...其他脚本保持不变 }
修改后重新部署,或者在EC2上手动重启PM2:pm2 restart janus-ui,之后再尝试用公网IP访问。
2. 检查EC2实例内部的防火墙设置
Amazon Linux 2023默认启用了firewalld,哪怕安全组开了端口,实例内部的防火墙也可能把5173端口挡住了。
登录EC2执行以下命令:
# 永久放行5173端口 sudo firewall-cmd --add-port=5173/tcp --permanent # 重载防火墙规则使设置生效 sudo firewall-cmd --reload # 验证端口是否已成功放行 sudo firewall-cmd --list-ports
如果输出里包含5173/tcp,说明防火墙已经放行该端口。
3. 确认应用实际监听的地址和端口
在EC2上执行命令,查看5173端口的监听状态:
ss -tulpn | grep 5173
如果输出是LISTEN 0 128 0.0.0.0:5173 0.0.0.0:* users:(("node",pid=xxxx,fd=xx)),说明已经正确监听所有网卡;如果是127.0.0.1:5173,那还是只绑定了localhost,回到第一步修改Vite启动参数即可。
4. 生产环境部署的优化建议(重要)
你现在用Vite开发服务器跑生产环境是不合适的——开发服务器性能差、没有缓存优化,而且安全性不足。正确的生产流程应该是:
- 在CodeBuild中执行
npm run build生成静态文件到dist文件夹(你已经在buildspec里配置了这一步) - 在EC2上用静态服务器托管
dist文件夹,比如用serve或者Nginx
用serve的修改方案:
- 修改
start_server.sh:
#!/bin/bash cd /janus-ui # 全局安装serve静态服务器 npm install -g serve # 用PM2启动serve,托管dist文件夹,监听5173端口和所有网卡 pm2 start serve --name "janus-ui" -- -s dist -l 5173 -n 0.0.0.0 pm2 startup pm2 save
- 这样就不再依赖Vite开发服务器了,应用的性能和稳定性都会提升很多。
5. 验证网络连通性
在你的本地机器上执行以下命令,测试能不能连到EC2的5173端口:
# 用nc测试(如果没装nc可以用telnet替代) nc -zv <你的EC2公网IP> 5173
如果显示succeeded!,说明网络通路没问题,问题出在应用本身;如果连接失败,回到安全组和防火墙的配置检查环节。
按照上面的步骤一步步排查,应该能解决公网访问的问题。
备注:内容来源于stack exchange,提问作者Mateusz Janus

