如何在Amazon EC2上同时运行两个Ruby on Rails应用服务器?
解决两个Ruby on Rails应用在EC2上同时对外监听的问题
从你给出的ps -ef输出能明显看到核心问题:第一个Puma进程(对应app1)绑定的是tcp://localhost:3000,这意味着它只接受本地回环地址的请求,外部根本访问不到;而第二个进程(app2)是正确绑定0.0.0.0:3001的。
你提到尝试给app1加-b0.0.0.0参数但没效果,大概率是启动命令的执行方式有问题。下面是正确的操作流程:
1. 正确启动每个应用(分开执行,确保参数生效)
不要把两个启动命令混在一行(你之前的命令写法会导致第一个命令的参数被干扰),应该分别切换到对应应用目录,或者用&&串联确保目录切换成功后再启动:
启动app1,绑定0.0.0.0,端口3000,后台运行:
cd /path/app1 && rails server -b 0.0.0.0 -p 3000 -d启动app2,绑定0.0.0.0,端口3001,后台运行:
cd /path/app2 && rails server -b 0.0.0.0 -p 3001 -d
这里rails server和rails s功能一致,写全称更清晰。-d让进程后台运行,-b指定绑定地址,-p指定端口,这几个参数缺一不可。
2. 验证监听状态
执行以下命令确认两个进程的绑定地址:
ps -ef | grep puma
正常情况下,输出应该类似这样,两个进程都显示绑定0.0.0.0:
dev+ 4562 1 0 10:22 ? 00:00:02 puma 3.11.2 (tcp://0.0.0.0:3000) [app1] dev+ 7891 1 0 10:25 ? 00:00:01 puma 3.11.3 (tcp://0.0.0.0:3001) [app2]
你也可以用ss工具更直观地查看端口绑定:
ss -tulpn | grep puma
输出会显示每个端口对应的绑定地址,确保都是0.0.0.0而不是127.0.0.1。
3. 排查潜在的其他问题
如果按上面操作后还是不行,检查这几点:
- EC2安全组:确认安全组已经添加了TCP 3000和3001端口的入站规则,来源设置为
0.0.0.0/0(或者你需要的特定IP范围),不要只开了一个端口。 - 实例内部防火墙:如果EC2实例启用了iptables或firewalld,确保没有阻止这两个端口的入站流量。可以临时关闭防火墙测试,或者添加允许规则。
- Rails环境配置:有些生产环境的配置文件(比如
config/environments/production.rb)可能会强制设置绑定地址,检查是否有类似config.server_binding = 'localhost'的配置,如果有,改成'0.0.0.0'或者注释掉。
按照这个流程操作,两个应用应该都能正常从外部访问了。
内容的提问来源于stack exchange,提问作者matQ
相关产品推荐
相关产品推荐

