Я использую Apache и имею .conf
файл как site-enabled
в apache, как показано ниже.
<Virtualhost blog.example.com:80>
ServerName blog.example.com
ServerAdmin admin@example.com
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 admin@example.com
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 admin@example.com
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>
Настройте свои конфиги вот так. Обратите внимание на подстановочные знаки, которые я установил для VirtualHost
директива. Лучше всего использовать подстановочный знак (*
) VirtualHost
директива. Также я установил ServerAlias
а также разнесены и отформатированы конфигурации для облегчения чтения, что полезно при отладке подобных проблем. Также я установил mod_proxy
config, чтобы более точно соответствовать стандартной формуле, которую я люблю использовать для этого материала.
Также проверьте вывод настройки вашего виртуального хоста, запустив sudo apachectl -S
чтобы увидеть то, что вы видите.
<Virtualhost *:80>
ServerName blog.example.com
ServerAlias blog.example.com
ServerAdmin admin@example.com
<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 admin@example.com
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 admin@example.com
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>
это не лучшая практика использовать полное доменное имя в VirtualHost
определение, это может вызвать непредвиденные проблемы, подобные этой. Я предполагаю, что некоторые из имен хостов разрешаются внутри сервера на 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