<div dir="ltr">Thanks for the suggestion.<div><br></div><div>We're not specifying a event method currently, though I can't see if eventport was the default. If I explicitly use /dev/poll, and turn ssl_session_cache back on, the issue comes back.</div>

<div><br></div><div>I have verified that both the HTTP request and response are proxied properly. It seems to me that when the upgrade is finished nginx enters direct tunneling mode for the websocket data, which doesn't work for some sockets, at least these recovered SSL sessions from iOS clients.<br>

<br>The event method issue would have explained why I can't reproduce the issue on mac (with self signed cert). I also haven't reproduced it with an Android client, although I did not verify with tcpdump if my android test reused the SSL session.<br>

<br>Any other ideas?</div><div><br></div><div>- Eirikur</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jan 14, 2014 at 10:53 PM, Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<div><div class="h5"><br>
On Tue, Jan 14, 2014 at 04:22:44PM +0000, Eiríkur Nilsson wrote:<br>
<br>
> We've been debugging this issue for 3 days now and even though we have a<br>
> temporary fix, we're still puzzled about it.<br>
><br>
> There is an iOS app, which opens a websocket connection to our server over<br>
> SSL. Our server runs SmartOS and has nginx 1.5.0 (also happens on 1.4.1)<br>
> proxying to a backend server running in NodeJS.<br>
><br>
> To reproduce, I start my app, a websocket connection is established and<br>
> works well, then I put the app to sleep for awhile until nginx kills the<br>
> connection. When I reopen the app, the following happens:<br>
><br>
> 1) App notices that the connection is dead and reconnects.<br>
> 2) Behind the scenes, iOS reuses the SSL session from before and quickly<br>
> opens a new socket.<br>
> 3) A HTTP upgrade request and response flow across with no problems.<br>
> 4) With a successful web-socket established on both sides, the client<br>
> starts sending frames. However, none of these gets delivered to the backend<br>
> server.<br>
> 5) After a minute, nginx kills the connection even though the client is<br>
> sending periodic pings.<br>
> 6) Back to 1.<br>
><br>
> I haven't managed to reduce the test case or reproduce it in another<br>
> environment yet. This only happens when using SSL. In wireshark I see the<br>
> websocket frames being sent from the iPhone client and TCP acked properly.<br>
><br>
> What currently fixes the problem is to disable SSL session reuse in nginx.<br>
> Then every websocket connection works like it should.<br>
><br>
> Here is the config before the fix:<br>
> ###<br>
>     server {<br>
>         ### Server port and name ###<br>
<br>
</div></div>[...]<br>
<br>
Which event method is used?  If eventport, try switching to<br>
/dev/poll instead (which is expected to be used by default on<br>
SmartOS and other Solaris variants), it should fix the issue.  The<br>
eventport event method is known to have problems when proxying and<br>
this may cause symptoms you see, it needs attention.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Maxim Dounin<br>
<a href="http://nginx.org/" target="_blank">http://nginx.org/</a><br>
<br>
_______________________________________________<br>
nginx mailing list<br>
<a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx</a></font></span></blockquote></div><br></div>