Ruby on Rails - etc / hosts配置文件

时间:2013-01-14 18:34:16

标签: ruby-on-rails-3 apache hosts

这就是我在“etc / hosts”文件中的内容:

  

127.0.0.1 localhost

     

127.0.1.1 gotqn-System-Product-Name

     

127.0.0.1 depot.yourhost.com

这就是我在apache2.conf文件中添加的内容:

<VirtualHost *:80>

   ServerName depot.yourhost.com

   DocumentRoot "/home/gotqn/Aptana Projects/depot/public/"

   <Directory "/home/gotqn/Aptana Projects/depot/public">

      AllowOverride all

      Options -MultiViews

      Order allow,deny

      Allow from all

   </Directory>

</VirtualHost>

当我输入 http:// localhost / 时,我的浏览器会列出“var \ www”文件夹中的所有文件,当我输入 http://depot.yourhost.com/时它会显示以下错误:

  

我们很抱歉,但出了点问题。

我检查了rails应用程序的production.log文件,并说:

  

连接到database.yml指定的数据库

     

在2013-01-13 20:32:41 +0200处理开始获取127.0.0.1的GET“/”   by StoreController #index as HTML Completed 500 Internal Server Error   在3ms

     

ActiveRecord :: StatementInvalid(找不到表'推车'):
  app / controllers / application_controller.rb:46:在rescue in current_cart' app/controllers/application_controller.rb:44:in current_cart'app / controllers / store_controller.rb:11:在`index'

我认为我的数据库配置有问题,因为该表存在但找不到。

无论如何,我的问题是hosts文件如何知道“depot.yourhost.com”意味着打开rails应用程序而“localhost”列出我的“var \ www”文件夹 - 我以为RoR正在使用端口3000

为什么端口80没有冲突?

1 个答案:

答案 0 :(得分:1)

当使用轻量级Webrick服务器运行时,

Rails应用程序在端口3000下运行。由于您使用mod_passenger运行Apache,因此根据您的Apache配置,应用程序将在端口80上可用。

hosts文件包含一个条目127.0.0.1 depot.yourhost.com,用于将该域名定向到本地适配器127.0.0.1。在查询名称服务器以检索名称的地址之前,应始终检查hosts文件。

接下来,由于VirtualHost

,您的Apache配置包括一个*正在侦听所有网络适配器
<VirtualHost *:80>

您的Apache配置必须设置为使用基于名称的虚拟主机,之后ServerName变量与您HTTP_HOST请求提供的depot.yourhost.com请求标头匹配。

因此,您可以根据需要在同一IP地址上使用端口80,尽可能多地VirtualHost,Apache将根据HTTP_HOST标头决定将请求路由到哪个。

最后,mod_passenger将通过检查您在VirtualHost配置中指定的DocumentRoot周围的目录内容来检测应用程序是否是Ruby on Rails应用程序。如果它找到public目录作为其DocumentRoot并且RoR应用程序处于更高级别,则Passenger将尝试启动Rails应用程序。

现在,为什么要从localhost获取目录列表...在Apache配置的其他位置,您必须拥有与VirtualHost匹配的ServerName localhost并设置其DocumentRoot 1}}到/vart/www

<VirtualHost *:80>
  ServerName localhost
  # or...
  ServerAlias localhost
</VirtualHost>

如果您看到列出的目录的内容而不是403 Forbidden(缺少像index.html这样的索引文件),那是因为Apache服务器配置或VirtualHost配置包含指令:

Options -Indexes

在全局httpd.conf中添加它以防止在服务器范围内列出目录。