В AWS не работает липкая сессия?
У меня есть веб-приложение, запущенное в экземплярах tomcat на EC2, и я не могу на протяжении всей своей жизни заставлять липкие сессии работать на балансировщике нагрузки. Я выполнил все шаги, описанные в http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html, попытался использовать как приложение (с использованием файла cookie JSESSIONID), так и время. основанные (с использованием 86400 секунд) методы, но в любом случае это не работает вообще. Один и тот же пользователь постоянно получает доступ ко всем различным узлам... каждый раз, когда он щелкает новую ссылку на веб-странице, он возвращает его обратно на домашний экран для повторного входа в систему.
Я понятия не имею, почему это не работает. Я также не очень много знаю об этом (черт возьми, пока 2 часа назад я даже не знал, что означает "липкая сессия" - и нет, я не могу просто заставить кого-то сделать это), поэтому я Я не совсем уверен, с чего начать с отладки.
РЕДАКТИРОВАТЬ: Глядя на мои куки... кажется, что куки AWSELB продолжает удаляться и перезаписываться каждый раз, когда я загружаю сайт, вместо того, чтобы сохраняться, как это должно быть.
РЕДАКТИРОВАТЬ 2: XML-конфигурация моего балансировщика нагрузки:
{
"LoadBalancerDescriptions": [
{
"Subnets": [
"subnet-5c83aa39",
"subnet-6a778830",
"subnet-c41cdde8"
],
"CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
"CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
"ListenerDescriptions": [
{
"Listener": {
"InstancePort": 5432,
"LoadBalancerPort": 5432,
"Protocol": "TCP",
"InstanceProtocol": "TCP"
},
"PolicyNames": []
},
{
"Listener": {
"InstancePort": 8888,
"LoadBalancerPort": 8888,
"Protocol": "HTTP",
"InstanceProtocol": "HTTP"
},
"PolicyNames": [
"AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
]
}
],
"HealthCheck": {
"HealthyThreshold": 2,
"Interval": 10,
"Target": "HTTP:44554/",
"Timeout": 8,
"UnhealthyThreshold": 4
},
"VPCId": "vpc-721bec0b",
"BackendServerDescriptions": [],
"Instances": [
{
"InstanceId": "i-0ca9c244ed930d58f"
},
{
"InstanceId": "i-0cf47dc916f3f3443"
},
{
"InstanceId": "i-09ce2f24abc50259f"
}
],
"DNSName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
"SecurityGroups": [
"sg-f5ff638b"
],
"Policies": {
"LBCookieStickinessPolicies": [
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500564994754",
"CookieExpirationPeriod": 86400
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500565103581",
"CookieExpirationPeriod": 0
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500566463445",
"CookieExpirationPeriod": 28800
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500566440580",
"CookieExpirationPeriod": 0
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500476922828",
"CookieExpirationPeriod": 86400
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500481383343",
"CookieExpirationPeriod": 86400
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500479370743",
"CookieExpirationPeriod": 86400
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500475843862",
"CookieExpirationPeriod": 86400
},
{
"PolicyName": "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135",
"CookieExpirationPeriod": 86400
}
],
"AppCookieStickinessPolicies": [
{
"PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500477157435",
"CookieName": "JSESSIONID"
},
{
"PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500472642494",
"CookieName": "JSESSIONID"
},
{
"PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500473344752",
"CookieName": "JSESSIONID"
},
{
"PolicyName": "AWSConsole-AppCookieStickinessPolicy-<ELB_NAME>-1500473227851",
"CookieName": "JSESSIONID"
}
],
"OtherPolicies": []
},
"LoadBalancerName": "<ELB_NAME>",
"CreatedTime": "2017-07-18T15:32:33.890Z",
"AvailabilityZones": [
"us-east-1a",
"us-east-1b",
"us-east-1c"
],
"Scheme": "internet-facing",
"SourceSecurityGroup": {
"OwnerAlias": "558554867759",
"GroupName": "<redacted>"
}
}
]
}
РЕДАКТИРОВАТЬ 3: Кто-нибудь? Пожалуйста, я отчаялся, мне нужно, чтобы это работало...
2 ответа
У вас есть много разных политик, созданных с разными конфигурациями, но только один связан с прослушивателем, и тот, который основан на времени.
"LoadBalancerDescriptions": [
{
"Subnets": [
"subnet-5c83aa39",
"subnet-6a778830",
"subnet-c41cdde8"
],
"CanonicalHostedZoneNameID": "Z35SXDOTRQ7X7K",
"CanonicalHostedZoneName": "<ELB_NAME>-<redacted>.us-east-1.elb.amazonaws.com",
"ListenerDescriptions": [
{
"Listener": {
"InstancePort": 5432,
"LoadBalancerPort": 5432,
"Protocol": "TCP",
"InstanceProtocol": "TCP"
},
"PolicyNames": []
},
{
"Listener": {
"InstancePort": 8888,
"LoadBalancerPort": 8888,
"Protocol": "HTTP",
"InstanceProtocol": "HTTP"
},
"PolicyNames": [
here ----> "AWSConsole-LBCookieStickinessPolicy-<ELB_NAME>-1500995555135"
]
}
],
Документация указывает вам, как связать политику со слушателем: http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html
Попробуйте связать только одну из политик AppCookieStickinessPolicies, которая использует JSESSIONID для слушателя
Во-первых, как работает эта липкая штука! ELB просто добавляет файл cookie AWSELB (или может быть другим именем; вы можете просто найти все файлы cookie и посмотреть, какой из них НЕ ваш) в самый первый раз. Этот файл cookie также содержит информацию о том, на какой сервер должен поступить этот запрос.
Теперь все запросы, поступающие от одного и того же браузера, будут иметь этот cookie, и ELB будет знать, куда их пересылать. Здесь нет ничего особенного, что не сработает.
Давайте сделаем следующее:
Можете ли вы выслать мне сайт / веб-приложение, которое вы пытаетесь? Если это доступно в общественных местах. Потому что даже я могу отладить это.
Убедитесь, что куки разрешены; хотя похоже из твоего вопроса, что это не проблема.
Какой срок действия вы установили на Edit Stickiness! Убедитесь, что, когда на ELB -> нажмите Edit Stickiness -> Select Radio button "Включить сгенерированную балансировщиком нагрузки наклейку cookie" и САМОЕ ВАЖНО, оставьте срок действия пустым.
Повторите шаг 3 для HTTPS также, если вы используете HTTPS.
Дайте мне знать, если это работает; Я здесь только на следующий час.
Не уверен, почему ваш XML показывает так много LBCookieStickinessPolicies!!