一、问题及方案
见这篇文章:
二、分布式环境搭建:
系统环境
[root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@centos7 ~]#
2.1 安装jdk
# 下载jdk-8u141-linux-x64.tar.gz# 创建目录mkdir -p /opt/java# 解压tar -xzvf jdk-8u141-linux-x64.tar.gz -C /opt/java# 创建链接ln -s /opt/java/jdk1.8.0_141 /usr/local/jdk# 设置变量 /etc/profile末尾添加export JAVA_HOME=/usr/local/jdkexport CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar# 使变量生效source /etc/profileexport PATH=$JAVA_HOME/bin:$PATH# 验证java -version
2.2 安装tomcat
安装3个tomcat并设置其端口号
# 下载apache-tomcat-8.5.16.tar.gz# 创建目录mkdir -p /opt/tomcat# 解压tar -xzvf apache-tomcat-8.5.16.tar.gz -C /opt/tomcat# 清空ROOT目录rm -rf /opt/tomcat/apache-tomcat-8.5.16/webapps/ROOT/*# 复制3个tomcatcd /opt/tomcatcp -a apache-tomcat-8.5.16 tomcat1cp -a apache-tomcat-8.5.16 tomcat2cp -a apache-tomcat-8.5.16 tomcat3# 修改端口号sed -i '22s/8005/8'"$i"'05/' $filesed -i '69s/8080/8'"$i"'80/' $filesed -i '116s/8009/8'"$i"'09/' $file
修改如下3个端口号
用如下脚本修改:a.sh
#!/bin/shfor i in {1..3}do file=/opt/tomcat/tomcat"$i"/conf/server.xml sed -i '22s/8005/8'"$i"'05/' $file sed -i '69s/8080/8'"$i"'80/' $file sed -i '116s/8009/8'"$i"'09/' $file #sed -i '148s#appBase=".*"#appBase="/data/webapps"#' $filedone
执行脚本修改端口
sh a.sh执行后,3个tomcat的端口号分别改为8180,8280,8380
启动并验证这3个tomcat
# 分别向3个tomcat写入一个测试文件a.txtfor i in {1..3};do echo 8"$i"80>/opt/tomcat/tomcat"$i"/webapps/ROOT/a.txt;done# 启动for i in {1..3};do /opt/tomcat/tomcat"$i"/bin/startup.sh;done# 验证for i in {1..3};do curl 127.0.0.1:8"$i"80/a.txt;done
2.3 安装nginx
# 下载nginx-1.13.9.tar.gzmkdir -p /opt/nginx/nginx-1.3.13.9# 创建用户useradd nginx -s /sbin/nologin -M# 安装pcre opensslyum install pcre pcre-devel openssl openssl-devel -y# 解压、编译安装tar -xzvf nginx-1.13.9.tar.gzcd nginx-1.13.9./configure --user=nginx --group=nginx --prefix=/opt/nginx/nginx-1.13.9 --with-http_stub_status_module --with-http_ssl_modulemakemake install# 创建链接ln -s /opt/nginx/nginx-1.13.9 /usr/local/nginx# 设置环境变量echo 'export PATH=/usr/local/nginx/sbin:$PATH' >> /etc/profilesource /etc/profile
nginx常用命令
# 启动nginx# 检查配置文件nginx -t# 平滑启动nginx -s reload# 检查netstat -tunlp | grep nginx
遇到的问题:
nginx: [emerg] getpwnam("nginx") failed未创建nginx用户
配置nginx
/usr/local/nginx/conf/nginx.conf
worker_processes 1;events { worker_connections 1024;}# http最外层模块http { # 全局变量参数 include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream web_pool { server 127.0.0.1:8180 weight=1; server 127.0.0.1:8280 weight=1; server 127.0.0.1:8380 weight=2; } # server相当于虚拟站点 server { listen 80; server_name localhost; location / { proxy_pass http://web_pool; index index.html index.htm; } }}
测试一下
for i in {1..9};do curl 127.0.0.1/a.txt;done
2.4 安装redis
wget http://download.redis.io/releases/redis-4.0.8.tar.gzmkdir -p /opt/redistar -xzvf redis-4.0.8.tar.gz -C /opt/redis/ln -s /opt/redis/redis-4.0.8 /usr/local/rediscd /usr/local/redismake && make install# 配置让其他机器也可以访问vi /usr/local/redis/redis.conf#bind 127.0.0.1bind 0.0.0.0
操作redis
# 查看redis版本redis-cli -v# 启动redisredis-server redis.conf > /tmp/redis.log 2>&1 &# ornohup redis-server redis.conf &# 监控redisredis-cli -h 192.168.234.130 -p 6379 monitor# 关闭redisredis-cli -h 127.0.0.1 -p 6379 shutdown
客户端
# 连接redis-cli -h 192.168.5.220# 查看keys *# 清空flushall
三、问题重现
3.1 web应用
只实现登录功能
/login 登录页面,已登录跳转到/index/logout 退出/index 首页,未登录跳转到/login
将这个应用部署到3个tomcat上
重启tomcat
for i in {1..3};do /opt/tomcat/tomcat"$i"/bin/shutdown.sh;donefor i in {1..3};do /opt/tomcat/tomcat"$i"/bin/startup.sh;done
3.2 问题描述
登录界面是8280端口,输入用户名密码点击登录,由于nginx配置的是基于轮询的算法进行分发,8380端口的服务器处理的登录,因此session创建于8380端口,而8280处于非登录状态。
四、解决实现
4.1 session sticky
修改nginx的分发算法改为基于ip
upstream web_pool { # 默认是轮询 ip_hash; server 127.0.0.1:8180 weight=1; server 127.0.0.1:8280 weight=1; server 127.0.0.1:8380 weight=2;}
修改后重启nginx
nginx -tnginx -s reload
4.2 session replication
tomcat配置server.xml
tomcat的配置web.xml
# 修改每个tomcat下的conf/web.xml不起作用# 一定要修改每个应用的web.xml,在这个节点下添加
4.3 session数据集中存储
数据存储到redis,使用spring-data-redis
见应用
把web_spring-redis.xml重命名为web.xml,部署到tomcat即可,得先启动redis参照“安装redis”这一节。
spring-redis.xml
classpath*:redis.properties
注意:
- Spring版本的选择 >=4.0.3
pom.xml
4.0.0 com.yysue java-web-login war java-web-login 0.0.1-SNAPSHOT 1.8 4.0.3.RELEASE javax.servlet javax.servlet-api 3.0.1 provided javax.servlet.jsp jsp-api 2.2 provided javax.servlet jstl 1.2 org.springframework spring-core ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-oxm ${spring.version} org.springframework spring-tx ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-context ${spring.version} org.springframework spring-context-support ${spring.version} org.springframework spring-aop ${spring.version} org.springframework.data spring-data-redis 1.5.2.RELEASE org.springframework.session spring-session-data-redis 1.2.2.RELEASE redis.clients jedis 2.8.1 org.apache.maven.plugins maven-compiler-plugin