请求验证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
相关产品推荐
相关产品推荐

