您的位置:首页 > 运维架构 > Tomcat

Nginx+Tomcat实现负载均衡

weixin_43113679 2019-06-06 13:49 106 查看
版权声明:如需转载,请写明出处 https://blog.csdn.net/weixin_43113679/article/details/90814881

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


这个图显示大概,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节点端口
<Server port="9005" shutdown="SHUTDOWN">

# 第二个端口,Connector port节点端口,也即是Tomcat访问端口
<Connector port="9080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />

# 第三个端口,Connector port节点端口
<Connector port="9009"
4000
protocol="AJP/1.3" redirectPort="8443" />

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

第三步,Eclipse部署新的Eclipse

这个百度
部署完点击新的Tomcat

选中中间的这个,咱来测试是否成功

第四步,测试

jsp里要有这两行

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



这样完成了,虽然访问的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.geek-share.com/detail/2704898720.html

标签: