繁体   English   中英

通过Nginx代理后面的乘客独立服务的Rails应用

[英]Rails app served via Passenger standalone behind an nginx proxy

我有两个应用程序: /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方法,但都没有用。
  • 这个答案很接近,但是passenger_base_uri对股票nginx无效。
  • 因此,我遵循了用于Passenger的nginx配置的高级配置说明 ,并添加了passenger_base_uri = '/foo'; 到我的自定义conf文件并按如下方式加载:

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

仍然没有爱,我没有主意。 有人做过吗? 这似乎是在生产环境中部署多个应用程序的常用方法。


更多想法(2015-06-05)

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

  • 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. 按照高级配置获取项目特定的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 } 

之后,(重新)启动您的nginx代理,您应该擅长http://your_proxy/foo/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM