内容纲要
一、nginx实现全栈SSL。要求http rewrite到https协议。
1、使用yum -y install nginx 安装nginx.
2、修改/etc/nginx/nginx.conf文件
在最后一个}前添加一行:
include /etc/nginx/conf.d/*.conf; #设置完此行后无需修改nginx.conf的默认配置文件,直接在/etc/nginx/conf.d/下创建一个baidu.conf文件。后期直接修改baidu.conf即可
3、mkdir /etc/nginx/conf.d/ #创建目录
4、baidu.conf文件内容如下:
cat /etc/nginx/conf.d/baidu.conf
server {
listen 80;
server_name 10.0.0.138;
location / { #针对全站跳转
root html;
index index.html;
if ($scheme = http ){ #如果没有加条件判断,会导致死循环
rewrite / https://www.baidu.com redirect;
}
}
location /login { #针对特定的URL进行跳转https
if ($scheme = http ){ #如果没有加条件判断,会导致死循环
rewrite / https://www.baidu.com redirect;
}
}
}
5、配置完毕后的结果,只要通过http协议访问10.0.0.138的80端口就默认跳转到https://www.baidu.com。全站跳转,无论在IP地址后跟任何url都跳转到百度。
二、nginx实现动静分离
location / {
proxy_pass http://10.0.0.28;
index index.html;
}
location ~ \.php$ {
root /data/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
三、nginx实现防盗链功能
语法格式:
location /images {
root /data/nginx/html/pc;
index index.html;
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;
if ($invalid_referer) {
return 403;
}
例:
server {
index index.html;
valid_referers none blocked server_names *.magedu.com *.magedu.org ~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.dogedoge\. ; #定义有效的referer
if ($invalid_referer) { #假如是使用其他的无效的referer访问
return 403 "Forbidden Access"; #返回状态码403
}
四、解析nginx常见的负载均衡算法
nginx负载均衡分为http协议和四层负载均衡。其中http协议负载均衡算法分为:ip_hash、hask key、leash_conn.
五、基于LNMP完成搭建任意一种应用
1、环境:10.0.0.138--rocky8,仅做了初始化
2、安装nginx,可使用yum -y install nginx或上一篇文章讲的编译安装。
3、安装Tomcat及JDK,
tomcat下载地址:https://tomcat.apache.org/
JDK下载地址:https://www.oracle.com/java/technologies/downloads/#java8 #注意:下载官方JDK需要登录Oracle账号。
根据安装的JDK配置环境变量:
[root@rocky ~]# cat /etc/profile.d/jdk.sh | grep -v '^#'
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
. /etc/profile.d/jdk.sh #是环境变量生效
4、下载jpress.war包到安装好的Tomcat下,这里的Tomcat的安装目录是/use/local/tomcat,所以放到/usr/local/tomcat/webapps/
mv jpress.war /proxy_pass http://10.0.0.138:8080/jpress/ #不用解压,war包会自动解压
结果:
5、修改nginx配置文件:
location / {
root html;
index index.html index.htm;
proxy_pass http://10.0.0.138:8080/jpress/;
}
location /jpress/ {
index index.html;
proxy_pass http://10.0.0.138:8080;
}
重启nginx:systemctl restart nginx
如果nginx没有启动那使用:systemctl enable --now nginx #设为开启自启并启动nginx。
6、安装数据库:这里直接使用yum -y install mysql-server,启动数据库:systemctl enable --now mysqld
添加账号: create user jpress@'10.0.0.%' identified by '123456';
创建数据库: create database jpress;
账号授权: grant all on jpress.* to jpress@'10.0.0.%';
7、测试访问:10.0.0.138
访问结果:
根据上面的数据库设置填写即可。
六、jumpserver 总结安装部署,添加用户授权,行为审计
基于容器部署单台:2核、4G内存、50G硬盘--最低配置 mysql版本大于5.7 redis版本大于6.0 基于docker部署: 环境:10.0.0.136--rocky 1、设置docker.repo cat /etc/yum.repo.d/docker.repo [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-stable-debuginfo] name=Docker CE Stable - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-stable-source] name=Docker CE Stable - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test] name=Docker CE Test - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test-debuginfo] name=Docker CE Test - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test-source] name=Docker CE Test - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly] name=Docker CE Nightly - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly-debuginfo] name=Docker CE Nightly - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly-source] name=Docker CE Nightly - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg #配置阿里云镜像加速: mkdir -p /etc/docker cat /etc/docker/daemon.json { "registry-mirrors": ["https://npud8xro.mirror.aliyuncs.com"] } 2、安装mysql docker run --rm --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jumpserver -e MYSQL_USER=jumpserver -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.30 ###默认的mysql不符合jumpserver配置,需修改。 docker stop mysql 准备相关配置和目录 mkdir -p /etc/mysql/mysql.conf.d/ mkdir -p /etc/mysql/conf.d/ 指定字符集 tee /etc/mysql/mysql.conf.d/mysqld.cnf <<EOF [mysqld] pid-file= /var/run/mysqld/mysqld.pid socket= /var/run/mysqld/mysqld.sock datadir= /var/lib/mysql symbolic-links=0 character-set-server=utf8 EOF tee /etc/mysql/conf.d/mysql.cnf <<EOF [mysql] default-character-set=utf8 EOF 将上面宿主机的设置好的配置文件挂载至MySQL容器 docker run -d -p 3306:3306 --name mysql --restart always -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jumpserver -e MYSQL_USER=jumpserver -e MYSQL_PASSWORD=123456 -v /data/mysql:/var/lib/mysql -v /etc/mysql/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf mysql:5.7.30 验证mysql docker exec -it mysql sh # mysql -p123456 -e 'show variables like "character%"' # mysql -p123456 -e 'show variables like "collation%"' # mysql -p123456 -e 'select user,host from mysql.user' 验证是否可以远程登录: mysql -ujumpserver -p123456 -h10.0.0.136 3、安装redis docker run -d -p 6379:6379 --name redis --restart always redis:6.2.5 验证redis是否正常连接 redis-cli -h 10.0.0.136 4、生成key,官方有文档 #!/bin/bash if [ ! "$SECRET_KEY" ]; then SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50`; echo "SECRET_KEY=$SECRET_KEY" >> ~/.bashrc; echo SECRET_KEY=$SECRET_KEY; else echo SECRET_KEY=$SECRET_KEY; fi if [ ! "$BOOTSTRAP_TOKEN" ]; then BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16`; echo "BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN" >> ~/.bashrc; echo BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN; else echo BOOTSTRAP_TOKEN=$BOOTSTRAP_TOKEN; fi 运行脚本,结果显示key和token。 可用tail -n2 ~/.bashrc 查看生成的key和token 5、看官方文档、看官方文档、看官方文档。别人讲的终归是别人讲的也有可能是错的。。。 地址:https://docs.jumpserver.org/zh/master/install/setup_by_fast/#_3 官网安装命令: cd /opt wget https://github.com/jumpserver/installer/releases/download/v2.27.0/jumpserver-installer-v2.27.0.tar.gz #下载安装包 tar -xf jumpserver-installer-v2.27.0.tar.gz cd jumpserver-installer-v2.27.0 # 根据需要修改配置文件模板, 如果不清楚用途可以跳过修改,这里是已经改过的。jumpserver安装是会根据配置文件自动选择 cat config-example.txt # JumpServer configuration file example. # # 如果不了解用途可以跳过修改此配置文件, 系统会自动填入 # 完整参数文档 https://docs.jumpserver.org/zh/master/admin-guide/env/ ################################## 镜像配置 ################################### # # 国内连接 docker.io 会超时或下载速度较慢, 开启此选项使用华为云镜像加速 # 取代旧版本 DOCKER_IMAGE_PREFIX # DOCKER_IMAGE_MIRROR=1 ################################## 安装配置 ################################### # # JumpServer 数据库持久化目录, 默认情况下录像、任务日志都在此目录 # 请根据实际情况修改, 升级时备份的数据库文件(.sql)和配置文件也会保存到该目录 # VOLUME_DIR=/opt/jumpserver # 加密密钥, 迁移请保证 SECRET_KEY 与旧环境一致, 请勿使用特殊字符串 # (*) Warning: Keep this value secret. # (*) 勿向任何人泄露 SECRET_KEY # SECRET_KEY=WoGoMXpkhmTN1lePpx694NysQfCefj8R9jLDuDuQ5W0MO9XCeS # 组件向 core 注册使用的 token, 迁移请保持 BOOTSTRAP_TOKEN 与旧环境一致, # 请勿使用特殊字符串 # (*) Warning: Keep this value secret. # (*) 勿向任何人泄露 BOOTSTRAP_TOKEN # BOOTSTRAP_TOKEN=LcvHUEldOsJ1ZAHO # 日志等级 INFO, WARN, ERROR # LOG_LEVEL=ERROR # JumpServer 容器使用的网段, 请勿与现有的网络冲突, 根据实际情况自行修改 # DOCKER_SUBNET=192.168.250.0/24 # ipv6 nat, 正常情况下无需开启 # 如果宿主不支持 ipv6 开启此选项将会导致无法获取真实的客户端 ip 地址 # USE_IPV6=0 DOCKER_SUBNET_IPV6=fc00:1010:1111:200::/64 ################################# MySQL 配置 ################################## # 外置 MySQL 需要输入正确的 MySQL 信息, 内置 MySQL 系统会自动处理 # DB_HOST=10.0.0.136 DB_PORT=3306 DB_USER=jumpserver DB_PASSWORD=123456 DB_NAME=jumpserver ################################# Redis 配置 ################################## # 外置 Redis 需要请输入正确的 Redis 信息, 内置 Redis 系统会自动处理 # REDIS_HOST=10.0.0.136 REDIS_PORT=6379 REDIS_PASSWORD= ################################## 访问配置 ################################### # 对外提供服务端口, 如果与现有服务冲突请自行修改 # 如果不想对外提供访问可以使用 127.0.0.1:<port>, eg: 127.0.0.1:33060 # HTTP_PORT=80 SSH_PORT=2222 MAGNUS_PORTS=30000-30100 ################################# HTTPS 配置 ################################# # 参考 https://docs.jumpserver.org/zh/master/admin-guide/proxy/ 配置 # # USE_LB=1 # HTTPS_PORT=443 # SERVER_NAME=your_domain_name # SSL_CERTIFICATE=your_cert # SSL_CERTIFICATE_KEY=your_cert_key # CLIENT_MAX_BODY_SIZE=4096m ################################## 组件配置 ################################### # 组件注册使用, 默认情况下向 core 容器注册, 集群环境需要修改为集群 vip 地址 # CORE_HOST=http://core:8080 # Task 配置, 是否启动 jms_celery 容器, 单节点必须开启 # USE_TASK=1 # XPack 包, 企业版本自动开启, 开源版本设置无效 # RDP_PORT=3389 # Core Session 定义, # SESSION_COOKIE_AGE 表示闲置多少秒后 session 过期, # SESSION_EXPIRE_AT_BROWSER_CLOSE=true 表示关闭浏览器即 session 过期 # # SESSION_COOKIE_AGE=86400 SESSION_EXPIRE_AT_BROWSER_CLOSE=True # Lion 开启字体平滑, 优化体验 # JUMPSERVER_ENABLE_FONT_SMOOTHING=True ################################## 其他配置 ################################## # 终端使用宿主 HOSTNAME 标识, 首次安装自动生成 # SERVER_HOSTNAME=${HOSTNAME} # 当前运行的 JumpServer 版本号, 安装和升级完成后自动生成 # CURRENT_VERSION= 6、安装过程基本都是默认即可。一路回车,安装完毕后./jmctl.sh start启动即可 # 安装 ./jmsctl.sh install # 启动 ./jmsctl.sh start # 安装完成后配置文件 /opt/jumpserver/config/config.txt cd /opt/jumpserver-installer-v2.27.0 # 启动 ./jmsctl.sh start # 停止 ./jmsctl.sh down # 卸载 ./jmsctl.sh uninstall # 帮助 ./jmsctl.sh -h 7、启动成功后的url:10.0.0.136 默认账户:admin 密码一致。 创建顺序: 创建登录jumpserver用户,创建组,将用户加进组里。 创建登录服务器的特权用户(root),普通用户, 添加资产--服务器,绑定特权用户和普通用户 测试连接,推送普通用户致服务器,在普通用户界面添加资产 资产授权:授权登录jumpserver的用户可远程访问哪几台服务器。 也可创建审计用户,查看普通用户在服务器的操作、录像、回放、强制踢人等操作。 8、先创建命令过滤器再创建里面的规则,不允许普通用户删除文件、远程其他服务器等操作 9、也支持使用特定格式导入导出资产列表
相关截图:
1、首页
2、用户
3、资产
4、系统用户
5、审计用户
6、会话监控
7、会话回放及下载
七、JVM垃圾回收原理,JVM调优
JVM垃圾回收原理: 1、垃圾确定的方法。 1.1 引用计数: 每一个堆内对象上都与一个私有引用计数器,记录着被引用的次数,引用计数清零,该对象所占用堆内存就可以被回收。循环引用的对象都无法将引用计数归零,就无法清除。Python中即使用此种方式 1.2 根搜索(可达)算法 Root Searching 2、垃圾的回收 2.1 标记-清除 Mark-Sweep 分垃圾标记阶段和内存释放两个阶段。 标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆 对未标记对象(即不再使用的对象)逐一进行清理。 特点: 优点:算法简单 缺点:标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也会受到影响) 2.2 标记-压缩 (压实)Mark-Compact 分垃圾标记阶段和内存整理两个阶段。 标记阶段,找到所有可访问对象打个标记。 内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。 特点: 标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。 缺点是内存整理过程有消耗,效率相对低下 2.3 复制copying 先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。 特点 好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以即使对象很多,收回效率也很高 缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。 3、何时回收垃圾 1. 起始时,所有新建对象(特大对象直接进入老年代)都出生在eden,当eden满了,启动GC。这个称为Young GC 或者 Minor GC。 2. 先标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调换),eden剩余所有空间都清空。GC完成。 3. 继续新建对象,当eden再次满了,启动GC。 4. 先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成 5. 继续新建对象,当eden满了,启动GC。 6. 先标记eden和s1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成 以后就重复上面的步骤。 通常场景下,大多数对象都不会存活很久,而且创建活动非常多,新生代就需要频繁垃圾回收。 但是,如果一个对象一直存活,它最后就在from、to来回复制,如果from区中对象复制次数达到阈值(默认15次,CMS为6次,可通过java的选项 -XX:MaxTenuringThreshold=N 指定),就直接复制到老年代。
JVM调优:
1、java -cp . -Xms512m -Xmx1g jpress #指定java允许的初始内存和总内存都为512M允许jpress程序 2、JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= -XX:MaxNewSize= " -server:服务器模式 -Xms:堆内存初始化大小 -Xmx:堆内存空间上限 -XX:NewSize=:新生代空间初始化大小 -XX:MaxNewSize=:新生代空间最大值 例:tomcat的catalina.sh里添加一行 JAVA_OPTS="-server -Xms128m -Xmx512m -XX:NewSize=48m -XX:MaxNewSize=200m" #运行在server模式初始内存128M,最大内存512M,设置初始新生代大小为48M,设置最大新生代内存空间200M。 3、线程池调整 #vim /usr/local/tomcat/conf/server.xml ...... <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="2000"/> connectionTimeout :连接超时时长,单位ms maxThreads:最大线程数,默认200,也就是我们常说的并发连接数 minSpareThreads:最小空闲线程数 maxSpareThreads:最大空闲线程数 acceptCount:当启动线程满了之后,等待队列的最大长度,默认100 URIEncoding:URI 地址编码格式,建议使用 UTF-8 enableLookups:是否启用客户端主机名的DNS反向解析,缺省禁用,建议禁用,就使用客户端IP就行 compression:是否启用传输压缩机制,建议 "on",CPU和流量的平衡 compressionMinSize:启用压缩传输的数据流最小值,单位是字节 compressableMimeType:定义启用压缩功能的MIME类型text/html, text/xml, text/css,text/javascript 4、指定垃圾回收器--适合响应时间短、交互式的网站,提高用户体验 #将参数加入到bin/catalina.sh中,重启观察Tomcat status。老年代已经使用CMS [root@tomcat ~]#vim /usr/local/tomcat/bin/catalina.sh ...... # OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-server -Xmx512m -Xms128m -XX:NewSize=48m -XX:MaxNewSize=200m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5"
八、tomcat实现java应用发布
1、安装jdk,提前准备好jdk,这里使用的是jdk-8u321-linux-x64.tar.gz
tar xvf jdk-8u321-linux-x64.tar.gz /usr/local/ && cd /usr/local #解压并进入目录
ln -s jdk1.8.0_321 jdk #创建软连接
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=、usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/:$JRE_HOME/lib/
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
#创建环境变量
java -version #查看jdk是否安装成功
2、安装tomcat,提前准备好tomcat
tar xvf apache-tomcat-9.0.59.tar.gz /usr/local/ && cd /usr/local #解压并进入目录
ln -s apache-tomcat-9.0.59 tomcat #创建软连接
echo "PATH=/usr/local/tomcat/bin:"'$PATH' > /etc/profile.d/tomcat.sh #创建环境变量
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat #创建用户
cat > /usr/local/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=/usr/local/jdk
EOF #配置jdk环境到tomcat配置目录下
chown -R tomcat.tomcat /usr/local/tomcat #授权
3、设置systemd文件,方便使用systemctl。
vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
########################
4、设置服务
systemctl daemon-reload #重新载入systemd
systemctl enable --now tomcat #设为开机自启并启动服务
5、下载jpress包,地址:http://www.jpress.cn/club/post/116
mv jpress.war /usr/local/tomcat/webapps/
#将下载好的war包移动至tomcat目录中,war包会自动解压和文件名一致的文件夹(tomcat服务必须是启动状态)
结果:
[root@rocky /usr/local/tomcat/webapps]$ll
total 130628
drwxr-x--- 15 tomcat tomcat 4096 Nov 19 00:03 docs
drwxr-x--- 7 tomcat tomcat 99 Nov 19 00:03 examples
drwxr-x--- 6 tomcat tomcat 79 Nov 19 00:03 host-manager
drwxr-x--- 5 tomcat tomcat 70 Nov 20 04:53 jpress
-rw-r--r-- 1 root root 70483256 Nov 20 04:51 jpress.war
drwxr-x--- 6 tomcat tomcat 114 Nov 19 00:03 manager
drwxr-x--- 3 tomcat tomcat 223 Nov 19 00:03 ROOT
[root@rocky /usr/local/tomcat/webapps]$
6、访问10.0.0.138:8080/jpress即可
九、实现tomcat session粘性,并验证过程
环境:nginx:10.0.0.133
tomcat1:10.0.0.136
tomcat2:10.0.0.138
1、之前一篇文章讲过编译安装nginx了,这里就直接安装。上面讲了安装jdk及tomcat,在两个服务器直接安装即可。
2、在后端tomcat上分别部署虚拟主机
tomcat1:
#创建数据目录
mkdir -p /data/tomcat/node1/ROOT
#创建访问页面
vim index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tomcat test</title>
</head>
<body>
<h1> Tomcat Website </h1>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
#部署虚拟主机
vim /usr/local/tomcat/conf/server.xml
<Host name="test.nginx.com" appBase="/data/tomcat/node1/" #这里的host name 是客户端访问nginx服务器web的主机头,这里如果和主机头不一致将无法访问
unpackWARs="true" autoDeploy="true">
</Host>
#重启服务
systemctl restart tomcat
tomcat2:
#创建数据目录
mkdir -p /data/tomcat/node2/ROOT
#创建访问页面
vim index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tomcat test</title>
</head>
<body>
<h1> Tomcat Website </h1>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
#部署虚拟主机
vim /usr/local/tomcat/conf/server.xml
<Host name="test.nginx.com" appBase="/data/tomcat/node2/" #这里的host name 是客户端访问nginx服务器web的主机头,这里如果和主机头不一致将无法访问
unpackWARs="true" autoDeploy="true">
</Host>
#重启服务
systemctl restart tomcat
nginx:
#修改配置文件
vim /apps/nginx/conf/nginx.conf
upstream tomcat {
hash $cookie_JSESSIONID; #这里配置了JSESSION,客户端第一次访问tomcat1以后,以后就一直访问tomcat1,因为携带了自身cookie。
server 10.0.0.136:8080; #这里没配置权重,默认是一次访问一台服务器
server 10.0.0.138:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat;
proxy_set_header host $http_host; #这里必须配置转发主机头,也就是访问nginx的名称。跟后端tomcat的虚拟主机名一致。
}
}
#重新加载配置文件
nginx -s reload
#修改window的hosts文件,
在C:\Windows\System32\drivers\etc\下,添加以下一行
10.0.0.133 test.nginx.com
3、测试访问:test.nginx.com
#到这里sessionid复制粘性设置完毕。
十、实现tomcat会话复制集群
环境继续使用上面的环境,有几个地方需要修改一下即可。
1、修改nginx配置
vim /apps/nginx/conf/nginx.conf
#注释或删除在upstream模块里的hash $cookie_JSESSIONID;这样是为了把之前的基于cookie绑定sessionid线关掉。现在再次访问test.nginx.com就是两台tomcat轮巡了。
2、修改tomcat1的server.xml,tomcat2同理,只需修改address为本机IP即可
vim /usr/local/tomcat/conf/server.xml
在原先的虚拟主机host_name中添加
<Host name="test.nginx.com" appBase="/data/tomcat/node1/"
unpackWARs="true" autoDeploy="true">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="230.100.100.100" #指定不冲突的多播地址
port="45564" #多播UDP端口
frequency="500" #间隔500ms发送一次
dropTime="3000"/> #故障阈值3s
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="10.0.0.136" #指定网卡的IP
port="4000" #绑定的端口
autoBind="100" #如果端口冲突,自动绑定其它端口,范围是4000-4100
selectorTimeout="5000" #自动绑定超时时长5s
maxThreads="6"/>
<Sender
className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport
className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor
className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener
className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
</Host>
3、修改tomcat1和tomcat2的web.xml文件,两台配置一致。
cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/ /data/tomcat/node1/ROOT/ #tomcat2上改为node2即可
vim /data/tomcat/node1/ROOT/
</description>
<distributable/> #添加此行
</web-app>
4、重启服务验证结果
systemctl restart tomcat.service
#访问test.nginx.com,结果如下。#现在同一个网站调度到了不同的机器上,但是sessionid并没有改变。但是这种复制并不适合大型网站,众所周知tomcat占内存高,如果后端tomcat过多,sessionid复制就会占很大内存。只适合于小网站。