为了分担单个服务器的压力,也为了当服务器宕机时照样可以继续访问自己的网页,所以用Nginx和Tomcat来实现负载均衡,其实这样也做到了前后端分离,Nginx做反向代理
这个图显示大概,session和redis共享就包含在SSM里了
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
直接把Tomcat的压缩包再解压一次,旧的不要动,修改新的server.xml(conf)
# 第一个端口,Server port节点端口
# 第二个端口,Connector port节点端口,也即是Tomcat访问端口
# 第三个端口,Connector port节点端口
上面的port可以根据自己来定,但是第二个端口一定要和Nginx里server集群里的端口一致,要不监控不到
弄完后去bin里启动Tomcat,看看能不能打开,一般是能的,不能就重新按
这个百度
部署完点击新的Tomcat
选中中间的这个,咱来测试是否成功
jsp里要有这两行
//知道sessionID
jsessionid=${pageContext.session.id}
//可以知道你现在访问页面用的是哪个Tomcat端口
<%=request.getRealPath("/")%>
这样完成了,虽然访问的Tomcat不一样,端口也不一样,但是sessionID没有变,
这个就不用大家操心了,只要你的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.cnblogs.com/qianzf/p/6809427.html