第九周

内容纲要

一、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,在两个服务器直接安装即可。
#tomcat1结果
#tomcat2结果
#测试访问结果
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

#第一次访问nginx的结果
#刷新页面后的访问结果,sessionid未改变,说明两次访问的是同一个服务器。如果访问的服务器改变sessionid会改变。这是为了防止用户第一次访问tomcat1服务器,刚输入账号及密码,刷新页面后登录状态改变,还需重新输入账号密码所设置。

#到这里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复制就会占很大内存。只适合于小网站。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注