是否可以在同一个域上运行两个不同的Rails应用程序(使用子目录)?

时间:2012-10-18 09:03:24

标签: ruby-on-rails ruby-on-rails-3 routing nginx

我有一个我在Rails 3.1中开发的游戏,我想在不必升级它的情况下添加到现有的Rails 2.3.8中。是否可以将此3.1游戏应用程序存在于同一个域中,例如http://mydomain.com/game?所以任何带/游戏的网址都会指向Rails 3.1应用程序,而所有其他网址都指向常规的2.3应用程序?我如何使用nginx使用子目录(我宁愿不使用子域并丢失seo)来处理这个问题?

2 个答案:

答案 0 :(得分:2)

你可以这样做,但它更容易使用像game.mydomain.com这样的子域,因为那时你可以使用nginx处理这个问题。对于不同的ruby和rails版本的分离,请使用rvm(https://rvm.io/)。

然后你可以像这样创建一个nginx配置:

upstream mydomain.com {
        server unix:/var/run/thin/mydomain.0.sock;
        server unix:/var/run/thin/mydomain.1.sock;
        server unix:/var/run/thin/mydomain.2.sock;
        server unix:/var/run/thin/mydomain.3.sock;
}
upstream game.mydomain.com {
        server unix:/var/run/thin/game.mydomain.0.sock;
        server unix:/var/run/thin/game.mydomain.1.sock;
        server unix:/var/run/thin/game.mydomain.2.sock;
        server unix:/var/run/thin/game.mydomain.3.sock;
}
server {
        listen 80;
        server_name mydomain.com;
        access_log /path/to/rails/app/log/access.log;
        error_log /path/to/rails/app/log/error.log;
        root /path/to/rails/app/public;
        index index.html;
        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;

                if (-f $request_filename/index.html) {
                        rewrite (.*) $1/index.html break;
                }

                if (-f $request_filename.html) {
                        rewrite (.*) $1.html break;
                }

                if (!-f $request_filename) {
                        proxy_pass http://mydomain.com;
                        break;
                }
        }
}
server {
        listen 80;
        server_name game.mydomain.com;
        access_log /path/to/rails/app/log/access.log;
        error_log /path/to/rails/app/log/error.log;
        root /path/to/rails/app/public;
        index index.html;
        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;

                if (-f $request_filename/index.html) {
                        rewrite (.*) $1/index.html break;
                }

                if (-f $request_filename.html) {
                        rewrite (.*) $1.html break;
                }

                if (!-f $request_filename) {
                        proxy_pass http://game.mydomain.com;
                        break;
                }
        }
}

如果可以使用子域而不是子文件夹,那么应该为你做。

如果您真的想使用子目录,可以使用nginx location指令执行此操作:

http://wiki.nginx.org/HttpCoreModule#location

答案 1 :(得分:0)

在您不希望导致现有应用程序出现问题的子域上运行它。