我正在运行 Apache,并且在 Apache 中有一个如下所示.conf
的文件。site-enabled
<Virtualhost blog.example.com:80>
ServerName blog.example.com
ServerAdmin [email protected]
ProxyRequests Off
ProxyPass /phpmyadmin !
ProxyPass / http://localhost:2368/
ProxyPassReverse / http://localhost:2368/
</Virtualhost>
如您所见,我只希望blog.example.com
ProxyPass 命令处理命中。然而,它实际上影响了所有其他域example.com
。other.example.com
我这里遗漏了什么吗?
如果 ProxyPass 的工作方式如此,那么有什么方法可以告诉它在检测到物理文件和目录时忽略它吗?
启用其他站点(只有一个站点在 ruby 下运行,其余站点遵循第一种形式):
<VirtualHost other.example.com:80>
ServerName other.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/other
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<Virtualhost other2.example.com:80>
ServerName other2.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/rails/other2/public
<Directory /var/www/html/rails/other2/public>
AllowOverride all
Options -MultiViews
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
PassengerUser www-data
PassengerAppEnv production
PassengerRuby /usr/local/rvm/gems/ruby-2.1.2/wrappers/ruby
</Virtualhost>
答案1
这是不是最佳实践在定义中使用 FQDN VirtualHost
,可能会导致此类意外问题。我猜想一些主机名在服务器内解析为与发送请求的 IP 地址不同的 IP 地址。这可能会阻止 Apache 匹配正确的虚拟主机。
因此,VirtualHost
可以对所有虚拟主机进行如下定义更改,以便我们可以确保 Apache 匹配基于正确名称的虚拟主机。
<VirtualHost *:80>
or
<VirtualHost [insert public IP here]:80>
另一点需要注意的是,如果您希望example.com
由默认主机以外的虚拟主机来处理请求,则需要一个ServerAlias mydomain
指令。
本页详细介绍了基于名称的虚拟主机的工作原理——http://httpd.apache.org/docs/current/vhosts/name-based.html
答案2
像这样调整你的配置。注意我为VirtualHost
指令。最佳做法是只使用通配符 ( *
)VirtualHost
指令。此外,我还设置了ServerAlias
分隔和格式化配置,以便于阅读,这在调试此类问题时很有帮助。此外,我还将配置设置mod_proxy
为更接近我喜欢用于此类内容的标准公式。
另外,通过运行检查虚拟主机设置的输出,sudo apachectl -S
看看您能看到什么。
<Virtualhost *:80>
ServerName blog.example.com
ServerAlias blog.example.com
ServerAdmin [email protected]
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
</Proxy>
ProxyPass /phpmyadmin !
ProxyPass / http://localhost:2368/
ProxyPassReverse / http://localhost:2368/
</IfModule>
</Virtualhost>
<VirtualHost *:80>
ServerName other.example.com
ServerAlias other.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/other
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<Virtualhost *:80>
ServerName other2.example.com
ServerAlias other2.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/rails/other2/public
<Directory /var/www/html/rails/other2/public>
AllowOverride all
Options -MultiViews
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
PassengerUser www-data
PassengerAppEnv production
PassengerRuby /usr/local/rvm/gems/ruby-2.1.2/wrappers/ruby
</Virtualhost>