问题状况
网站是由Nginx转到后端node进行展示处理的,Node端是一个利用ChatGPT的网页对话程序,使用API调用其接口使用。
但页面返回的实时回应无法显示,会在响应完成后再一起显示出来;而使用apache进行转发则没有这个问题。
相关配置
两者均使用websocket方式连接Node处理;Apache相关配置:
<VirtualHost *:443>
ServerName gpt.xxx.com
ProxyPass "/" "ws://127.0.0.1:5000/" timeout=30
ProxyPassReverse "/" "ws://127.0.0.1:5000/" timeout=30
ErrorLog "| /usr/local/apache/bin/rotatelogs logs/gpt-error-%Y_%m_%d.log 2M"
ErrorLog "| /usr/local/apache/bin/rotatelogs logs/gpt-error-%Y_%m_%d.log 86400 480"
CustomLog "| /usr/local/apache/bin/rotatelogs logs/gpt-access-%Y_%m_%d.log 2M" common
CustomLog "| /usr/local/apache/bin/rotatelogs logs/gpt-access-%Y_%m_%d.log 86400 480" common
SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/xxx.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/xxx.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/xxx.com/fullchain.pem"
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
</VirtualHost>
Nginx相关配置:
# Nginx second config file for gpt.
# backend
upstream gpt {
server 127.0.0.1:5000;
}
server {
listen 80;
listen 443 ssl;
server_name gptus.xxx.com;
ssl_certificate certs/xxx.com.crt;
ssl_certificate_key certs/xxx.com.key;
access_log logs/gpt_access.log;
error_log logs/gpt_error.log;
location / {
proxy_pass http://gpt;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
配置正常,页面均可访问且提问对话;就是Nginx会出现上述状况。
经过排查,使用Nginx的,在提问后,接口通信HTTP的Response Header并未立刻给出响应,而是在服务端完成回答后会一起响应和给出答案:
这样展示就很不友好,正常情况是会显示出回答过程的。
经过测试和验证,这是由于Nginx和Node之间的缓冲区导致,在配置中加入
proxy_buffering off;
禁用Nginx的缓冲,使得响应能够实时显示。


