我正在编写一个应用程序,它使用长轮询向客户端推送消息。不过,当它完成发送消息时,它不会结束请求:它只是刷新。它工作得很好,即使我通过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中编写了我的应用程序,并且使用net/http
中的标准Flush()
。我尝试使用Hijack
来获得常规TCP缓冲区,并使用Flush()
来获得,但仍然不起作用。
这不是Go问题,而是Nginx配置问题。很可能是Nginx在隐瞒你的数据。
您可以尝试禁用代理缓冲以避免这种情况。尝试:
server {
listen 443;
ssl_certificate cert.pem;
ssl_certificate_key key.pem;
ssl_buffer_size 1;
proxy_buffering off;
}
附言:没有测试,但试试看。