nginx负载均衡+反向代理

最近业务上遇到一个需求,其它系统因业务校验需要调用上级系统进行数据发送或校验,如果上级系统停机维护,其它下级系统发送的http通讯会丢失,还要一次次补发数据,耗费人工与时间。使用nginx+反向代理解决了部分需求。
目标:当服务A停机维护,其它系统会调用服务B进行http通讯。
nginx负载均衡+反向代理_第1张图片

加入代理配置,上级系统配置nginx.conf文件。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
	#nginx日志
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" $http_host'
                  '$status $body_bytes_sent "$http_referer" $upstream_addr'
                  '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile        on;
    keepalive_timeout  65;
	
	
	upstream linuxidc { 
	    ip_hash;
        server 127.0.0.1:7080 weight=3; 
        server 127.0.0.1:7081 weight=2; 
	}
	server {
        listen  8812;
        server_name localhost;
        #nginx日志
        access_log logs/access.log.lb01 main;
        location /{
            proxy_pass http://linuxidc/;
            rewrite ^/api$ /$1 break;
            client_max_body_size 300M;
        }
    }
    
}

踩坑点:记得加上proxy_pass 最后这个“/”,特此注意。

proxy_pass http://linuxidc/;

upstream设备上的状态设置

1、weight:默认为1.weight越大,负载的权重就越大。
2、ip_hash:nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,一个服务挂掉,需重新登录获取session。
因此ip_hash是有缺陷的,不能在一些情况下使用:
2-1、 nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址。
2-2、nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求不能定位到同一台session应用服务器上。

nginx日志配置

1、upstream_addr:后台upstream的地址,即真正提供服务的主机地址。
2、http_host:请求地址,即浏览器中你输入的地址(IP或域名)。

已解决问题

nginx配置的日志,日志文件存放在log目录下access.log.lb01。
在这里插入图片描述
从日志中可以看出,因为配置了ip_hash,每次的请求并没有负载,当把ip与服务匹配的服务进程干掉,继续调用接口,此时会负载走另外的服务。

未解决的问题

没有处理session或token共享问题。咨询了一下大佬,解决这个问题登录的时候需要把session或token放入redis,每次去调用接口,带着session或token一起请求,这样每次的请求会负载到不同的服务中。

你可能感兴趣的:(nginx,负载均衡,服务器)