Nginx+Tomcat实现负载均衡

为了分担单个服务器的压力,也为了当服务器宕机时照样可以继续访问自己的网页,所以用Nginx和Tomcat来实现负载均衡,其实这样也做到了前后端分离,Nginx做反向代理

Nginx+Tomcat实现负载均衡_第1张图片
这个图显示大概,session和redis共享就包含在SSM里了

第一步,下载Nginx,建议下载稳定版本

1、 安装路径自己选择
2、 解压完成后进入conf/nginxconf,修改配置文件

#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;

    #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  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8084;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
               proxy_connect_timeout   3;
               proxy_send_timeout      30;
               proxy_read_timeout      30;
               proxy_pass http://mycluster;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    #集群配置:服务器列表
   upstream mycluster{
      server 127.0.0.1:8080 weight=1;#服务器配置
      server 127.0.0.1:9080 weight=1;#服务器配置
    }

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

因为是简单版的,所以不需要太多
修改的第一个地方

   listen      8084;
   server_name  localhost;
   location / {
   			   proxy_set_header Host $host:$server_port;
               proxy_connect_timeout   3;
               proxy_send_timeout      30;
               proxy_read_timeout      30;
               proxy_pass http://mycluster;
        }
}

1、listen 代表监听所有Tomcat的端口,以后的访问都访问这个,不再访问8080了
2、server_name 代表的是监听端口的IP
3、 proxy_set_header Host $host:$server_port;一定要添加上,
否则你的网页可以在url框直接访问,如果用标签等是连接不到服务器端的,更别说别说访问Servlet,这时你看网址框会发现没有端口号只有你写的别名,所以加上 proxy_set_header Host $host:$server_port; 就是加上监视端口端口号 ,这样就可以经过监视端口去分发服务端集群的请求了。
4、 server大花括号里proxy_pass http://+别名,要与下面的 upstream的别名一致,
修改的第二个部分

  upstream mycluster{
     #集群配置:服务器列表
      server 127.0.0.1:8080 weight=1;#服务器配置
      server 127.0.0.1:9080 weight=1;#服务器配置
    }

里面是监听端口监听的所有的TomcatIP端口号
weight权重分配策略,关于这部分请看https://blog.51cto.com/zero01/2112989里面不光介绍了分配策略,安装步骤也有,我就是借鉴的他的
集群配置上的upstream后加的也是自己的Tomcat的IP,如果是本机就可以是localhost

第二步 在Eclipse(IDE)中部署两个端口不一样的Tomcat

直接把Tomcat的压缩包再解压一次,旧的不要动,修改新的server.xml(conf)

# 第一个端口,Server port节点端口


# 第二个端口,Connector port节点端口,也即是Tomcat访问端口


# 第三个端口,Connector port节点端口
   

上面的port可以根据自己来定,但是第二个端口一定要和Nginxserver集群里的端口一致,要不监控不到
弄完后去bin里启动Tomcat,看看能不能打开,一般是能的,不能就重新按

第三步,Eclipse部署新的Eclipse

这个百度
部署完点击新的Tomcat
Nginx+Tomcat实现负载均衡_第2张图片
选中中间的这个,咱来测试是否成功

第四步,测试

jsp里要有这两行

//知道sessionID
 
jsessionid=${pageContext.session.id}
//可以知道你现在访问页面用的是哪个Tomcat端口
<%=request.getRealPath("/")%>

Nginx+Tomcat实现负载均衡_第3张图片
Nginx+Tomcat实现负载均衡_第4张图片
这样完成了,虽然访问的Tomcat不一样,端口也不一样,但是sessionID没有变,

或许大家有这个疑问,每个Tomcat都部署上SSM,那如果redis和session共享在8080端口,下次因为权重策略下次操作在9080端口,那在端口8080中session的数据怎么在9080中获取呢?

这个就不用大家操心了,只要你的sessionID不变,那么session里的数据就不会丢失
做了一个实验:

		User user2 = (User) request.getSession().getAttribute("User");
		if(user2 != null) {
			System.out.println(user2);
		}else {
			redisUtil.hset("spring:session:sessions:"+request.getSession().getId(), "sessionAttr:"+"User", user);
			System.out.println("session中没有这个对象,往redis中添加此对象,因为共享,session中也应该存在");
			
		}

两个端口直接访问(提前往session里存了一个User)
在这里插入图片描述
在这里插入图片描述
都能获取到session中的对象
这样redissession共享不会因为nginx分发请求而不能用,还分担了单个服务器的压力(对于用什么分配策略就要根据自己的需求来定了)

最后给大家一个在Windows下启动,停止,重新配置(nginx.conf改变了就需要重新配置)Nginx的命令https://www.cnblogs.com/qianzf/p/6809427.html

你可能感兴趣的:(前端,Redis)