Nginx+Tomcat实现负载均衡
为了分担单个服务器的压力,也为了当服务器宕机时照样可以继续访问自己的网页,所以用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;#服务器配置 }
里面是监听端口监听的所有的Tomcat的IP和端口号
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可以根据自己来定,但是第二个端口一定要和Nginx里server集群里的端口一致,要不监控不到
弄完后去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中的对象
这样redis和session共享不会因为nginx分发请求而不能用,还分担了单个服务器的压力(对于用什么分配策略就要根据自己的需求来定了)
最后给大家一个在Windows下启动,停止,重新配置(nginx.conf改变了就需要重新配置)Nginx的命令https://www.geek-share.com/detail/2704898720.html
- Nginx加多个tomcat实现负载均衡,动静分离
- tomcat+nginx+redis实现均衡负载、session共享
- Nginx+Tomcat+Redis实现负载均衡与Session共享之五 — Nginx+Tomcat+Redis实现Session共享
- Nginx+Tomcat 动静分离实现负载均衡
- nginx + tomcat 实现负载均衡和服务器集群
- Debian下搭建Nginx和Tomcat服务器实现负载均衡的方案
- nginx+tomcat+memcached实现负载均衡与session共享
- tomcat+nginx+shiro+jfinal 实现负载均衡,session共享
- nginx + tomcat实现负载均衡
- tomcat+nginx+redis实现均衡负载、session共享(一)
- Nginx+Tomcat实现负载均衡
- Nginx+Tomcat实现负载均衡集群
- Nginx+Tomcat+Redis实现负载均衡与Session共享之三 — Gradle下载配置
- tomcat+nginx+redis实现均衡负载、session共享(一)
- Nginx + Tomcat 动静分离实现负载均衡
- Nginx + Tomcat 动静分离实现负载均衡
- tomcat+nginx+redis实现均衡负载、session共享(一)
- Nginx+Tomcat实现负载均衡小demo
- Nginx+Tomcat+Memcache实现负载均衡及Session共享
- Nginx + Tomcat 动静分离实现负载均衡