我有两个应用:/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
两种方法,但都无法正常工作。然后,我按照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 才能运作。不是世界末日,但它似乎仍然很奇怪。
答案 0 :(得分:1)
对于其他任何想要做同样事情的人来说,这就是最终的结果:
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/
。