Настройка фермы RDP в Windows Server 2022: установка и балансировка
Москва, Щёлковское шоссе, д. 92, корп. 7 · Пн–Пт 9:00–19:00 · +7 903 729-62-41

Настройка фермы RDP в Windows Server 2022: установка и балансировка

Настройка фермы RDP в Windows Server 2022: установка и балансировка

Архитектура фермы Remote Desktop Services

Ферма RDP — это кластер терминальных серверов, которые работают как единое целое. Пользователь подключается по одному адресу, а дальше система сама решает, на какой сервер его отправить — туда, где нагрузка поменьше. В Windows Server 2022 архитектура RDS строится на нескольких специализированных ролях, и понимать их разграничение важно ещё до того, как вы откроете Server Manager.

Основные компоненты фермы:

  • RD Connection Broker — мозг всей конструкции: распределяет входящие подключения между серверами, следит за сессиями и, что особенно ценно, переподключает пользователя к его же сессии, если соединение оборвалось
  • RD Session Host — рабочие лошадки фермы, серверы, на которых пользователи реально работают
  • RD Web Access — веб-портал, через который можно запустить опубликованное приложение или рабочий стол прямо из браузера, без установки клиента
  • RD Gateway — точка входа снаружи: заворачивает RDP-трафик в HTTPS на порт 443, так что пробрасывать 3389 наружу не нужно
  • RD Licensing — следит за клиентскими лицензиями (CAL), без него ферма через 120 дней перестанет принимать подключения

На практике минимальная рабочая конфигурация — три сервера: один берёт на себя Connection Broker и Web Access, два оставшихся работают как Session Host. Когда нагрузка растёт и один Broker становится точкой отказа, его разворачивают в режиме High Availability — с базой на SQL Server и общим DNS-именем для фермы.

Требования к инфраструктуре

Прежде чем запускать мастер установки, пробегитесь по чеклисту. Половина проблем при развёртывании — именно из-за пропущенной подготовки:

  • Все серверы введены в домен Active Directory — без этого ферма просто не заработает
  • DNS-записи прописаны для всех узлов фермы, включая отдельную A-запись для имени фермы
  • На каждом сервере назначен статический IP — с DHCP в продуктивной среде лучше не экспериментировать
  • Минимум 8 ГБ RAM и 4 vCPU на каждый Session Host — это закрывает примерно 25–30 одновременных пользователей при офисной нагрузке
  • Учётная запись для развёртывания входит в группу Domain Admins и добавлена в локальные администраторы на всех узлах — иначе мастер молча падает на середине

Сетевая задержка между узлами не должна превышать 1 мс. Если серверы раскиданы по разным сегментам — объедините их в один VLAN. Мы видели фермы, где из-за лишних 3–4 мс задержки Broker терял сессии при переподключении.

Установка ролей RDS через Server Manager

Развёртывание запускается централизованно из Server Manager — с любого сервера домена. Открываете Server Manager, идёте в Manage → Add Roles and Features, тип установки выбираете Remote Desktop Services installation. Именно этот путь позволяет распределить роли по разным машинам сразу в ходе мастера.

Режим развёртывания — Standard deployment, не Quick Start. Quick Start удобен для лабораторий: сваливает все роли на один сервер за пять минут. Для фермы он не годится — роли потом не разнести без переустановки.

Дальше мастер последовательно спрашивает, какой сервер берёт каждую роль. Ошибиться несложно, поэтому заранее запишите, что куда идёт:

# Пример распределения ролей:
RD-BROKER.domain.local  → Connection Broker, Web Access
RD-HOST01.domain.local  → Session Host
RD-HOST02.domain.local  → Session Host

По завершении мастера серверы уйдут на перезагрузку автоматически. Вся процедура занимает 10–15 минут. Статус установки смотрите в Server Manager → Remote Desktop Services → Overview — там сразу видно, какие роли поднялись, а какие ещё нет.

Установка через PowerShell

Если серверов больше пяти или нужно воспроизводить установку многократно — удобнее развернуть ферму через модуль RemoteDesktop в PowerShell:

