如何通过自定义域名mydomain.com:3000从远程设备访问Lightsail上开发中的ReactJS应用?
嗨,我来帮你梳理下问题,你之前的配置踩了几个关键的坑,咱们一步步来解决:
首先,先把搞崩的Apache 80端口恢复正常
你之前修改Apache的监听端口和虚拟主机配置,反而导致Apache无法正常启动(从你后来的netstat结果看不到:::80就能看出来),先把这些错误配置回滚:
- 打开
/opt/bitnami/apache2/conf/httpd.conf,删掉你添加的Listen 3000行 - 打开
/opt/bitnami/apache2/conf/vhosts/00_status-vhost.conf,删掉你加的<VirtualHost 127.0.0.1:3000 _default_:3000>块 - 打开
/opt/bitnami/apache2/conf/bitnami/bitnami.conf,删掉你添加的<VirtualHost _default_:3000>整个配置块 - 重启Apache服务:
sudo /opt/bitnami/ctlscript.sh restart apache
这时候再访问mydomain.com或者服务器IP,应该能正常加载htdocs里的内容了。
核心问题:React开发服务器的绑定与Lightsail防火墙
你会发现ipaddress:3000能访问,但mydomain.com:3000不行,本质是两个问题:
React开发服务器默认只绑定本地回环地址
默认情况下,React的npm start只会把服务绑定在127.0.0.1(只能服务器本地访问),你需要让它绑定到所有网卡(允许外部访问):- 临时启动方式:
npm start -- --host 0.0.0.0 - 永久修改(修改项目根目录的
package.json):
找到scripts里的start字段,改成:"start": "react-scripts start --host 0.0.0.0"
改完后重启React服务,再用
sudo netstat -ltnp查看,应该能看到0.0.0.0:3000被node进程占用,这就对了。- 临时启动方式:
Lightsail控制台的防火墙没开放3000端口
Lightsail实例的入站流量是由控制台的防火墙规则控制的,哪怕服务器本地允许,控制台没开的话外部还是访问不了:- 登录AWS Lightsail控制台,找到你的实例
- 进入「联网」标签,在「入站流量规则」里添加一条规则:
- 类型:自定义TCP
- 端口范围:3000
- 来源:0.0.0.0/0(允许所有设备访问,开发阶段可以这么设;如果只想自己访问,填你桌面的公网IP)
- 保存规则
额外排查:Debian本地防火墙
如果上面两步做完还是无法访问,检查服务器本地的ufw防火墙是否启用:
- 查看ufw状态:
sudo ufw status - 如果启用了,添加3000端口允许规则:
sudo ufw allow 3000/tcp sudo ufw reload
为什么你之前的配置不对?
你误以为需要通过Apache来代理3000端口的请求,但开发阶段React有自己的内置开发服务器,完全不需要Apache介入。修改Apache的3000端口配置,要么和React的端口冲突,要么因为虚拟主机配置错误导致Apache启动失败,反而搞崩了原本正常的80端口服务。
现在按照上面的步骤操作,应该就能用mydomain.com:3000直接访问开发中的React应用啦!
备注:内容来源于stack exchange,提问作者The E

