You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求验证Vaadin+Spring Boot+Tomcat+NGINX长轮询Push配置

Vaadin长轮询Push配置验证排查

问题背景

在Vaadin(Java、Spring Boot)+ NGINX + Tomcat环境中配置长轮询Push时,出现Push意外停止工作的问题,需硬刷新页面恢复,但普通XHR请求正常。现针对系统长轮询相关配置(超时、缓冲区等)进行问题排查。


现有配置信息

1. Vaadin/Spring Boot/Tomcat配置

server.servlet.session.persistent=false
server.servlet.session.timeout=30m
server.servlet.session.tracking-modes=cookie
server.servlet.session.cookie.http-only=true
server.servlet.session.cookie.secure=true
server.servlet.session.cookie.max-age=365d

server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=common

vaadin.whitelisted-packages=com.vaadin,org.vaadin,com.examle
vaadin.heartbeatInterval=30
vaadin.pushLongPollingSuspendTimeout=25000
vaadin.maxMessageSuspendTimeout=5000
vaadin.closeIdleSessions=false

vaadin.eagerServerLoad=false

2. NGINX配置

server {
    
    sendfile                   on;
    tcp_nodelay                on;
    tcp_nopush                 on;
  
    etag                       off;
    if_modified_since          off;
  
    proxy_buffering            off;

    proxy_buffer_size          128k;
    proxy_buffers              4 256k;
    proxy_busy_buffers_size    256k;

    proxy_cache                off;
    proxy_cache_convert_head   off;
    proxy_max_temp_file_size   0;
    client_max_body_size       0;
  
    proxy_http_version         1.1;
    proxy_pass_request_headers on;
    proxy_pass_request_body    on;
  
    proxy_read_timeout         300;
    proxy_connect_timeout      300;
    proxy_send_timeout         300;
    reset_timedout_connection  on;
  
    proxy_redirect             off;
    resolver                   77.88.8.8 77.88.8.1 8.8.8.8 8.8.4.4 valid=1d;
  
    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_min_length 256;
    gzip_types
    application/atom+xml
    application/geo+json
    application/javascript
    application/x-javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rdf+xml
    application/rss+xml
    application/xhtml+xml
    application/xml
    font/eot
    font/otf
    font/ttf
    image/svg+xml
    text/css
    text/javascript
    text/plain
    text/xml;

    location / {
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Frame-Options "ALLOW-FROM blog.example.com";
        add_header Access-Control-Allow-Origin example.com;
        add_header Access-Control-Allow-Origin blog.example.com;
        add_header Content-Security-Policy "frame-ancestors example.com blog.example.com";

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_read_timeout     300;
        proxy_connect_timeout  300;
        proxy_send_timeout     300;

        include /etc/nginx/snippets/cors.conf;
        proxy_pass http://127.0.0.1:8080;
            proxy_redirect http://127.0.0.1:8080 /;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr; 
    }
}

3. Linux sysctl参数

sysctl -w net.ipv4.tcp_retries2=5
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.ipv4.tcp_keepalive_intvl=1
sysctl -w net.ipv4.tcp_keepalive_probes=5

配置问题排查点

Vaadin配置

  • 超时不匹配:vaadin.pushLongPollingSuspendTimeout=25000(25秒)远小于NGINX的proxy_read_timeout=300(300秒)。长轮询请求在服务器端挂起25秒后会主动结束,但NGINX会等待300秒才超时,可能导致连接处于半开状态,后续Push请求无法正常建立。建议将vaadin.pushLongPollingSuspendTimeout调整为略小于NGINX的proxy_read_timeout(比如280秒,即280000毫秒),同时确保vaadin.heartbeatInterval=30(30秒)小于该超时值,避免心跳请求被阻塞。
  • 拼写错误:vaadin.whitelisted-packages中的com.examle应为com.example,虽不直接影响Push,但可能导致自定义组件加载异常。

NGINX配置

  • WebSocket配置干扰长轮询:proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "Upgrade";是WebSocket专属配置,长轮询无需这些设置,可能导致NGINX错误地将长轮询请求当作WebSocket处理,引发连接异常。建议移除这两行配置。
  • 重复Header设置无效:X-Frame-Options和Access-Control-Allow-Origin重复设置,NGINX只会生效最后一行。比如Access-Control-Allow-Origin最终只会返回blog.example.com,若需要支持多个域名,应通过变量或配置文件动态处理,而非重复添加。
  • 冗余缓冲区配置:proxy_buffering off;已关闭缓冲,但仍配置了proxy_buffer_size等参数,这些参数在缓冲关闭时无效,可清理以避免混淆。

Linux sysctl参数

  • TCP Keepalive间隔过短:tcp_keepalive_intvl=1(1秒)过于频繁,会产生大量Keepalive报文,可能触发中间网络设备的限流或连接断开。建议调整为更合理的值(如15秒),减少不必要的网络开销。

内容的提问来源于stack exchange,提问作者alexanoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:12:54