В кластере Kubernetes у меня есть сервер Nginx, действующий как решение для обратного прокси / завершения TLS, которое запрашивает прокси-сервер в серверное приложение Tomcat, которое имеет некоторые функции, работающие на основе веб-сокетов (SockJS / Stomp). К сожалению, рукопожатие веб-сокетов никогда не завершается успешно.
На стороне клиента в моем браузере я вижу в консоли следующие сообщения:
Opening Web Socket...
websockets-0.1.min.js:116 Whoops! Lost connection to https://myhost/stomp
Затем следует HTTP 504 Gateway Timeout
.
websockets-0.1.min.js:72 WebSocket connection to
'wss://myhost/stomp/673/ugvpxc1lwmfjnung/websocket'
failed: Error during WebSocket handshake: Unexpected response code: 504
-
На стороне tomcat у меня есть следующая запись в журнале доступа:
0:0:0:0:0:0:0:1,2017-06-01 16:53:36.915
+0000,4,GET,HTTP/1.1,"/stomp/673/ugvpxc1lwmfjnung/websocket",101,
-,O,-,blablablabla,-,-,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110
Safari/537.36",-,,-,-,-,-,-,-
А в журнале доступа nginx у меня есть соответствующая запись:
10.2.89.0 - - [01/Jun/2017:16:54:41 +0000] "GET
/stomp/673/ugvpxc1lwmfjnung/websocket HTTP/1.1" 499 0 "-" "Mozilla/5.0
(Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/58.0.3029.110 Safari/537.36" "24.5.136.13"
Теперь, согласно тому, что я исследовал, код 499 отображается, когда клиент закрывает соединение, но я не могу понять, почему ответ должен так долго возвращаться клиенту. Согласно отметкам времени из этих двух записей, эти два события разделены ~ 1 минутой. Что тут происходит?
Вот фрагмент из моего nginx.conf, любая помощь на этом этапе очень важна:
server {
listen 9965 default_server ssl;
listen [::]:9965 default_server ssl;
resolver 127.0.0.1;
server_name _;
ssl_certificate /etc/ssl/certs/certificate.pem;
ssl_certificate_key /etc/ssl/certs/key.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
client_max_body_size 2000M;
location / {
proxy_read_timeout 900;
proxy_pass_header Server;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade 'websocket';
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:15010;
}
-
Есть идеи, как решить эту проблему дальше?
Исправлена. Пришлось заменить классический AWS ELB на ALB.