所以我有两个应用程序想在服务器上运行。一个应用程序我想成为“默认”应用程序——也就是说,默认情况下,所有 URL 都应发送到这个应用程序,除了对于某条路径,我们称之为/foo
:
http://mydomain.com/ -> app1
http://mydomain.com/apples -> app1
http://mydomain.com/foo -> app2
我的两个机架应用程序安装如下:
/var
/www
/apps
/app1
app.rb
config.ru
/public
/app2
app.rb
config.ru
/public
app1 -> apps/app1/public
app2 -> apps/app2/public
(app1
并且app2
是指向其各自应用程序的公共目录的符号链接)。这是此处描述的子 URI 的 Passenger 设置:http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rack_to_sub_uri
使用以下配置我将/foo
进入app2:
server {
listen 80;
server_name mydomain.com;
root /var/www;
passenger_enabled on;
passenger_base_uri /app1;
passenger_base_uri /app2;
location /foo {
rewrite ^.*$ /app2 last;
}
}
现在,我该如何让 app1 接收其他所有内容?我尝试了以下操作(放置在指令之后location /foo
),但我得到了 500 错误,其中有一个无限内部重定向error.log
:
location / {
rewrite ^(.*)$ /app1$1 last;
}
我希望该last
指令可以阻止无限重定向,但我想不是。/foo
出现相同的错误。
有什么想法吗?谢谢!
答案1
我设法使以下内容工作。对于您的示例,您想要的目录和符号链接结构是这样的。
/var
/www
/apps
/app1
app.rb
config.ru
/public
/foo -> /var/www/apps/app2/public
/app2
app.rb
config.ru
/public
你的 nginx 服务器块将如下所示:
server {
listen 80;
server_name mydomain.com;
root /var/www/apps/app1/public;
passenger_enabled on;
passenger_base_uri /foo;
}
干杯,迈克·D。
答案2
如果应用程序不是紧密相关的,您可能应该使用子域名。
server {
listen 80;
server_name app1.mydomain.com;
root /var/www/apps/app1;
passenger_enabled on;
passenger_base_uri /app1;
}
如果子域名不是一个选项,那么别名指令可能会有用。
答案3
您是如何通过 nginX 解决这个问题的?我试过这种方法,也尝试过通过 Passenger 解决。但两边都失败了。
答案4
你可以在 Sinatra 本身的 MMVC(Multi MVC)中使用 rack 进行更改,而不是在 nginx 中进行更改
run Rack::Cascade.new [ IndexApp, BlogApp, TestApp, ThisApp, ThatApp]
使用此功能,您可以使用 nginx 乘客运行多个应用程序。由于乘客需要公共文件夹,我创建了一个虚拟公共文件夹,并在公共文件夹下创建了用于管理个人资产的文件夹,例如 public/blog/ public/index public/test 等。