MAATRIX / Блог / WebSocket-сервер на VPS с nginx

WebSocket-сервер на VPS с nginx

Блог MAATRIX · 2026-07-07

Чаты, нотификации, live-дашборды — всё держится на постоянных WebSocket-соединениях. Разберём, как поднять WS-сервер на VPS и корректно пробросить его через nginx с шифрованием wss.

Почему WebSocket любит выделенный сервер

['WebSocket — это тысячи одновременных открытых соединений, каждое из которых занимает файловый дескриптор и немного памяти. Serverless и shared-хостинг обрывают такие соединения по таймауту. Нужен VPS с root, где вы сами управляете лимитами и nginx.', 'Постоянные соединения чувствительны к сети и стабильности. У MAATRIX локации в UK и США плюс NVMe-диски — соединения не рвутся, а под нагрузкой сервер не деградирует.', 'Есть и продуктовый нюанс: WebSocket плохо дружит с бессерверными платформами и большинством PaaS, которые рассчитаны на короткие HTTP-запросы. Балансировщики там закрывают idle-соединение через 30-60 секунд, и клиент постоянно переподключается. На VPS вы держите nginx и таймауты в своих руках, поэтому соединение живёт ровно столько, сколько нужно приложению. Оплата картой РФ, СБП или криптой делает такой зарубежный сервер доступным из России без плясок с иностранными платёжками.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для WebSocket

Поднимаем WS-сервер

['В качестве примера — Node.js с библиотекой ws. Ставим рантайм:', '
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -\napt install -y nodejs\nnode -v
', 'Минимальный сервер (файл /opt/wsapp/server.js):', "
const { WebSocketServer } = require('ws');\nconst wss = new WebSocketServer({ port: 8080, host: '127.0.0.1' });\nwss.on('connection', (ws) => {\n  ws.on('message', (m) => ws.send('echo: ' + m));\n  ws.send('connected');\n});\nconsole.log('WS on 127.0.0.1:8080');
", 'Устанавливаем зависимости и проверяем локально:', '
cd /opt/wsapp && npm init -y && npm install ws\nnode server.js
']

systemd-юнит

['Чтобы сервер жил вечно и рестартился при падении:', "
cat > /etc/systemd/system/wsapp.service <<'EOF'\n[Unit]\nDescription=WebSocket server\nAfter=network.target\n\n[Service]\nWorkingDirectory=/opt/wsapp\nExecStart=/usr/bin/node server.js\nRestart=always\nUser=www-data\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsystemctl daemon-reload\nsystemctl enable --now wsapp
"]

nginx: Upgrade и wss

['Ключ к WebSocket через nginx — правильные заголовки Upgrade и Connection. Без них соединение будет обрываться как обычный HTTP-запрос.', "
map $http_upgrade $connection_upgrade {\n    default upgrade;\n    ''      close;\n}\n\nserver {\n    listen 443 ssl;\n    server_name ws.example.com;\n\n    ssl_certificate     /etc/letsencrypt/live/ws.example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/ws.example.com/privkey.pem;\n\n    location /ws {\n        proxy_pass http://127.0.0.1:8080;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection $connection_upgrade;\n        proxy_set_header Host $host;\n        proxy_read_timeout 3600s;\n    }\n}
", 'Здесь ключевых момента два. Первый — proxy_http_version 1.1: без него nginx общается с бэкендом по HTTP/1.0, где нет апгрейда протокола. Второй — заголовки Upgrade и Connection, которые превращают обычный запрос в WebSocket-туннель. Большой proxy_read_timeout нужен, чтобы nginx не рвал тихие соединения между сообщениями.', 'Блок map кладётся в http-контекст (например, в /etc/nginx/nginx.conf). Проверяем и перезагружаем:', '
nginx -t && systemctl reload nginx
']

Тестирование и частые ошибки

['Проверить wss можно утилитой websocat:', '
apt install -y websocat 2>/dev/null || cargo install websocat\nwebsocat wss://ws.example.com/ws
', '
  • Соединение рвётся через 60 сек — не задан proxy_read_timeout; увеличьте до 3600s.
  • 426 Upgrade Required — nginx не передаёт заголовок Upgrade; проверьте блок map.
  • Too many open files — поднимите лимиты: ulimit -n 65535 и LimitNOFILE=65535 в юните.
', 'Для десятков тысяч соединений добавьте worker_connections в nginx и берите план с запасом по RAM — на MAATRIX это делается апгрейдом тарифа без переезда.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для WebSocket

Частые вопросы

Чем wss отличается от ws?

wss — это WebSocket поверх TLS (аналог https). В проде всегда используйте wss, чтобы трафик шифровался.

Сколько соединений держит один VPS?

Зависит от RAM и лимитов ОС. При правильных ulimit один сервер спокойно тянет 20-50 тысяч соединений.

Как масштабировать WebSocket?

Несколько инстансов за nginx с ip_hash или sticky-сессиями плюс общий Redis pub/sub для обмена сообщениями между нодами.