我在 Apache2 上为多个 PHP 网站提供服务。现在,我还想使用 mod_passenger 为 Rails 应用程序提供服务。
问题是:当我将 mod_passenger 设置为监听 railsapp.com:81 时,它起作用了。PHP 网站也能正常工作。现在,如果我设置 railsapp.com:80,所有网站都会显示 rails 应用程序,不再显示 PHP 网站!
# cat phpsite.com
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName phpsite.com
DocumentRoot /var/www/phpsite.com
<Directory /var/www/phpsite.com>
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>
# cat railsapp.com
<VirtualHost railsapp.com:81>
ServerName railsapp.com
DocumentRoot /var/railsapp.com/public
<Directory /var/railsapp.com/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
这样,rails 应用程序就可以在端口 81 上运行,而其他站点则可以在其“正常”地址上运行,即无需指定端口。当我将第二个文件更改为以下内容时:
# cat railsapp.com
<VirtualHost railsapp.com:80> #<-------------- 81 -> 80
ServerName railsapp.com
DocumentRoot /var/railsapp.com/public
<Directory /var/railsapp.com/public>
AllowOverride all
Options -MultiViews
</Directory>
</VirtualHost>
然后所有站点都会显示 railsapp,尽管它明确指出只在 railsapp.com:80 上监听。
有任何想法吗?
谢谢你,MrB
答案1
您的 VirtualHost 声明有点吓人。您确实不希望在 VirtualHost 标记中使用主机名“railsapp.com”。您需要一个 IP 地址或通配符。我建议您将所有 VirtualHost 设置为:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName railsapp.com
ServerAlias www.railsapp.com
...
</VirtualHost>
<VirtualHost *:80>
ServerName phpsite.com
ServerAlias www.phpsite.com
...
</VirtualHost>
ServerAlias 很重要,因为在您提供的配置中,前面加上 www.*.com 的网站将转到默认VirtualHost,这是该接口:端口组合的第一个 VirtualHost。这可能是他们访问 rails 应用程序的原因。
编辑:更明确地说,任何与 VirtualHost 的 ServerName/ServerAlias 不匹配的 IP:Port 组合的连接都将转到该接口的默认 VirtualHost。出于这个原因,我通常有一个配置文件(在 debian 中,我将其放在 sites-enabled 中的 000-defualt.conf 中),它抓取所有不匹配的流量并将其发送到默认页面,如下所示:
<VirtualHost 10.1.2.3:80>
DocumentRoot /var/www/bad-hostname/
<Directory /var/www/bad-hostname>
....
</Directory>
</VirtualHost>
这有助于调试基于名称的虚拟主机,并防止那些没有主机标头就访问我的 IP 的人看到服务器上的任何内容。