在长轮询期间刷新NginX的SSL缓冲区

时间:2014-11-08 04:01:12

标签: ssl nginx https go long-polling

我正在编写一个使用长轮询将消息推送到客户端的应用程序。它在完成发送消息时不会结束请求:它只是刷新。它工作正常,即使我通过nginx代理并通过互联网访问它。

upstream app {
  server localhost:1000;
}

server {
    listen 80;    
    location / {
        proxy_pass http://app;
        client_max_body_size 20m;
        proxy_redirect off;
        send_timeout 86400;
        proxy_read_timeout 86400;
        proxy_buffering off;
        gzip off;
    }
}

也就是说,直到我在nginx上启用SSL。然后它不会再冲洗了。我可以通过将ssl_buffer_size设置为1来解决此问题,但这会对性能产生负面影响。

upstream app {
  server localhost:1000;
}

server {
    listen 443;
    ssl_certificate cert.pem;
    ssl_certificate_key key.pem;
    ssl_buffer_size 1;
    location / {
        proxy_pass http://app;
        client_max_body_size 20m;
        proxy_redirect off;
        send_timeout 86400;
        proxy_read_timeout 86400;
        proxy_buffering off;
        gzip off;
    }
}

我在Go中编写了我的应用程序,并且我正在使用Flush()中的标准net/http。我尝试使用Hijack来获取常规TCP缓冲区和Flush(),但它仍然不起作用。

1 个答案:

答案 0 :(得分:0)

这不是Go问题,而是更多Nginx配置问题。很可能是Nginx阻止了你的数据。

您可以尝试disable proxy buffering来避免这种情况。尝试:

server {
    listen 443;
    ssl_certificate cert.pem;
    ssl_certificate_key key.pem;
    ssl_buffer_size 1;

    proxy_buffering off;
}

P.S。:未经测试但试一试。