# Создание сессии развёртывания
New-RDSessionDeployment `
  -ConnectionBroker "RD-BROKER.domain.local" `
  -WebAccessServer "RD-BROKER.domain.local" `
  -SessionHost @("RD-HOST01.domain.local", "RD-HOST02.domain.local")

# Проверка статуса развёртывания
Get-RDServer -ConnectionBroker "RD-BROKER.domain.local"

Скриптовое развёртывание особенно выручает, когда нужно поднять тестовый стенд, идентичный продуктивному, или когда инфраструктуру описывают в виде кода. Прогнали скрипт — получили ферму. Никаких кликов мышью по мастеру.

Настройка коллекций сессий

Коллекция сессий — это логическая группа Session Host-серверов с одинаковыми настройками для конкретной категории пользователей. В одной ферме их может быть несколько. Классический пример из нашей практики: коллекция «Бухгалтерия» с 1С на выделенных хостах и коллекция «Менеджеры» с офисными приложениями — ресурсы не делятся, производительность у каждой группы своя.

# Создание коллекции
New-RDSessionCollection `
  -CollectionName "Accounting" `
  -SessionHost @("RD-HOST01.domain.local", "RD-HOST02.domain.local") `
  -ConnectionBroker "RD-BROKER.domain.local" `
  -CollectionDescription "Коллекция для бухгалтерии"

# Ограничение доступа группой AD
Set-RDSessionCollectionConfiguration `
  -CollectionName "Accounting" `
  -UserGroup "DOMAIN\RDP-Accounting" `
  -ConnectionBroker "RD-BROKER.domain.local"

Для каждой коллекции отдельно задаются таймауты сессий, политики перенаправления устройств (принтеры, диски, буфер обмена) и лимиты по ресурсам. Не копируйте одни настройки для всех — у бухгалтеров и менеджеров совершенно разные сценарии работы.

Параметры таймаутов и отключения

Таймауты — то, о чём многие забывают при первичной настройке, а потом удивляются, куда уходит RAM. Брошенные сессии висят часами и жрут память. Настройте их сразу:

Set-RDSessionCollectionConfiguration `
  -CollectionName "Accounting" `
  -IdleSessionLimitMin 60 `
  -DisconnectedSessionLimitMin 120 `
  -ActiveSessionLimitMin 0 `
  -AutomaticReconnectionEnabled $true `
  -BrokenConnectionAction Disconnect `
  -ConnectionBroker "RD-BROKER.domain.local"

IdleSessionLimitMin — неактивная сессия отключается через 60 минут. DisconnectedSessionLimitMin — отключённая сессия полностью завершается через 2 часа, память освобождается. ActiveSessionLimitMin со значением 0 означает, что активная рабочая сессия не ограничена по времени — и это правильно, обрывать работающего пользователя не нужно.

Балансировка нагрузки между серверами
Два способа балансировки RDP-подключений

Балансировка нагрузки между серверами

Connection Broker умеет балансировать двумя способами: Round Robin и по весам (Relative Weight). Round Robin — честное чередование: каждое новое подключение идёт на следующий сервер по кругу. Звучит справедливо, но не учитывает, что один хост может быть вдвое мощнее другого.

Режим весов решает именно эту проблему — более мощный сервер получает пропорционально больше подключений. Настраивается через PowerShell:

# Назначение весов серверам
Set-RDSessionHost `
  -SessionHost "RD-HOST01.domain.local" `
  -NewConnectionAllowed Yes `
  -ConnectionBroker "RD-BROKER.domain.local"

# Через реестр задаём вес (значение 100-999, по умолчанию 100)
# На RD-HOST01 (мощный сервер, 64 ГБ RAM):
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" `
  -Name "LBWeight" -Value 200

# На RD-HOST02 (стандартный сервер, 32 ГБ RAM):
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" `
  -Name "LBWeight" -Value 100

После изменения весов перезапустите службу Remote Desktop Services на каждом хосте. Broker сразу начнёт направлять на RD-HOST01 вдвое больше новых подключений — пропорционально заданным коэффициентам.

Мониторинг распределения нагрузки

За нагрузкой удобно следить прямо из PowerShell — не нужно лезть в GUI каждый раз:

# Количество сессий на каждом хосте
Get-RDUserSession -ConnectionBroker "RD-BROKER.domain.local" |
  Group-Object HostServer |
  Select-Object Name, Count |
  Sort-Object Count -Descending

# Детальная информация о сессиях
Get-RDUserSession -ConnectionBroker "RD-BROKER.domain.local" |
  Select-Object UserName, HostServer, SessionState, CreateTime |
  Format-Table -AutoSize

