问题描述
后台使用的是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, locationThis 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;
}
}
}