nginx 重复提交 重复请求问题,穿插nginx重传机制

本文探讨了在nginx + tomcat环境下,后台收到重复请求的问题。问题源于nginx的重传机制。解决方案包括将ajax请求改为POST,升级nginx,关闭或调整proxy_next_upstream配置,以及设置合理的超时时间。同时,文中详细解析了nginx的重试条件、次数限制和超时设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

后台使用的是nginx + tomcat

前端页面确实只发送了一个ajax请求到后台。
后台却接收到了两条请求!

解决方案1和2是可以解决的,3和4会尽量详细分析有关nginx重传机制,

解决方案1

把ajax改成了post方式(因为nginx对get和post以及文件上传下载做了区别性的重传机制)

解决结果1

问题解决

 

解决方案2

升级nginx,用较新版本的

解决结果2

问题解决

 

解决方案3

因为nginx负载均衡,一个请求超时后会重复发送一次请求给下一个服务端。

在nginx.conf中配置:
proxy_next_upstream off
 

注:不同的参数参考

error # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误 
timeout # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时 
invalid_header # 后端服务器返回空响应或者非法响应头 
http_500 # 后端服务器返回的响应状态码为500 
http_502 # 后端服务器返回的响应状态码为502 
http_503 # 后端服务器返回的响应状态码为503
http_504 # 后端服务器返回的响应状态码为504 
http_404 # 后端服务器返回的响应状态码为404
non_idempotent # 通常,具有请求 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器的下一个服务器; 明确启用此选项将允许重试此类请求; 
off # 停止将请求发送给下一台后端服务器 

运用场景

1、proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;
当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率,多可运用于前台程序负载,设置为上述值
2、proxy_next_upstream off
当访问A时,A返回error 或者 timeout时,访问会继续分配到下一台服务器处理,就等于一个请求分发到多台服务器,就可能出现多次处理的情况,这种情况下就要把proxy_next_upstream关掉,设置为proxy_next_upstream off
3.proxy_next_upstream 默认值: proxy_next_upstream error timeout;

PS1:nginx重试机制官方文档

Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;

Default: proxy_next_upstream error timeout;

Context: http, server, location

PS2:nginx重复次数设置官方文档

Syntax: proxy_next_upstream_tries number;
Default: proxy_next_upstream_tries 0;
Context: http, server, location

This directive appeared in version 1.7.5.

PS3: nginx重复时间设置官方文档

Syntax:    proxy_next_upstream_timeout time;
Default:    
proxy_next_upstream_timeout 0;
Context:    http, server, location
This directive appeared in version 1.7.5.

 

 

解决方案4

fail_timeout的时间设置长点或者   proxy_read_timeout 和 proxy_send_timeout  设置长一点

参考实例

#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
	server_names_hash_bucket_size 1024;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  logs/access.log;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
	upstream cluster {
		server node#1:80 weight=3 max_fails=2 fail_timeout=450s;
		server node#2:80 weight=3 max_fails=2 fail_timeout=450s;
	}
    server {
        listen       80;
        server_name  dns#1;
 
		location / {
			proxy_pass http://cluster/;
			proxy_next_upstream     error timeout invalid_header http_404;
		        proxy_connect_timeout   2;
			proxy_read_timeout 600;
			proxy_send_timeout 600;
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
    }
    server {
        listen       80;
        server_name  dns#2;
 
		location / {
			proxy_pass http://cluster/;
			proxy_next_upstream     error timeout invalid_header http_404;
		        proxy_connect_timeout   2;
			proxy_read_timeout 600;
			proxy_send_timeout 600;
			proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
    }
 
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值