如何关闭PuTTy窗口后保持EC2实例上Rails应用的Puma服务器运行?
嘿,这个问题一点都不浅显——很多刚把Rails应用部署到EC2的开发者都会碰到这个坎!要让Puma在你关闭PuTTy甚至关掉本地电脑后还稳稳运行,有几个靠谱的方案,我给你拆解一下:
nohup快速临时运行 这是最快捷的临时解决方案,适合测试场景。它能让进程脱离当前终端会话,即使你关掉PuTTy也能继续跑。
步骤很简单:
- 进入你的Rails应用根目录
- 执行命令:
nohup bundle exec puma -C config/puma.rb &nohup会让程序忽略终端关闭的信号,把输出默认写到当前目录的nohup.out文件里&让进程在后台运行
如果要查看Puma的日志,直接看这个文件就行:
tail -f nohup.out
⚠️ 注意:这个方案的缺点是EC2实例重启后,Puma不会自动启动,所以只适合临时测试用。
tmux/screen保留会话(适合开发调试) 如果你需要时不时回到Puma的控制台查看输出或者调试,用会话管理工具tmux或者screen就很合适。它们会在服务器上保留一个独立的会话,即使你断开连接,会话里的进程依然在运行。
以tmux为例:
先安装tmux(如果EC2上没有):
- Ubuntu/Debian系统:
sudo apt update && sudo apt install tmux - Amazon Linux/RHEL系统:
sudo yum install tmux
- Ubuntu/Debian系统:
创建一个新的tmux会话:
tmux new -s puma_session这里
puma_session是会话名称,你可以随便取。在这个会话里正常启动Puma:
bundle exec puma -C config/puma.rb现在你可以脱离这个会话,按快捷键:
Ctrl+B,然后松开再按D。这时候你关掉PuTTy也没关系,Puma还在跑。下次重新连接EC2后,要回到这个会话,执行:
tmux attach -t puma_session
⚠️ 注意:和nohup一样,EC2重启后会话会消失,所以还是适合开发调试阶段用。
systemd做持久化服务(生产环境推荐) 如果是生产环境,必须用系统服务来管理Puma——它能让Puma开机自动启动,进程挂了还能自动重启,稳定性拉满。
步骤如下:
创建一个systemd服务文件,比如
/etc/systemd/system/puma.service,用编辑器打开:sudo nano /etc/systemd/system/puma.service把下面的内容粘贴进去,注意替换成你自己的配置:
[Unit] Description=Puma HTTP Server for My Rails App After=network.target [Service] Type=simple User=ec2-user # 换成你的EC2用户名,比如ubuntu Group=ec2-user # 同上 WorkingDirectory=/home/ec2-user/my-rails-app # 换成你的Rails应用根目录 ExecStart=/home/ec2-user/.rbenv/shims/bundle exec puma -C config/puma.rb # 换成你的bundle路径,比如用rvm的话路径是/home/ec2-user/.rvm/gems/ruby-x.x.x/wrappers/bundle Restart=always # 进程挂了自动重启 RestartSec=5 # 重启间隔5秒 Environment=RAILS_ENV=production # 换成你的运行环境,development/production Environment=BUNDLE_PATH=/home/ec2-user/.rbenv/versions/x.x.x/lib/ruby/gems/x.x.x/gems # 如果需要指定bundle路径的话 [Install] WantedBy=multi-user.target保存并退出编辑器(nano里按
Ctrl+O,回车,再Ctrl+X)。重新加载systemd配置:
sudo systemctl daemon-reload启动Puma服务:
sudo systemctl start puma设置开机自启:
sudo systemctl enable puma
之后你可以用这些命令管理Puma:
- 查看服务状态:
sudo systemctl status puma - 重启服务:
sudo systemctl restart puma - 停止服务:
sudo systemctl stop puma - 查看实时日志:
journalctl -u puma -f
这个方案是生产环境的标准做法,稳定性和可维护性都最好。
内容的提问来源于stack exchange,提问作者Joseph Harskamp

