我使用以下 Unicorn 配置成功部署了使用 Capistrano、Unicorn 和 Nginx 的 Rails 应用程序:
env = ENV["RAILS_ENV"] || "开发" worker_processes 4 听“/tmp/app_one.socket”,:backlog => 64 preload_app 真实 超时 60 pid“/tmp/unicorn.app_one.pid” 如果 env ==“生产” 工作目录“/home/single_user/app_one/current” 用户‘single_user’ shared_path =“/home/single_user/app_one/shared” stderr_path“#{shared_path}/log/unicorn.stderr.log” stdout_path“#{shared_path}/log/unicorn.stdout.log” 结尾 before_fork 执行 |服务器,工作者| 如果定义了?(ActiveRecord::Base) ActiveRecord::Base.connection.disconnect! 结尾 old_pid = “/tmp/unicorn.app_one.pid.oldbin” 复制代码 如果 File.exists?(old_pid) && server.pid != old_pid 开始 Process.kill("退出", File.read(old_pid).to_i) 救援 Errno::ENOENT、Errno::ESRCH # 已经死了 结尾 结尾 结尾 after_fork 执行 |服务器,工作者| 如果定义了?(ActiveRecord::Base) ActiveRecord::Base.establish_connection 结尾 结尾
在同一个环境下
single_user
,我添加了第二个 Rails 应用、第二个 Nginx 虚拟服务器,并使用了完全相同的 Unicorn 配置,替换app_one
为app_two
在所有适当的地方。我的第二个应用程序部署得很好,但现在我在部署第一个应用程序时遇到了麻烦。 不
/tmp/unicorn.app_one.pid
存在,但网站仍然运行良好(top
按预期显示十个进程)。 但是/tmp/app_one.socket
存在,这使我无法手动启动 Unicorn。
那么,在同一个用户下运行多个 Rails/Unicorn/Nginx 是否是适当的做法?我在部署过程中是否引起了某种冲突?我应该如何在不破坏正在运行的程序的情况下继续进行app_one
?
答案1
为什么不使用特定于应用程序的 tmp 目录,并将 unicorn.pid 放入其中,例如“#{working_directory}/tmp/unicorn.pid”。对于任何特定于应用程序的文件(如套接字),方法都类似。如果您不想将其放在 working_directory 中,请使用 shared_path。将特定于 app1 的所有内容保存在特定于 app1 的位置,将与 app2 相关的所有内容保存在特定于 app2 的目录中。