[英]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'
。
_url
和_path
方法,但都没有用。 因此,我遵循了用于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中才能起作用。 不是世界末日,但看起来仍然很奇怪。
对于想要做同样事情的其他人,这就是最后的结果:
passenger_base_uri = '/foo';
) config.assets.prefix = '/foo/assets'
。 passenger start -d -e production -p SOME_PORT --nginx-config-template nginx.conf.erb
在您的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.