В настоящее время я занимаюсь разработкой лабораторной среды для миграции нашей смешанной среды Exchange 2010 и 2013 на Exchange 2016.
В течение нескольких недель я запускал в лаборатории одновременно 1x 2013 и 2x 2016, и это сработало хорошо - я провел тестирование для RPC, OWA, ActiveSync и EWS. Вроде все нормально работает.
На этой неделе я попытался завершить развертывание, представив балансировщик нагрузки впереди с планом обеспечения циклического перебора LB между моими узлами CAS 2013 и 2016 годов. Судя по всему, что я исследовал в 2013 и 2016 годах, CAS полностью совместимы для роли CAS в том, что они с радостью будут прокси-сервером между собой. И, конечно же, мое ручное тестирование через каждый CAS (без балансировщика нагрузки), похоже, это показывает.
Но теперь, когда я представил прокси-сервер HA, OWA, похоже, не хочет работать должным образом.
Вот некоторые симптомы:
Когда я вхожу в систему через OWA 2016 в почтовый ящик 2013 года, он выполняет вход правильно, перенаправляет меня и начинает загрузку почтового ящика. Но через секунду или две после загрузки почтового ящика меня перенаправляют обратно на страницу входа в OWA, как будто я никогда не входил в систему.
Я могу повторять это несколько раз и, кажется, делает то же самое, если я вхожу в систему через CAS 2016.
Иногда, когда я вхожу в систему через 2016, он просто зависает с надписью «Все еще работаю над этим». Это гораздо реже, чем просто повторный выход из системы.
Иногда он перенаправляется обратно на страницу входа так быстро, что я даже не могу сказать, что вошел в систему, и не имеет сообщения об ошибке. Это просто мгновение возврата на страницу входа в систему.
Я пробовал использовать достаточно свежие версии Chrome и Firefox на Mac и Windows 8.1. Так что это не проблема конечного устройства.
Если я вхожу в почтовый ящик 2013 года через OWA на CAS 2013 года, даже через балансировщик нагрузки, кажется, что первый раз выполняется правильный вход.
У меня есть один IP-адрес на балансировщике нагрузки, который затем перенаправляет трафик на каждый узел CAS по круговой схеме. Это то, что я использую для тестирования своего LB. У меня есть другие IP-адреса, указывающие непосредственно на отдельные узлы CAS.
Если я вхожу непосредственно в узел CAS 2016 года в почтовый ящик 2013 года, это работает нормально. Это тот случай, когда я вхожу в CAS 2016 через балансировщик нагрузки, в котором возникает проблема.
Интересно, что я только что заметил, что точно такие же проблемы возникают даже при входе в почтовый ящик 2016 года. Итак, пока я вхожу в систему CAS 2016 года, она снова выходит из системы.
После успешного входа в систему через CAS 2013 я могу обновить страницу несколько раз, и сеанс останется открытым. Для меня это означает, что проксирование должно в некоторой степени работать нормально после установления сеанса, потому что моя LB является циклической, поэтому трафик должен перераспределяться по различным узлам CAS каждый раз, когда я обновляю страницу OWA.
Мне кажется довольно очевидным, что есть другие, которые испытывают аналогичные проблемы с Exchange 2010–2016, когда находятся за балансировщиком нагрузки. К сожалению, это наш первый раз, когда мы используем балансировщик нагрузки, поскольку мы переходим с одного CAS на 3 с этим обновлением до Exchange 2016.
Я нашел несколько сообщений с похожими симптомами:
Я подтвердил, что все наши сертификаты внешнего интерфейса SSL (стороннего центра сертификации) совпадают с одним и тем же отпечатком пальца и серийным номером на всех узлах CAS. Я читал, что это может повлиять на вещи. Я использую производственный сертификат, чтобы правильно проверить свою лабораторию.
Серверные сертификаты остаются сертификатом Microsoft Exchange по умолчанию, а из того, что я читал это отлично. Я действительно пытался использовать наш сертификат с подстановочными знаками на бэкэнде, и, похоже, это все сломало.
Я убедился, что при доступе к CAS 2016 без балансировщика нагрузки все работает нормально. Исходя из этого, я подумал, что если бы я включил полное сохранение сеанса на балансировщике нагрузки, чтобы конкретный пользователь имел дело только с одним CAS, это решило бы проблему. Но потом, Я не должен этого делать. И это заставляет меня волноваться, что нужно решить более глубокую ошибку.
Я включил отслеживание неудачных запросов IIS. Я нашел несколько отчетов о 500 ошибках для запросов PowerShell. Но они, похоже, связаны с неудачными запросами на мониторинг работоспособности и не обязательно совпадают по времени с моими тестами OWA, возвращающими меня из системы.
Я провел базовую проверку через Wireshark, чтобы найти что-нибудь странное. Я заметил, что загрузка одной страницы OWA определенно распределены как минимум по нескольким узлам CAS. Иногда оба узла 2016, иногда узел 2016 и 2013.
Я заметил в своем захвате (на балансировщике нагрузки), что во время одной неудачной попытки входа в систему я продолжал повторять 440 Время ожидания входа в систему ответы от узлов CAS. В этом случае у меня их несколько, по крайней мере, по одному от каждого узла CAS.
После первоначального запроса на вход существует так много отдельных HTTP-запросов, что трудно определить причину проблемы, но похоже, что браузером начинает отправляться куча запросов OWA service.svc, и в какой-то момент все они вернуть то же самое 440 Тайм-аут входа ошибка как ответ от узла CAS. Затем, в конце концов, нас перенаправляют обратно на страницу входа.
Я еще ничего не нашел в своих исследованиях, что на самом деле вызывает 440 тайм-аутов входа в систему, или ожидаемое поведение и т. Д.
Я перепроверил все свои настройки виртуального каталога в соответствии с нашей производственной настройкой. Они нормально выглядят.
РЕДАКТИРОВАТЬ: 2017-03-04
Я пробовал несколько различных комбинаций внутренних и внешних URL-адресов VirtualDirectory. exchange.isp.com.au - это внутренний домен AD (соответствует действующей настройке). Внешний URL-адрес лаборатории - exchlab.isp.com.au.
Я пытался:
С тех пор я также добавил постоянство сеанса на основе файлов cookie в HA Proxy, и, похоже, это изменило ситуацию. Я сделал только настойчивость для OWA и ECP, но остальные не работают. На заметку:
Я также решил продолжить тестирование HA Proxy для других служб, помимо OWA. И могу подтвердить:
На самом деле я этого еще не делал, так как чувствую, что есть реальная проблема с конфигурацией. Кроме того, поскольку кажется, что все работает без балансировщика нагрузки, я не вижу в этом помощи.
Еще несколько подробностей о лабораторной среде, в которой я тестирую.
Мы выполняем разгрузку SSL на основе этого руководства: https://serversforhackers.com/using-ssl-certificates-with-haproxy и это руководство: https://jaapwesselius.com/2014/02/28/exchange-2013-sp1-ssl-offloading/
На нашем сервере Exchange 2013 работает SP1 \ w CU11
Все системы Windows (включая AD) работают под управлением Windows 2012 R2.
Наш маршрутизатор представляет собой Linux-сервер, выполняющий NAT. Балансировщик нагрузки находится в той же подсети / 24, что и серверы Exchange и блоки AD.
LB HTTP-интерфейс - 0,7, а поля Exchange - .1, .2 и .3
Мы также выполняем простое перенаправление HTTP на выделенные IP-адреса каждого сервера Exchange на .4, .5 и .6. Хотя я планирую перенести это простое перенаправление на балансировщик нагрузки, поскольку он может легко выполнять перенаправления HTTP.
Соответствующие биты моей конфигурации балансировщика нагрузки:
# This is the L7 HTTPS Front End
# ------------------------------
# We redirect to different backends depending on the URI
# Each backend has its own separate health checks. So that each service can fail on an Exchange CAS node without affecting the other services.
frontend ft_ISP_EXCHANGE_https
bind 172.16.10.7:80 name INT_http
bind 172.16.10.7:443 name INT_https ssl crt wildcard.isp.com.au.pem # Specify SSL Cert for offloading.
mode http
option http-keep-alive
option prefer-last-server
no option httpclose
no option http-server-close
no option forceclose
no option http-tunnel
timeout client 600s
log global
capture request header Host len 32
capture request header User-Agent len 64
capture response header Content-Length len 10
# log-format directive must be written on a single line
# it is splitted for documentation convnience
log-format %ci:%cp\ [%t]\ %ft\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %ST\ %B\ %CC\ %CS\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ %hr\ %hs\ {%sslv/%sslc/%[ssl_fc_sni]/%[ssl_fc_session_id]}\"%[capture.req.method]\ %[capture.req.hdr(0)]%[capture.req.uri]\ HTTP/1.1
maxconn 1000
acl ssl_connection ssl_fc # Set ACL ssl_connection if ssl_fc returns TRUE
# Route request to a different backend depending on the path:
# http://serverfault.com/questions/127491/haproxy-forward-to-a-different-web-server-based-on-uri
acl host_mail hdr(Host) -i exchange.isp.com.au
acl path_slash path /
acl path_autodiscover path_beg -i /Autodiscover/Autodiscover.xml
acl path_activesync path_beg -i /Microsoft-Server-ActiveSync
acl path_ews path_beg -i /ews/
acl path_owa path_beg -i /owa/
acl path_oa path_beg -i /rpc/rpcproxy.dll
acl path_ecp path_beg -i /ecp/
acl path_oab path_beg -i /oab/
acl path_mapi path_beg -i /mapi/
acl path_check path_end -i HealthCheck.htm
# HTTP deny rules
http-request deny if path_check
# HTTP redirect rules
http-request redirect scheme https code 302 unless ssl_connection # Force SSL
http-request redirect location /owa/ code 302 if path_slash host_mail # Redirect / to /owa
# HTTP routing rules -- This is where we decide where to send the request
# Based on HTTP path.
use_backend bk_ISP_EXCHANGE_https_autodiscover if path_autodiscover
use_backend bk_ISP_EXCHANGE_https_ews if path_ews
# other services go here
default_backend bk_ISP_EXCHANGE_https_default
# Backends
# --------
# Now we define each backend individually
# Most of these backends will contain all the same Exchange CAS nodes, pointing to the same IPs
# The reason we define each backend individually is because it allows us to do separate Health Checks
# for each individual service running on each CAS node.
# The failure of one service on a CAS node does not exclude that CAS node from participating in other
# types of requests. This gives us better overall high-availability design.
# HTTPS OWA
# I have added additional comments on this definition, but the same applies to all Exchange HTTPS backends.
backend bk_ISP_EXCHANGE_https_owa
balance roundrobin # Use round-robin load balancing for requests
option http-keep-alive # Enable HTTP Keepalives for session re-use and lowest latency for requests.
option prefer-last-server # Prefer to keep related connections for a session on the same server.
# This is not the same as persistence, and is mainly to try and take advantage of HTTP Keepalives.
# See here for an example of why this is needed: http://stackoverflow.com/questions/35162527/haproxy-keep-alive-not-working-as-expected
no option httpclose # Disable all options that are counter to keepalives
no option http-server-close
no option forceclose
no option http-tunnel
mode http # Operate in L7 HTTP Mode (vs TCP mode etc)
log global
option httplog
option forwardfor # Enable insertion of the X_FORWARDED_FOR HTTP Header
option httpchk GET /owa/HealthCheck.htm # Use L7 HTTP Health Check. This is recommended by Microsoft.
http-check expect string 200\ OK
default-server inter 3s rise 2 fall 3
timeout server 60s
# Define CAS Nodes for this service. We're using SSL offloading to allow L7 HTTP Checks
# We've avoided SSL Bridging as that would halve our LB's throughput.
server ISP_exch16_syd_01 172.16.10.2:80 maxconn 1000 weight 10 check
server ISP_exch16_syd_02 172.16.10.3:80 maxconn 1000 weight 10 check
server ISP_exch13 172.16.10.1:80 maxconn 1000 weight 10 check
Я закончил разумным решением этой проблемы. В нескольких сообщениях упоминалось о похожих проблемах, что добавление постоянства на основе файлов cookie в их балансировщик нагрузки решило проблему для них.
Я сопротивлялся этому «потому что мне не следовало этого делать», во всех технических статьях Microsoft говорится, что в этом больше нет необходимости, да и вообще не рекомендуется.
Но я уступил и в итоге добавил настойчивости и для OWA, и для ECP. В результате проблема не была решена полностью, но стала едва заметной. Единственный раз, когда у меня возникают проблемы, я выхожу из OWA в одном почтовом ящике, а затем сразу же вхожу в другой. Даже в этом случае он выгоняет вас один раз, но если вы попытаетесь войти снова, он будет работать нормально.
После этого проблемы не возникает. Кроме того, я заметил остающуюся проблему только при переходе с почтового ящика 2013 на 2016 год.
Наши конечные пользователи вряд ли это сделают, и мы почти закончили перенос всех наших почтовых ящиков на 2016 год. Так что я считаю эту работу «достаточно хорошей».
Поскольку мы используем прокси-сервер HA, было несложно добавить в конфигурацию постоянство на основе файлов cookie уровня 7. Фактически, на то, чтобы выяснить, потребовалось всего около 5 минут:
# HTTPS Outlook Web App (OWA)
backend bk_EXCHANGE_https_owa
cookie LB01 insert indirect nocache # <-- Added this
balance roundrobin
mode http
...
# Added the "cookie <name>" at the end of each CAS node definition
# These names must be unique to each node.
server n1_exch16_syd_01 172.16.10.2:80 maxconn 1000 weight 10 check cookie EXCH16-SYD-01
server n1_exch16_syd_02 172.16.10.3:80 maxconn 1000 weight 10 check cookie EXCH16-SYD-02
server n1_exch13 172.16.10.1:80 maxconn 1000 weight 10 check cookie EXCH13-SYD