在单个域上为乘客+ Nginx提供多个Rails应用程序

时间:2014-09-11 23:37:44

标签: ruby-on-rails nginx passenger

我有一个单独的Nginx实例与乘客,并希望在不同的路线上提供不同的Rails应用程序。具体来说:/api应该投放一个应用,/应该投放不同的应用。 我的Rails应用程序位于文件系统上的/srv/api//srv/ui

我的Nginx配置目前是这样的:

user  foo;
worker_processes  1;

events { worker_connections  1024; }

http {
  passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-4.0.49;
  passenger_ruby /home/monolith/.rvm/gems/ruby-2.1.1/wrappers/ruby;

  include       mime.types;
  default_type  application/octet-stream;

  sendfile        on;
  keepalive_timeout  65;

  server {
    listen       80;
    server_name  localhost;

    location / {
      root /srv/ui/public/;
      passenger_enabled on;
    }
    location /api {
      root /srv/api/public/;
      passenger_enabled on;
    }

    error_page   500 502 503 504  /50x.html;
      location = /50x.html {
      root   html;
    }
  }
}

使用此配置,API应用程序正在正确提供,但UI应用程序却没有。它返回500错误,并且Nginx或Rails中的日志下没有错误日志。

尝试解决方案/调试
  1. echo 'test' > /srv/ui/public/index.html。这导致成功呈现'测试' 访问<hostname>.com/

  2. 使用location /指令更改alias以提供静态index.html。这也有效。

  3. 我在/位置https://www.chiliproject.org/boards/1/topics/545内看到了这种符号链接文件的解决方案,但如果没有提供 API 应用,这将是相关的。

    我怀疑这与乘客实例之间的干扰有关,但我不知道解决方案是什么。

1 个答案:

答案 0 :(得分:-1)

我们之前已经实现了这一点(尽管使用了Apache - 也许我们可以为Nginx工作):

#app/apache2/apache2.conf
<VirtualHost *:80>
   ServerName *********.co.uk

   DocumentRoot /apps/[main_app]/current/public
    <Directory /apps/[main_app]/current/public>
        Allow from all
        Options -MultiViews
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   <Directory "/usr/lib/cgi-bin">
      AllowOverride None
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
      Order allow,deny
      Allow from all
   </Directory>

   #Secondry App
   Alias /[app_name] /apps/[app_name]/current/public
   <Location /[app_name]>
      PassengerAppRoot /apps/[app_name]/current
      RackEnv production
      RackBaseURI /[app_name]
   </Location>
</VirtualHost>

就Nginx而言,您可以使用以下内容:

#etc/nginx/nginx.conf
http {
   server {
      listen 80;
      server_name  yourdomain.com;

     #serve your "main" site here
     root /srv/ui/public/;
     passenger_enabled on;

     #serve your "API" app from the location / Alias
     location /api {
         root /srv/api/public/;
         passenger_enabled on;
     }
   }
}