AWS上Rails应用无法持续运行及重复操作问题求助
先搞懂:弹性IP能帮你什么,帮不了什么
首先明确:弹性IP是AWS提供的固定公网IP,它的作用是避免EC2实例重启/停止后公网IP变动——如果你的实例现在每次重启IP都变,那分配弹性IP确实有用,用户访问的地址就能固定下来。但它没法直接让你的Rails应用自动持续运行,这是两个完全不同的问题。
核心方案:用进程管理工具让Rails后台持续跑
你现在手动rails s启动的进程,只要SSH连接断了(比如关终端、超时掉线),进程就跟着终止了。所以必须用专门的进程管理工具,把Rails进程挂在后台,就算SSH断了也能继续跑,还能在意外崩溃时自动重启。推荐用systemd(EC2用的Amazon Linux、Ubuntu这些主流系统都支持),步骤如下:
创建systemd服务配置文件
登录EC2后,创建一个服务文件,比如/etc/systemd/system/rails-app.service,把下面的内容贴进去,记得替换成你自己的项目路径和Ruby/Rails路径:[Unit] Description=我的Rails应用服务 After=network.target # 等网络就绪再启动 [Service] User=ec2-user # 用你的EC2用户名,一般是ec2-user或ubuntu WorkingDirectory=/home/ec2-user/your-rails-project # 替换成你的Rails项目根目录 ExecStart=/home/ec2-user/.rbenv/shims/rails s -p 3000 -b 0.0.0.0 # 替换成你的Ruby二进制路径和端口 Restart=always # 进程意外终止时自动重启 RestartSec=5 # 重启间隔5秒 Environment="RAILS_ENV=production" # 根据你的环境改,比如development [Install] WantedBy=multi-user.target # 开机时自动启动启动并启用服务
执行这几条命令:sudo systemctl daemon-reload # 让systemd识别新的服务文件 sudo systemctl start rails-app.service # 启动服务 sudo systemctl enable rails-app.service # 设置开机自启确认服务状态
用sudo systemctl status rails-app.service查看,如果显示active (running),就说明成功了。以后不管SSH断连还是实例重启,Rails应用都会自动跑起来。
解决SSH断连的「Broken pipe」问题
这个错误是SSH连接闲置太久,服务器主动断开导致的。可以用两种方法解决:
方法1:修改本地SSH配置(推荐,不用改服务器)
在你自己电脑的~/.ssh/config文件里加一段配置(如果没有这个文件就新建一个):
Host your-ec2-ip-or-domain ServerAliveInterval 60 # 每60秒给服务器发一个心跳包 ServerAliveCountMax 3 # 连续3次没收到回应才断开
方法2:修改EC2的SSH服务器配置
登录EC2后,编辑/etc/ssh/sshd_config,找到下面两个参数并修改:
ClientAliveInterval 60 ClientAliveCountMax 3
然后重启SSH服务:sudo systemctl restart sshd
最后总结一下
- 弹性IP:有用,但只解决IP固定的问题,不解决应用持续运行。如果你的实例IP经常变,就分配一个;如果IP一直没变,暂时也可以不用。
- 应用持续运行:必须靠
systemd这类工具,这是核心解决方案。 - SSH断连:通过心跳包配置就能解决「Broken pipe」的问题。
内容的提问来源于stack exchange,提问作者A.A. F

