在不同域和不同环境的localhost上运行相同的Rails应用程序

时间:2010-12-24 13:40:58

标签: ruby-on-rails nginx passenger

我想在网址上运行相同的Rails 3应用: davinci.local.dev:8081 davinci.testing.dev:8082 以及环境开发和测试,分别。

我正在使用Nginx和乘客。我的第一次尝试是:

server {
      listen 8081;
      server_name .davinci.local.dev;
      root /Users/Nerian/NetBeansProjects/DaVinci/DaVinci/public;
      passenger_enabled on;
      rails_env development;   
      #rails_env development
   }

server {
      listen 8082;
      server_name .davinci.testing.dev;
      root /Users/Nerian/NetBeansProjects/DaVinci/DaVinci/public;
      passenger_enabled on;
      rails_env test;   
      #rails_env development
   }

然而,当我浏览所述网址时,我会进行相同的部署。如果我首先请求测试,那么无论是浏览 davinci.local.dev 还是 davinci.testing.dev ,它都是始终提供的应用程序。如果我首先请求开发一个,那么就是那个始终服务的那个。

两个部署都使用相同的根应用程序。有没有办法使这个工作?

目标是在不同域中的不同ENV上提供相同的应用程序。

2 个答案:

答案 0 :(得分:2)

我有类似的问题。我想要一个Rails应用程序(名为apparat)有两个nginx实例:example.eu用于英文版本的站点,example.ee用于爱沙尼亚语版本。它们共享完全相同的功能,因此只为它设置一个代码库是有意义的(但我必须确保用户上传的图像等静态资产不会发生冲突)。

server {
   listen 80;
   server_name example.eu;
   root /home/apparat/public;
   passenger_enabled on;
   rails_env apparat_eng;
}

server {
   listen 80;
   server_name example.ee;
   root /home/apparat/public;
   passenger_enabled on;
   rails_env apparat_ee;
}

然而,与上面类似,如果我访问example.ee,我得到了我的Rails应用程序的example.eu实例。可能是nginx /乘客的一些怪癖?

无论如何,我通过对/ home / apparat进行任意符号链接来解决这个问题,例如

ln -s /home/apparat /home/apparat_eng
ln -s /home/apparat /home/apparat_ee

分别更改了nginx配置

server {
   listen 80;
   server_name example.eu;
   root /home/apparat_eng/public;
   passenger_enabled on;
   rails_env apparat_eng;
}

server {
   listen 80;
   server_name example.ee;
   root /home/apparat_ee/public;
   passenger_enabled on;
   rails_env apparat_ee;
}

所以我能够欺骗nginx认为这些是不同的目录。

答案 1 :(得分:0)

我采取了不同的方法。开发服务器由nginx使用乘客提供服务,而测试服务器在使用rake spec:acceptance时按需启动。

所以nginx.conf是:

server {
  listen 8081;
  server_name .davinci.local.dev;
  root /Users/Nerian/NetBeansProjects/DaVinci/DaVinci/public;
  passenger_enabled on;
  rails_env development;   
  #rails_env development
}

就是这样。

并在spec / support / custom_env.rb

Capybara.run_server = true
Capybara.app_host = 'http://davinci.testing.dev:8082'
Capybara.server_port = 8082

这就是魔术。