Настройте оповещения на порог 80% по CPU и RAM на каждом хосте. Если хотя бы один сервер устойчиво держит такую нагрузку — пора добавлять новый Session Host в коллекцию. Лучше сделать это заранее, чем разбираться с жалобами пользователей на тормоза.

Настройка SSL-сертификатов

Без правильно настроенных сертификатов пользователи будут видеть предупреждения безопасности при каждом подключении — и рано или поздно кто-нибудь нажмёт «не подключаться». В ферме RDS сертификаты назначаются на четыре роли:

  • RD Connection Broker — Enable Single Sign On
  • RD Connection Broker — Publishing
  • RD Web Access
  • RD Gateway (при наличии)

Оптимальный вариант — один SAN-сертификат (Subject Alternative Name), в который включены имена всех серверов фермы и общее DNS-имя фермы. Один сертификат вместо четырёх отдельных — проще следить за сроком и обновлять:

# Создание запроса на сертификат
$params = @{
  Subject = "CN=rdp.domain.com"
  DnsName = "rdp.domain.com", "RD-BROKER.domain.local", "RD-HOST01.domain.local", "RD-HOST02.domain.local"
  CertStoreLocation = "Cert:\LocalMachine\My"
  KeyLength = 2048
  KeyExportPolicy = "Exportable"
  NotAfter = (Get-Date).AddYears(3)
}
$cert = New-SelfSignedCertificate @params

# Экспорт в PFX для установки на других серверах
$password = ConvertTo-SecureString -String "P@ssw0rd!" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:\Certs\rdp-farm.pfx" -Password $password

В продуктивной среде самоподписанный сертификат — не вариант. Используйте сертификат от внутреннего CA (Active Directory Certificate Services) или любого публичного центра сертификации.

Применение сертификата к ролям

Установить сертификат можно через Server Manager → Remote Desktop Services → Overview → Tasks → Edit Deployment Properties → Certificates. Либо через PowerShell — особенно удобно, если серверов несколько:

