【问题标题】:Ruby on Rails - etc/hosts config fileRuby on Rails - etc/hosts 配置文件
【发布时间】:2013-01-14 18:34:16
【问题描述】:

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

127.0.0.1 本地主机

127.0.1.1 gotqn-系统-产品-名称

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 "/" 通过 StoreController#index 作为 HTML Completed 500 Internal Server Error 3毫秒

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

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

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

为什么80端口没有冲突?

【问题讨论】:

  • 看起来您在 Apache 中运行了 mod_passenger?
  • @MichaelBerkowski 是的,正确的。这就是我正在使用的 - 乘客。

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


【解决方案1】:

使用轻量级 Webrick 服务器运行时,Rails 应用程序在端口 3000 下运行。由于您使用 mod_passenger 运行 Apache,因此根据您的 Apache 配置,该应用程序将在端口 80 上可用。

hosts 文件包含一个条目127.0.0.1 depot.yourhost.com,它将该域名指向您的本地适配器 127.0.0.1。在需要查询名称服务器以检索名称地址之前,应始终检查主机文件。

接下来,您的 Apache 配置包括一个 VirtualHost,由于 * in

,它正在侦听所有个网络适配器
<VirtualHost *:80>

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

因此,您可以根据需要拥有任意数量的VirtualHosts,它们都使用同一 IP 地址上的端口 80,Apache 将根据 HTTP_HOST 标头决定将请求路由到哪个。

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

现在,至于为什么要从 localhost 获取目录列表...在 Apache 配置的其他地方,您必须有一个与 ServerName localhost 匹配的 VirtualHost,并将其 DocumentRoot 设置为 /vart/www

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

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

Options -Indexes

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

【讨论】:

  • @非常感谢您的详细回答。您能否提供一个关于如何使用 RoR+ Apache +passenger 配置这些文件的好教程,如果我没有在我的 Apache 配置文件中指定“ServerName localhost”,可以在哪里指定?
  • @gotqn 要找出它路由到 /var/www 的原因,可能在主 Apache 配置 httpd.conf 或 apache2.conf 中查找 DocumentRoot /var/www。任何其他 VirtualHost 中不匹配的 ServerName 可能会路由到全局 DocumentRoot。
  • 至于教程,我真的没有给你指点。我已经熟悉了 Apache 配置,只是做了几年的系统管理员,我发现 the Passenger docs 非常彻底,即使它们不容易导航。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2011-02-13
  • 1970-01-01
  • 2015-02-06
  • 2011-08-17
  • 2015-02-01
相关资源
最近更新 更多