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

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

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

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

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

首先 Nginx 官网走一波

下载安装
下载完成后 是一个zip 压缩包 解压压缩包即可
如图
Nginx +redis 负载均衡 会话共享(一):nginx 安装与配置说明_第1张图片
conf 与logs 为配置文件夹 和日志文件夹
双击 nginx.exe 可以看到黑窗口一闪而过。 查看任务管理器 已经有了nginx 的进程在跑
需要注意 nginx 默认配置监听的是80端口
此时 在浏览输入 localhost 可以看到nginx 的欢迎界面
Nginx +redis 负载均衡 会话共享(一):nginx 安装与配置说明_第2张图片

配置负载均衡
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 交互出现。 表示负载均衡配置成功!

你可能感兴趣的:(Java,nginx)