<html><body><p><font size="2">Hi, I've been trying to get nginx reverse proxy'ing of socket.io events working but not having any luck so would greatly appreciate any help/insight. Basically my scenario is: nginx running in a docker container (based on the nginx:stable-alpine image), a node server app serving up rest APIs as well as responses via socket.io when those APIs are called. On the client side, the aim is to call these APIs via the proxy, and also listen to socket.io events return back through the proxy. And this is all ssl secured.</font><br><br><u><font size="2">My nginx conf file:</font></u><br><br><font size="2">worker_processes  1;</font><br><font size="2">error_log  /var/log/nginx/error.log warn;</font><br><font size="2">pid        /var/run/nginx.pid;</font><br><br><font size="2">events {</font><br><font size="2">    worker_connections 1024;</font><br><font size="2">}</font><br><br><font size="2">http {</font><br><font size="2">    include /etc/nginx/mime.types;</font><br><font size="2">    default_type  application/octet-stream;</font><br><font size="2">    access_log  /var/log/nginx/access.log  main;</font><br><font size="2">    sendfile on;</font><br><font size="2">    keepalive_timeout  65;</font><br><br><font size="2">    server {</font><br><font size="2">        listen 8080 ssl;</font><br><br><font size="2">        server_name localhost;</font><br><br><font size="2">        ssl_certificate /etc/nginx/conf.d/cert.pem;</font><br><font size="2">        ssl_certificate_key /etc/nginx/conf.d/key.pem;</font><br><br><font size="2">        location / {</font><br><font size="2">            proxy_pass </font><a href="https://apiandsocketservername:9091/"><font size="2">https://apiandsocketservername:9091</font></a><font size="2">;</font><br><font size="2">            proxy_http_version 1.1;</font><br><font size="2">            proxy_set_header Upgrade $http_upgrade;</font><br><font size="2">            proxy_set_header Connection "upgrade";</font><br><font size="2">        }</font><br><font size="2">    }</font><br><font size="2">}</font><br><br><br><u><font size="2">My simple socket.io client node app:</font></u><br><br><font size="2">socket = require('socket.io-client')(`https://localhost:8080`, {timeout: 5000, rejectUnauthorized: false});</font><br><font size="2">// Connect to the socket</font><br><font size="2">socket.on('connect', () => {</font><br><font size="2">    console.log('Connected to server');</font><br><font size="2">});</font><br><font size="2">// Wait on event named 'projectValidated'</font><br><font size="2">socket.on('projectValidated', (args) => {</font><br><font size="2">    console.log('projectValidated');</font><br><font size="2">    console.log(args);</font><br><font size="2">});</font><br><br><br><font size="2">So the scenario would be to start up the node app above, then hit the rest API endpoint on </font><a href="https://localhost:8080/"><font size="2">https://localhost:8080</font></a><font size="2"> </font><font size="2">via curl, and listen for the socket event on </font><a href="https://localhost:8080/"><font size="2">https://localhost:8080</font></a><font size="2"> </font><font size="2">originating from </font><a href="https://apiandsocketservername:9091/"><font size="2">https://apiandsocketservername:9091</font></a><font size="2"> via the proxy.</font><br><br><font size="2">When I run the nginx container and socket.io client locally on my laptop everything works, and the nginx container logs has this added line when the socket.io node app client connects, and no extra logging when the socket.io events are successfully received:</font><br><font size="2">172.17.0.1 - - [31/May/2019:16:31:07 +0000] "GET /socket.io/?EIO=3&transport=polling&t=MiEkmaT&b64=1&sid=viHdGa9b26g9ejGYAAAD HTTP/1.1" 200 3 "-" "nodeXMLHttpRequest" "-"</font><br><font size="2">When I kill the socket.io client, nginx emits this single line in the log:</font><br><font size="2">172.17.0.1 - - [31/May/2019:16:34:18 +0000] "GET /socket.io/?EIO=3&transport=websocket&sid=viHdGa9b26g9ejGYAAAD HTTP/1.1" 101 379 "-" "-" "-"</font><br><br><br><font size="2">But when I run the same scenario on a kubernetes cluster where the nginx proxy container and the socket.io client is on one pod and the rest api and socket.io server is on a different pod: all the rest api proxy'ing works for the both the https api calls and responses, and also the node app is able to do the socket connection properly, but the socket.io event is never received successfully. Nginx also continuously emits these two lines in the log every 25 seconds:</font><br><font size="2">9.37.248.25 - - [31/May/2019:17:37:26 +0000] "GET /socket.io/?EIO=3&transport=polling&t=MiEzrxs&b64=1&sid=UJnUsScsSyJSmrOiAAAA HTTP/1.1" 200 3 "-" "node-XMLHttpRequest" "-"</font><br><font size="2">9.37.248.25 - - [31/May/2019:17:37:26 +0000] "POST /socket.io/?EIO=3&transport=polling&t=MiEzy2V&b64=1&sid=UJnUsScsSyJSmrOiAAAA HTTP/1.1" 200 2 "-" "node-XMLHttpRequest" "-"</font><br><font size="2"><br></font><br><font size="2">Would anyone be able to shed light on what could be going wrong and if I need to change anything in my nginx conf file? And what the above two lines repeatedly emitted in the nginx log mean?</font><br><br><font size="2">Thanks in advance,</font><br><font size="2">Len.</font><br><font size="2"><br><br>---------------------------------------------<br>Len Theivendra<br>IBM Canada Software Lab<br>email: theivend@ca.ibm.com<br>tel: (905) 413-3777  tie: 969-3777</font><BR>
</body></html>