Nginx +redis 负载均衡 会话共享(一):nginx 安装与配置说明

项目中遇到了一些问题,在客户提出修改某些模块的时候。不能及时更新,可能某些时候用户正在进行一些操作。因为停掉了Tomcat 导致操作进行一半,就终止了

使用 Nginx + redis +Tomcat 实现负载均衡 和会话共享, 可以在某些服务挂掉的时候,自动转发至其他服务

本文使用 windows 服务器做演示 使用nginx版本为1.12.2 Tomcat版本为8.0

第一次配置 Nginx+ Redis 业务已经实现,nginx配置还有很多,本文只是简单的涉及到了负载均衡。以及一些常用的配置
理解上有错误,希望大家指导交流!

首先 Nginx 官网走一波

下载安装
下载完成后 是一个zip 压缩包 解压压缩包即可
如图
这里写图片描述
conf 与logs 为配置文件夹 和日志文件夹
双击 nginx.exe 可以看到黑窗口一闪而过。 查看任务管理器 已经有了nginx 的进程在跑
需要注意 nginx 默认配置监听的是80端口
此时 在浏览输入 localhost 可以看到nginx 的欢迎界面
这里写图片描述

配置负载均衡
nginx 配置的 主要文件 在conf 文件夹下:nginx.conf
主要修改的配置为 http 这段,以及 http下的server

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    #gzip  on;

     upstream hxs { 
        server 192.168.3.129:8080; 
        server 192.168.3.129:8081;      
    }  

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        proxy_set_header Host $host:$server_port; 
        location / {

            root   html;
            index  index.html index.htm;

            proxy_pass  http://hxs/hxsaloe/;
            proxy_cookie_path  /hxsaloe/ /;

            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header   Remote_Addr    $remote_addr;

            add_header 'Access-Control-Allow-Origin' *; 
            proxy_connect_timeout       100;
            proxy_read_timeout          100;
            proxy_send_timeout          100;
            charset utf-8;          
        }
    }
}

首先 看upstream 这个配置 指的是要参加负载均衡的服务器ip

在这里我配置了2台本地的Tomcat 端口不一样 相当于2台服务器 在跑Tomcat项目
这里可以配置好多种 方式的 比如

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.159.10 weight=10;
server 192.168.159.11 weight=10;
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream resinserver{
ip_hash;
server 192.168.159.10:8080;
server 192.168.159.11:8080;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream resinserver{
server server1;
server server2;
fair;
}

每个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

server 段的配置
listen 80; 指的是监控 80端口,如果有人访问80端口下的/ 就会进入这段设置

proxy_pass http://hxs/hxsaloe/; 我的理解是将请求转发到这个配置上,hxsaloe实际指的是我Tomcat下的项目名

proxy_cookie_path /hxsaloe/ /; 这段配置比较重要,因为我在实现session共享的时候,使用了号称是无缝集成的 spring-session-redis,但是客户端每次请求 都是全新的 sessionid 导致。会话共享失效,后来更改为Tomcat-session-redis 还是出现相同的问题。意识到问题出在nginx 配置上。请求丢失session的原因我是这么理解的。因为用户实际访问的是 / 根目录,但是在nginx 配置里 给转发到了/hxsaloe/ 这个路径下。浏览器监测到变化了 就重新生成cookie信息了。 所以sessionid就跟着变化了。解决方法就是 手动设置 cookie的路径 将访问/的路径cookie 设置为 /hxsaloe/ ,然后重启 session 成功实现共享

add_header ‘Access-Control-Allow-Origin’ ; 这个配置 是配置ajax 的请求跨域的, 表示接受所有

charset utf-8; 设置编码 utf-8

proxy_connect_timeout 100;
proxy_read_timeout 100;
proxy_send_timeout 100; //设置 请求 超时时间 ,请求超时 就默认以为 down掉 ,会将请求转发至别的服务

1.实际使用中遇到问题, 后端使用Spring MVC +Mybatis 框架开发 在使用 redirect 重定向的时候 。 会丢失端口号
例如 我未登录 查询个人信息,后端监测到后 重定向到 登录页面。 但是这时候 丢失了端口号。 提示404错误
产生的原因是 nginx没有正确的把端口信息传送到后端
解决方案 添加配置 :

proxy_set_header Host host: server_port;

启动nginx 访问localhost 刷新几下页面 。会看到Tomcat1 和Tomcat2 交互出现。 表示负载均衡配置成功!

猜你喜欢

转载自blog.csdn.net/chenmmo/article/details/78910279