这是我的"etc/hosts"文件中的内容:
127.0.0.1本地主机
127.0.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的"/"处理按StoreController#索引为HTML完成500内部服务器错误3毫秒
ActiveRecord::StatementInvalid(找不到表"carts"(:
app/controllers/application_controller.rb:46:inrescue in current_cart' app/controllers/application_controller.rb:44:in
current_cart'app/controlers/store_controller.rb:11:in `index'
我想我的数据库配置有问题,因为表存在,但找不到。
无论如何,我的问题是hosts文件是如何知道"depart.yourhost.com"意味着打开rails应用程序和"localhost"列出我的"var\www"文件夹的——我认为RoR使用的是端口3000。
为什么80端口没有冲突?
Rails应用程序在使用轻量级Webrick服务器运行时在端口3000下运行。由于您使用mod_passenger运行Apache,因此根据您的Apache配置,该应用程序将在端口80可用。
hosts文件包含一个条目127.0.0.1 depot.yourhost.com
,该条目将该域名定向到本地适配器127.0.0.1。在需要咨询名称服务器以检索名称地址之前,应始终检查hosts文件。
接下来,您的Apache配置包括一个VirtualHost
,由于中的*
,它正在侦听所有网络适配器
<VirtualHost *:80>
您的Apache配置必须设置为使用基于名称的虚拟主机,之后ServerName
变量将与请求提供给depot.yourhost.com
的HTTP_HOST
请求标头相匹配。
因此,您可以根据需要使用同一IP地址上的端口80拥有任意多个VirtualHost
,Apache将根据HTTP_HOST
标头决定将请求路由到哪个。
最后,mod_passenger将通过检查您在VirtualHost配置中指定的DocumentRoot
周围的目录内容来检测应用程序是否是RubyonRails应用程序。如果发现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
配置不包含指令:
Options -Indexes
将其添加到全局httpd.conf
中,以防止在服务器范围内列出目录。