
У меня есть NGINX в качестве обратного прокси-сервера и два Apache в качестве вышестоящих серверов.
Всякий раз, когда я посещаю example.com (направленный на NGINX), оба сервера Apache получают запрос GET. Это кажется странным, так как NGINX по умолчанию работает на основе метода Round Robin
Вот моя конфигурация:-
upstream apache {
server 172.18.0.164;
server 172.18.8.18;
}
location / {
proxy_pass http://apache;
}
Журналы на машине Apache 1:-
192.168.10.236 - - [05/10/2015:07:59:21 -0400] "GET / HTTP/1.0" 200
Журналы на машине Apache 2:-
172.18.8.97 - - [05/10/2015:11:59:27 +0000] "ПОЛУЧИТЬ /wordpress/ HTTP/1.0"
решение1
Прямо изРуководство администратора Nginx:
Включение сохранения сеанса
NGINX Plus поддерживает три метода сохранения сеанса. Методы задаются с помощьюлипкийдиректива.
Theлипкое печеньеметод. С помощью этого метода NGINX Plus добавляет сеансовый cookie к первому ответу от вышестоящей группы и идентифицирует сервер, который отправил ответ. Когда клиент выдает следующий запрос, он будет содержать значение cookie, и NGINX Plus направит запрос на тот же самый вышестоящий сервер:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
В примере srv_id
параметр задает имя cookie, который будет установлен или проверен. Необязательный expires
параметр задает время, в течение которого браузер будет хранить cookie. Необязательный domain
параметр определяет домен, для которого устанавливается cookie. Необязательный path
параметр определяет путь, для которого устанавливается cookie. Это простейший метод сохранения сеанса.
Theлипкий маршрутметод. С помощью этого метода NGINX Plus назначит клиенту «маршрут» при получении первого запроса. Все последующие запросы будут сравниваться смаршрутпараметрсервердиректива для определения сервера, на котором будут проксироваться запросы. Информация о маршруте берется из cookie или URI.
upstream backend {
server backend1.example.com route=a;
server backend2.example.com route=b;
sticky route $route_cookie $route_uri;
}
Theузнать кукиметод. С помощью этого метода NGINX Plus сначала находит идентификаторы сеансов, проверяя запросы и ответы. Затем NGINX Plus «узнает», какой вышестоящий сервер соответствует какому идентификатору сеанса. Обычно эти идентификаторы передаются в HTTP-cookie. Если запрос содержит уже «изученный» идентификатор сеанса, NGINX Plus перенаправит запрос на соответствующий сервер:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky learn
create=$upstream_cookie_examplecookie
lookup=$cookie_examplecookie
zone=client_sessions:1m
timeout=1h;
}
В этом примере один из вышестоящих серверов создает сеанс, устанавливая cookie-файл «EXAMPLECOOKIE» в ответе.
Обязательный параметр create
указывает переменную, которая указывает, как создается новый сеанс. В нашем примере новые сеансы создаются из cookie «EXAMPLECOOKIE», отправленного вышестоящим сервером.
Обязательный параметр lookup
указывает, как искать существующие сеансы. В нашем примере существующие сеансы ищутся в cookie «EXAMPLECOOKIE», отправленном клиентом.
Обязательный параметр zone
указывает зону общей памяти, в которой хранится вся информация о липких сессиях. В нашем примере зона имеет имя client_sessions
и размер 1 мегабайт.
Это более сложный метод сохранения сеанса, поскольку он не требует сохранения каких-либо файлов cookie на стороне клиента: вся информация хранится на стороне сервера в зоне общей памяти.