Nginx и прокси-серверы
Я пытаюсь прокси-сервера WebSocket + HTTP с помощью nginx.
Я прочитал: http://nginx.org/en/docs/http/websocket.html
Мой конфиг выглядит следующим образом:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name ourapp.com;
location / {
proxy_pass http://127.0.0.1:100;
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
}
У меня есть 2 проблемы:
1) Соединение закрывается один раз в минуту.
2) Я хочу запускать как HTTP, так и WS на одном и том же порту. Приложение работает нормально локально, но если я попытаюсь поместить HTTP и WS на один и тот же порт и установить этот прокси nginx, я получаю следующее:
Соединение с WebSocket с 'ws://ourapp.com/ws' не выполнено: Неожиданный код ответа: 200
Загрузка приложения (HTTP) работает нормально, но соединение с WebSocket не работает.
Ответы
Ответ 1
Проблема 1: Что касается соединения, которое умирает один раз в минуту, я понял, что это переменная времени nginx. Я могу либо сделать наше приложение для ping время от времени, либо увеличить тайм-аут. Я не уверен, должен ли я установить его как 0, я решил просто ping раз в минуту и установить тайм-аут на 90 секунд. (keepalive_timeout
)
Проблема 2: Проблемы с подключением возникли, когда я использовал CloudFlare CDN. Отключение ускорения CloudFlare решило проблему.
В качестве альтернативы я мог бы создать субдомен и установить его как "unaccelerated" и использовать его для WS.