项目

常规

个人资料

操作

单域多站点的子URI

为什么我们需要在一个域中为多站点使用SubURI

当你手头有很多网站时,该如何部署?它们之间应该是什么关系?如果你很有钱,且从不考虑金钱,那么你可以在一台服务器机器上部署它们一个站点。但是,正如你所知,我们程序员,并没有那么富有,所以...我们可能考虑在一台服务器机器上部署多站点,也许我们只想在只有一个网络接口卡的服务器机器上部署它们,这意味着只有一个IP地址。一个IP地址,有两种解析方式(如果出错,请告诉我),一种是虚拟主机(需要配置DNS服务器的A记录),另一种是多目录。在这里,我想谈谈第二种。

它看起来像什么

多目录部署方式,称之为子URI方式,看起来是这样的
  • 假设域名是 "pfg.com"(IP地址没问题),
  • 有两个或更多的rails应用程序,app1,app2,... appN
  • ubuntu 8.04服务器
  • Web服务器是apache2.2
  • Ruby 1.8.6
  • mongrel-1.1.5(这是一个选项)
  • Rails 2.1.x或Rails 2.2.x(有一些差异)
http://pfg.com/app1
http://pfg.com/app2
...
http://pfg.com/appN

接下来,我将告诉您如何配置它们。

如何在Rails应用程序中配置它们

我们需要配置三步,第一步是配置apache2.2,第二步是rails应用程序,最后一个是关于mongrel的。

配置apache2.2

首先,我想让rails应用程序以CGI方式运行。
我们添加一个VirtualHost块,监听所有端口

NameVirtualHost *
<VirtualHost *>
    ...
</VirtualHost>

之后,我们需要创建一个DocumentRoot,并将所有应用的符号链接都放在这里(不要链接到app*/public)。

<VirtualHost *>
    DocumentRoot "/var/www/" 
</VirtualHost>

#ls -l /var/www/
-lrwxrwxrwx ..... app1 -> /home/jean/app1
-lrwxrwxrwx ..... app2 -> /home/jiong/app2
...
-lrwxrwxrwx ..... appN -> /home/eric/appN

之后,我们有了虚拟主机和文档根,接下来我们需要添加Alias指令,针对所有rails应用程序。

<VirtualHost *>
    DocumentRoot "/var/www/" 
    Alias /myapp1 "/var/www/app1/public/" 
    Alias /yourapp2 "/var/www/app2/public/" 
    Alias /hisappN "/var/www/appN/public" 
</VirtualHost>

别名名称是子URI。**注意:这里不要将子URI名称与符号链接的名称相同,这很重要**

之后,我们需要配置Directory块,如下所示

...
    Alias /myapp1 "/var/www/app1/public/" 
    <Directory "/var/www/app1/public/">
         Options FollowSymLinks +ExecCGI
         AllowOverride all
         Order allow,deny
         Allow from all
    </Directory>
...

之后,apache2.2的配置就完成了。要以CGI方式运行,我们还需要配置rails应用程序。所以,请看下一部分。

其次,配置rails应用程序

进入你的rails应用程序,这样做

# cd /home/jiong/app1/config/
# vim environment.rb
=> add code:
Rails 2.1.x: add *ActionController::AbstractRequest.relative_url_root="/myapp1"* At the end of file (must the end of file.)
Rails 2.2.x, two way: 
    one is: add *ActionController::Base.relative_url_root="/myapp1"* At the end of file
    other : add *config.action_controller.relative_url_root="/myapp1"* in the block.

没有此配置,访问网站时将显示错误:路由错误:{ /myapp1/ 错误} Get。

配置dispatch.cgi

# cd /home/jiong/app1/public/
# mv dispatch.cgi.example dispatch.cgi
# chmod a+x dispatch.cgi
# which ruby
/usr/local/bin/ruby => It depend on your system.
# vim dispatch.cgi
=> change the first line to #!/usr/local/bin/ruby
test dispatch.cgi.
# sudo -u www-data ./dispatch.cgi
=> success: will show the home page source code for you.

其他所有rails应用程序也应如此操作。

重新启动您的apache2.2服务器,然后您可以访问它们: http://pfg.com/myapp1/http://pfg.com/yourapp2/http://pfg.com/hisappN

如果您只想以CGI方式运行,那么这就结束了。

第三,添加mongrel-1.1.5

Mongrel在apache2.2上运行,apache2.2使用代理。

首先,配置mongrel,进入您的rails应用程序

# cd /home/jiong/app1/
# mongrel_rails <TBD.>
# ln -s /home/jiong/app1/config/mongrel_cluster.yml /etc/mongrel_cluster/app1.yml

您可以首先测试mongrel, http://127.0.0.1:8000/myapp1/...

然后,再次配置apache2.2,添加以下内容

...
    <Directory ...>
       ...
    </Directory>

    <Proxy balancer://app1_cluster>
        Order allow,deny
        Allow from all
        balancer 127.0.0.1:8000
        balancer 127.0.0.1:8001
        balancer 127.0.0.1:8002
    </Proxy>
    RewriteCond <TBD.>
    RewriteRule ^/app1/?(.*)$ balancer://app1_cluster/$1 [QSA,L]
...

完成这些后,一切就绪。

注意

待办事项

Mischa The Evil 更新 近14年前 · 3次修订