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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:14:45