使用 systemd 来管理你的 rails 应用
这篇文章属于没什么卵用系列
我并不喜欢 capistrano
众所周知 rails 的项目启动用 RAILS_ENV=production bundle exec rails server -p 3000 -d
如果服务器经常重启。。最简单的办法:那我们就要把这条命令放在 /etc/rc.local 里(目前deb系的发行版是保留的。本质上是用 systemd 来执行这里的命令)。。。
不过目前。大部分 Linux Distribution 都是 systemd 来启动的(gentoo 除外。gentoo 默认是 openrc,可以换成 systemd )
在改之前。我们先把 rails 监听的端口换成 unix sock
1 | sed -i 's#port ENV.fetch("PORT") { 3000 }#bind "unix://\#{Rails.root}/tmp/sockets/puma.sock"#g' config/puma.rb |
例如我的项目叫kiss2u 大概是这样:
1 | $ cat ~/.config/systemd/user/kiss2u.service |
1 | [Unit] |
没错。这个是用户级 systemd
但由于 systemd 要写绝对路径。。但我可不想手动改 QAQ
然后我们定义一个 template,就像这样。定义几个标签
1 | $ cat config/kiss2u.service.template |
在 bin 目录下创建生成真正的systemd 的配置文件 bin/generate_service.sh
当然我们是要新建一个用户来跑的。不然 generate_service.sh 就没意义了
1 |
|
然后来使用 systemctl --user start kiss2u
就可以启动了
要开机启动的话 systemctl --user enable kiss2u
就可以
不过。这么做仍然有问题
我在 rbenv 下测试是好使的。。。在有些环境下就会出现启动不了的情况。我也不知道是为什么啊 QAQ
如果你启动出问题请更改 ExecStart=
解决办法: 兼容性最好ExecStart=
来启动一段 shell 脚本。在 shell 脚本里加载必要的变量
1 | source ./config.sh |
类似这样。。。好吧。我承认这很不优雅。。。不过兼容性最好。。
对了 kiss2u 是开源项目,你可以直接去看源代码 <—–自买自夸
https://github.com/a-wing/KISS2U
参考文章: