我们有一个 Java Spring Boot 应用程序,它位于 NGIX 反向代理后面。使用 HTTP 时,一切都按预期运行 - API 响应时间非常快。
一旦协议切换到 HTTPS,API 响应时间就会大大减少。在浏览器开发工具中,请求会长时间显示为待处理状态。在后端,API 服务线程不会返回,最终无法释放数据库连接。
由于当直接访问 API 而不通过 NGINX 时不会发生这种情况,并且当 SSL 关闭时也不会发生这种情况,所以我认为这是 SSL 配置出了问题。到目前为止,我不知道这可能是什么问题,因为在我看来这很正常。有什么线索可以说明可能会发生什么或如何解决问题吗?
NGINX 版本:
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
NGINX 配置如下:
server {
listen 443 ssl http2;
server_name something.de;
access_log /var/log/nginx/something.access.log;
access_log syslog:server=unix:/dev/log,facility=local7,tag=nginx combined;
root /usr/share/something/ui/web;
index index.html index.htm;
# SUPPORT-136 set max upload to 70M
client_max_body_size 70M;
location / {
# SUPPORT-271 lock out unsupported browsers
if ($http_user_agent ~ 'MSIE|Trident|Firefox|Opera') {
rewrite ^.* /unsupportedBrowser.html break;
}
if ($http_user_agent ~ 'iPhone;' ) {
root /usr/share/something/ui/iphone;
}
index index.html index.htm;
}
location /api {
proxy_pass http://upstream_something/api;
proxy_read_timeout 180;
proxy_hide_header WWW-Authenticate;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# GZIP Compression of responses
#
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# SSL security
#
ssl_certificate /etc/ssl/certs/STAR_something.bundle;
ssl_certificate_key /etc/ssl/private/STAR_something.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparams.pem;
# General security
add_header X-Frame-Options SAMEORIGIN always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
答案1
我发现一个常见问题与 nginx 缓冲响应有关。关闭缓冲时,响应会从 NGINX 同步传递到客户端。
为此,请在您的 api 位置块中包含以下行。
proxy_buffering off;