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

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

 上游应用程序{
服务器本地主机:1000;
}

server {

听80;

位置/ {
proxy_pass http:// app;
client_max_body_size 20m;
proxy_redirect关闭;
send_timeout 86400;
proxy_read_timeout 86400;
proxy_buffering关闭;
gzip关闭;
}
}

</ code> </ pre>

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

 上游应用{
服务器本地主机:1000;
}

服务器{
监听443;
ssl_certificate cert.pem;
ssl_certificate_key key.pem;
ssl_buffer_size 1;
位置/ {
proxy_pass http:// app;
client_max_body_size 20m; \ n proxy_redirect关闭;
send_timeout 86400;
proxy_read_timeout 86400;
proxy_buffering关闭;
gzip关闭;
}
}
</ code> </ pre>

我写了 Go中的应用程序,而我使用的是 net / http </ code>中的标准 Flush()</ code>。 我尝试使用 Hijack </ code>来获取常规的TCP缓冲区和 Flush()</ code>,但是仍然无法正常工作。</ p>
</ div>

展开原文

原文

I'm writing an app that uses long polling to push messages to clients. It doesn't end the request when it finishes sending a message though: it just flushes. It works fine, even when I proxy it through nginx and access it over the internet.

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;
    }
}

That is, until I enable SSL on nginx. Then it won't flush anymore. I can work around this by setting ssl_buffer_size to 1, but this negatively impacts performance.

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;
    }
}

I wrote my application in Go, and I'm using the standard Flush() from net/http. I tried using Hijack to get a regular TCP buffer and Flush() that, but it still didn't work.

douya7282
douya7282 好的,我将其发布到ServerFault。
接近 6 年之前 回复
doushi6864
doushi6864 不知道,为什么不尝试呢?如果您打算使用nginx,则可以尝试使用他们的邮件列表或ServerFault。
接近 6 年之前 回复
dongtanliefang8765
dongtanliefang8765 如果我升级了使用websockets,http2或spdy的请求,服务器通过nginxssl的推送会更好吗?
接近 6 年之前 回复
dsgsdg206050
dsgsdg206050 似乎唯一的答案是“不要使用Nginx”
接近 6 年之前 回复
dongqiang1226
dongqiang1226 如果nginx没有某种max-latency/flush-interval选项(认为没有),那么您需要将缓冲区设置为与您的消息大小齐平的东西,或者填充您的消息。如果不可接受,请尝试其他操作,例如haproxy或Gocrypto/tls软件包。仅供参考,来自TLS连接的http.ResponseWriter是http.Flusher。我不知道什么是haproxy的行为。
接近 6 年之前 回复
doupai8533
doupai8533 在Nginx中启用SSL时如何进行服务器推送
接近 6 年之前 回复
dongliang1941
dongliang1941 您似乎已经发现这是因为如果在nginx中进行SSL缓冲。您到底要在这里解决什么?
接近 6 年之前 回复

1个回答



这不是Go问题,而是Nginx配置问题。 </ p>

您可能会尝试禁用代理缓冲来避免这种情况。 尝试:</ p>

 服务器{
监听443;
ssl_certificate cert.pem;
ssl_certificate_key key.pem;
ssl_buffer_size 1;

proxy_buffering关闭; \ n}
</ code> </ pre>

PS:未经测试,请尝试一下。</ p>
</ div>

展开原文

原文

This isn't a Go issues, but more a Nginx configuration issue. It's most probably Nginx who is holding back your data.

Your could try to disable proxy buffering to avoid this. Try:

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

    proxy_buffering off;
}

P.S.: Not tested but give it a try.

douhuigan8063
douhuigan8063 这并不是100%清楚的,因为您没有为SSL配置粘贴整个服务器块。
接近 6 年之前 回复
dqf60304
dqf60304 那已经在我上面的配置中了。 没关系,因为ssl缓冲区是单独的。
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问