# Применение сертификата ко всем ролям
$roles = @("RDRedirector", "RDPublishing", "RDWebAccess", "RDGateway")
foreach ($role in $roles) {
  Set-RDCertificate `
    -Role $role `
    -ImportPath "C:\Certs\rdp-farm.pfx" `
    -Password (ConvertTo-SecureString "P@ssw0rd!" -Force -AsPlainText) `
    -ConnectionBroker "RD-BROKER.domain.local" `
    -Force
}

Лицензирование RDS

Без лицензий Remote Desktop Services проработает ровно 120 дней в grace-period — а потом жёстко обрежет подключения. Для фермы нужны лицензии RDS CAL (Client Access License), и тут придётся выбирать: Per User или Per Device.

Per User — лицензия привязана к учётной записи AD. Пользователь подключается хоть с пяти устройств сразу — всё по одной лицензии. На практике это оптимальный выбор для сотрудников, которые работают и с офисного ПК, и с ноутбука, и с планшета.

Per Device — лицензия уходит устройству, а не человеку. Классика для посменной работы: один терминал, за которым за день сидят три-четыре сотрудника.

# Установка роли лицензирования
Add-RDServer `
  -Server "RD-BROKER.domain.local" `
  -Role "RDS-LICENSING" `
  -ConnectionBroker "RD-BROKER.domain.local"

# Указание сервера лицензий для развёртывания
Set-RDLicenseConfiguration `
  -LicenseServer "RD-BROKER.domain.local" `
  -Mode PerUser `
  -ConnectionBroker "RD-BROKER.domain.local" `
  -Force

Активируйте сервер лицензий через Remote Desktop Licensing Manager (licmgr.exe) и установите пакеты CAL, полученные через Volume Licensing. Не затягивайте — grace-period кончается быстрее, чем кажется.

Оптимизация производительности фермы
Тонкая настройка производительности RDS

Оптимизация производительности фермы

Когда пользователей становится много, сервера Session Host начинают жаловаться на жизнь. Вот что реально влияет на производительность и что мы настраиваем в первую очередь:

# Групповая политика: Computer Configuration → Admin Templates → 
# Windows Components → Remote Desktop Services → 
# Remote Desktop Session Host → Remote Session Environment

# Ограничение глубины цвета для снижения нагрузки на сеть
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "ColorDepth" -Value 3  # 16 бит

# Отключение визуальных эффектов
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "fDisableWallpaper" -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "fDisableCam" -Value 1

# Ограничение перенаправления принтеров (частая причина зависаний)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
  -Name "fDisableCpm" -Value 1

Отключайте индексацию Windows Search, службу Superfetch и все анимации на серверах Session Host — это не косметика, это ощутимые миллисекунды на каждую операцию. И ещё один момент: замените роуминг-профили на UPD (User Profile Disks). Вход ускоряется заметно — мы видели разницу в 30-40 секунд на нагруженных серверах.

User Profile Disks

UPD хранят профили пользователей в VHDX-файлах на общем ресурсе. При входе диск подключается автоматически, пользователь этого вообще не замечает:

# Включение UPD для коллекции
Set-RDSessionCollectionConfiguration `
  -CollectionName "Accounting" `
  -EnableUserProfileDisk `
  -MaxUserProfileDiskSizeGB 10 `
  -DiskPath "\\FileServer\RDS-UPD$" `
  -ConnectionBroker "RD-BROKER.domain.local"

# Проверка NTFS-разрешений на папке
# Группа "RD-HOST01$" и "RD-HOST02$" должны иметь Full Control

Главный плюс UPD — пользователь всегда получает свой профиль, на какой бы сервер его ни закинул Connection Broker при балансировке. Никаких «а где мои настройки» после перезагрузки.

Troubleshooting типичных проблем

Фермы RDS эксплуатируются годами, и за это время вылезают одни и те же грабли. Давно выработали для себя короткий чеклист для типовых ситуаций.

Пользователь не переподключается к существующей сессии:

# Проверка, видит ли Broker сессию
Get-RDUserSession -ConnectionBroker "RD-BROKER.domain.local" |
  Where-Object { $_.UserName -eq "ivanov" }

# Если сессия «зависла» — принудительное завершение
Invoke-RDUserLogoff -HostServer "RD-HOST01.domain.local" `
  -UnifiedSessionID 3 -Force

Ошибка «No Remote Desktop License Servers available»:

  • Проверьте, активирован ли сервер лицензий: Get-WmiObject Win32_TSLicenseServer
  • Убедитесь, что порт 135 (RPC) открыт между хостами и сервером лицензий — файрвол здесь блокирует чаще, чем хочется думать
  • Проверьте принадлежность компьютеров к группе Terminal Server License Servers в AD

Медленный вход: в 80% случаев виноваты тяжёлые GPO, перенаправление принтеров или антивирус, который сканирует профиль при каждом логине. Смотрите сюда: eventvwr.msc → Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager — там всё написано с таймингами.

Часто задаваемые вопросы

Зависит от нагрузки. Для офисной работы — Word, Excel, 1С тонкий клиент — реально выходит 25-30 пользователей на сервер с 32 ГБ RAM и 8 vCPU. Если в ход идут CAD или тяжёлая графика — уже 8-12, и то смотреть надо. Нагрузочное тестирование перед запуском в продуктив — обязательно, без вариантов.

Да, и это одно из главных удобств фермы. Новый сервер добавляется в коллекцию прямо на лету: Add-RDSessionHost -SessionHost "RD-HOST03.domain.local" -CollectionName "Accounting" -ConnectionBroker "RD-BROKER.domain.local". Существующие сессии не трогаются, новые подключения сразу начинают уходить на добавленный сервер.

В ферме RDS несколько пользователей работают на одном сервере и делят его ресурсы между собой. В VDI каждый получает отдельную виртуальную машину. RDS дешевле в лицензировании и проще в обслуживании — для большинства компаний до 50 рабочих мест это оптимальный выбор. VDI имеет смысл, когда нужна полная изоляция или когда сотрудники ставят несовместимое между собой ПО.

Connection Broker в режиме High Availability требует полноценный SQL Server — Express не подойдёт. Плюс общее DNS-имя для клиентов. Настройка выглядит так: Set-RDConnectionBrokerHighAvailability -ConnectionBroker "RD-BROKER01.domain.local" -DatabaseConnectionString "DRIVER=SQL Server Native Client 11.0;SERVER=SQL01;..." -ClientAccessName "rdp.domain.com". Второй брокер добавляется через Add-RDServer.

#ферма RDP#Windows Server 2022#Remote Desktop Services#Connection Broker#балансировка RDP#RDS ферма#терминальный сервер#лицензирование RDS

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Комментарии 0

Оставить комментарий

загрузка...

Источники

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.