Rails应用程序通过独立于Nginx代理的Passenger独立服务

时间:2015-06-04 14:25:44

标签: ruby-on-rails ruby-on-rails-4 nginx passenger

我有两个应用:/foo/bar。在每个文件夹中,我都是乘客。对于foo:

passenger start -d -e production -p 4000

对吧:

passenger start -d -e production -p 4001

然后我就像这样配置了nginx:

server {
  listen 80 default_server;
  server_name www.server.com;
  root /var/www/html;

  location /foo/ {
      proxy_pass http://0.0.0.0:4000/;
      proxy_set_header Host $host;
  }

  location /bar/ {
      proxy_pass http://0.0.0.0:4001/;
      proxy_set_header Host $host;
  }
}

应用程序正在提供服务,但没有一个链接有效。 users#index操作的链接以'/users'而非'/foo/users'的形式返回。

  • 我在两个应用中都设置了 config.relative_url_root ,这有助于资产而不是链接。
  • 我已尝试使用_url_path两种方法,但都无法正常工作。
  • answer已关闭,但 passenger_base_uri 不是股票nginx的有效指令。
  • 然后,我按照advanced configuration instructions获取了Passenger的nginx配置,并将passenger_base_uri = '/foo';添加到我的自定义配置文件中并按如下方式加载:

    乘客启动-d -e production -p 4000 --nginx-config-template nginx.conf.erb

仍然没有爱,而且我没有想法。有没有人这样做过?这似乎是在生产中部署多个应用程序的常用方法。

更多想法(2015-06-05)

passenger_base_uri = '/foo'添加到我的 nginx.conf.erb 文件中,将应用程序托管在两个位置(这对我来说很奇怪,但无论如何):

  • localhost:4000/
  • localhost:4000/foo/

第一个没有正确的资源链接(即它只是'/users'),但可以访问其资产。

第二个拥有正确的资源链接(例如'/foo/users'),但没有资产(这是因为它在公众内部寻找/foo/assets/* 文件夹,而不仅仅是/assets/*)。我相信这是可行的方法,因为我可以像这样更改我的代理来获取应用程序:

location /foo/ {
    proxy_pass http://0.0.0.0:4000/foo/;
    proxy_set_header Host $host;
}

有没有人有任何想法?如果我这样做,那就意味着我必须将我的资产转移到 public / foo 才能运作。不是世界末日,但它似乎仍然很奇怪。

1 个答案:

答案 0 :(得分:1)

对于其他任何想要做同样事情的人来说,这就是最终的结果:

  1. 按照Advanced Configuration获取项目特定的 nginx.conf.erb 文件。
  2. 为您的应用添加 passenger_base_uri 指令(例如passenger_base_uri = '/foo';
  3. config / environments / production.rb 文件中移动资产的位置:config.assets.prefix = '/foo/assets'
  4. 开始乘客passenger start -d -e production -p SOME_PORT --nginx-config-template nginx.conf.erb
  5. 在您的nginx代理配置中,为您的应用添加位置指令:

    location /foo/ {
        proxy_pass http://0.0.0.0:SOME_PORT/foo/;
    
        proxy_buffering off;
        proxy_http_version 1.1;
    
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host; # more robust than http_host
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # this ensures your app's env is correct
        proxy_set_header X-Forwarded-Host $host;
        # proxy_set_header X-Forwarded-Proto https; # add this if you always want the redirects to go to HTTPS
    }
    
  6. 之后,(重新)启动你的nginx代理,你应该擅长http://your_proxy/foo/