如何将Rails服务器以守护进程启动并实现重启/崩溃后自动重启?
嘿,我完全懂你的困扰——用-d参数让WEBrick后台运行确实能解放终端,但它本身压根没自带崩溃自动恢复和开机自启的能力,毕竟WEBrick本质是个轻量开发服务器,没考虑生产环境的持久化需求。不过要实现「后台运行+自动重启+开机自启」,有几个非常靠谱的方案,咱们一步步来:
方案一:用systemd配置系统服务(最推荐,原生支持)
现在绝大多数Linux发行版都用systemd做系统服务管理,它能完美解决你的需求,步骤也不复杂:
创建systemd服务文件
用文本编辑器创建一个服务配置文件,比如/etc/systemd/system/rails-production-app.service,把下面的内容填进去,记得替换成你自己的项目信息:[Unit] Description=我的Rails生产环境应用 After=network.target # 确保网络就绪后再启动服务 [Service] Type=simple User=你的用户名 # 比如deploy或者你的个人用户名,别用root WorkingDirectory=/path/to/your/rails/app # 你的Rails项目根目录 ExecStart=/usr/local/bin/bundle exec rails server webrick -e production Restart=always # 不管是应用崩溃还是服务器重启,都自动拉起服务 RestartSec=5 # 崩溃后等待5秒再重启,避免频繁重启 Environment="RAILS_ENV=production" # 设置环境变量 [Install] WantedBy=multi-user.target # 开机进入多用户模式时自动启动启用并启动服务
执行下面的命令让systemd识别新配置,然后设置开机自启并启动服务:sudo systemctl daemon-reload sudo systemctl enable rails-production-app.service sudo systemctl start rails-production-app.service查看状态和日志
想确认服务是否正常运行:sudo systemctl status rails-production-app.service实时查看应用日志:
journalctl -u rails-production-app.service -f
方案二:用进程管理工具(比如supervisord)
如果你的系统没用到systemd,或者更习惯用第三方进程管理工具,supervisord是个不错的选择:
安装supervisord
根据你的发行版安装,比如Debian/Ubuntu:sudo apt-get install supervisorCentOS/RHEL:
sudo yum install supervisor创建配置文件
在/etc/supervisor/conf.d/rails-app.conf里添加以下内容:[program:rails-app] command=/usr/local/bin/bundle exec rails server webrick -e production directory=/path/to/your/rails/app user=你的用户名 autostart=true autorestart=true stdout_logfile=/var/log/rails-app/stdout.log stderr_logfile=/var/log/rails-app/stderr.log记得先创建日志目录:
sudo mkdir -p /var/log/rails-app重启supervisord并启动服务
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start rails-app
额外提醒:生产环境别用WEBrick!
最后啰嗦一句:WEBrick真的只是给开发用的,性能和稳定性都远不如Puma、Unicorn或者Passenger这些生产级服务器。如果你的应用是正式上线用的,强烈建议换成这些服务器,它们本身就有更完善的守护和重启机制,配合systemd使用会更靠谱。
内容的提问来源于stack exchange,提问作者Rostislav Ruban

