У меня nginx как LB. И 2 Apache как веб-серверы. Допустим, у меня разные домены:
- www.example.com
- checkout.example.com
Оба домена будут на тех же 2 серверах Apache. Но, конечно, в разных каталогах. И с разными VHost
файлами в файле Apache vhost.
Как что-то вроде следующего дизайна:
Nginx
|
-------------
| |
Apache Apache
Ниже представлен мой текущий файл .conf Nginx, который не работает для второго домена (checkout.example.com).
Из NGINX (mysites.conf):
upstream serverpool {
server 1.2.3.101:80 weight=1;
server 1.2.3.102:80 weight=1;
}
server {
listen 80;
server_name www.example.com checkout.example.com;
location / {
proxy_pass http://serverpool;
}
}
С обоих двух серверов Apacheтакой жеФайлы Vhost (httpd.conf):
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html/www.example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName checkout.example.com
DocumentRoot /var/www/html/checkout.example.com/
</VirtualHost>
Но всякий раз, когда я это просматриваю (http://checkout.example.com),Домен все еще появляетсяв браузере ..но с содержимым (www.example.com), что совершенно неверно.
Что я сделал не так, пожалуйста?
решение1
Вы должны почти всегда устанавливать Host
заголовок. В противном случае nginx возвращается к настройкам по умолчанию, proxy_set_header Host $proxy_host;
что в вашем случае было бы serverpool
бесполезно для apache.
Видетьhttp://nginx.org/r/proxy_set_headerиhttp://nginx.org/r/proxy_passдля получения подробной информации.
upstream serverpool {
server 1.2.3.101:80 weight=1;
server 1.2.3.102:80 weight=1;
}
server {
listen 80;
server_name www.example.com checkout.example.com;
location / {
proxy_pass http://serverpool;
proxy_set_header Host $host;
}
}
решение2
вам также нужно будет отправить заголовок HOST: на IP-адрес вашего вышестоящего сервера
эта статья полностью отвечает на вопрос
Заставьте nginx передавать имя хоста восходящего потока при обратном проксировании
также ваш конфиг nginx должен выглядеть так
upstream serverpool {
server 1.2.3.101:80 weight=1;
server 1.2.3.102:80 weight=1;
}
server {
listen 80;
server_name www.example.com checkout.example.com;
location / {
proxy_pass http://serverpool;
proxy_set_header Host $host;
}
}