Proxying websocket (to e.g. tomcat)
Valentin V. Bartenev
vbart at nginx.com
Thu Feb 21 14:30:49 UTC 2013
On Thursday 21 February 2013 18:35:14 Nikolai Zhubr wrote:
> Hello all!
>
> I've installed the latest version 1.3.13 (supposedly supporing
> websocket) and was trying to push websocket connections through nginx to
> tomcat while leaving all other (static) content to nginx. To do this,
> I've added the following "location" for tomcat:
>
> location /examples/websocket {
> proxy_pass http://127.0.0.1:8080/examples/websocket;
> proxy_redirect off;
> proxy_set_header Host $host;
> proxy_set_header X-Real-IP $remote_addr;
> }
>
> I know that tomcat itself accepts some test websocket connection just
> fine. Also, getting static pages from tomcat through nginx works well
> too. However, proxying websocket doesn't seem to work.
>
> So I've stopped tomcat and used netcat to see what gets through. Here it
> goes:
>
> Direct request (firefox -> tomcat):
>
> GET /examples/websocket/echoStream HTTP/1.1
> Host: 192.168.0.91:8080
> User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101
> Firefox/17.0
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
> Accept-Encoding: gzip, deflate
> Connection: keep-alive, Upgrade
> Sec-WebSocket-Version: 13
> Origin: http://192.168.0.91:8080
> Sec-WebSocket-Key: ZffbHEsoryDw1gcX51lt8g==
> Pragma: no-cache
> Cache-Control: no-cache
> Upgrade: websocket
>
> Request passed though nginx (firefox -> nginx -> tomcat):
>
> GET /examples/websocket/echoStream HTTP/1.0
> Host: 192.168.0.91
> X-Real-IP: 192.168.0.98
> Connection: close
> User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101
> Firefox/17.0
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
> Accept-Encoding: gzip, deflate
> Sec-WebSocket-Version: 13
> Origin: http://192.168.0.91
> Sec-WebSocket-Key: 9YkdANPMSHDxb8axUbeKwQ==
> Pragma: no-cache
> Cache-Control: no-cache
>
> One can clearly see that there is a problem. At least, "HTTP/1.1" is
> lost, "Connection: keep-alive, Upgrade" is lost, and "Upgrade:
> websocket" is lost. Generally, it does not look like websocket is
> supported at all (Essentially, apache does this same damage to websocket
> connections).
>
> Honestly I'm not much familiar with nginx, just had to dismiss apache
> because apparently they refused to even consider support for websocket.
> So before trying to dig deep into sources I thoght I should ask here. Is
> it possible to get websocket through nginx really? Maybe I need to
> configure something additionally?
>
Yes, it's possible with 1.3.13. And yes, you need some additional configuration.
Example:
location /examples/websocket {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Docs:
http://nginx.org/r/proxy_http_version
http://nginx.org/r/proxy_set_header
wbr, Valentin V. Bartenev
--
http://nginx.com/support.html
http://nginx.org/en/donation.html
More information about the nginx
mailing list