一、总结 nginx反向代理及https安全加密。
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的
一种方式,这是用的比较多的一种方式。
- 工作层: LVS四层 Nginx七层
- 监听端口:LVS不监听 Nginx监听端口
- 后端能否看到客户端的IP地址: LVS不可以 Nginx可以
- 连接(三次握手):LVS不参与连接,只负责转发 Nginx代替后端服务器与客户端进行连接
关于Nginx反向代理可能会用到的模块
ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后
端服务器分组
ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理
HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信
息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
https 实现过程如下:
1.客户端发起HTTPS请求:
客户端访问某个web端的https地址,一般都是443端口
2.服务端的配置:
采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也可以自己制作,目前国内很多网站都
自己做的,当你访问一个网站的时候提示证书不可信任就表示证书是自己做的,证书就是一个公钥和私钥匙,就像一把锁和钥匙,正常情况下只有你的钥匙可以打开你的锁,你可以把这个送给别人让他锁住一个箱子,里面放满了钱或秘密,别人不知道里面放了什么而且别人也打不开,只有你的钥匙是可以打开的。
3.传送证书:
服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
4.客户端解析证书:
这部分工作是有客户端完成的,首先回验证公钥的有效性,比如颁发机构、过期时间等等,如果发现异常则会弹出一个警告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加密,就像2步骤所说把随机值锁起来,不让别人看到。
5.传送4步骤的加密数据:
就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进行加密解密了。
6.服务端解密信息:
服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
7.传输加密后的信息:
服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出原数据内容。
8.客户端解密信息:
客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即使第三方获取到数据也无法知道其详细内容。
nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数
ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编
译安装的nginx需要指定编译参数–with-http_ssl_module开启
二、完成nginx实现LNMP架构wordpress应用
LNMP架构及机器地址
#10.0.0.8安装
[root@rocky8 ~]#yum -y install nginx
[root@rocky8 ~]#systemctl enable --now nginx
#10.0.0.18安装
[root@rocky8 ~]#yum -y install php-fpm
[root@rocky8 ~]#systemctl enable --now php-fpm.service
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.
[root@rocky8 ~]#ps aux |grep php
root 23181 0.0 0.9 166940 18000 ? Ss 09:03 0:00 php-fpm: master process (/etc/php-fpm.conf)
apache 23182 0.0 0.5 183288 10184 ? S 09:03 0:00 php-fpm: pool www
apache 23183 0.0 0.5 183288 10188 ? S 09:03 0:00 php-fpm: pool www
apache 23184 0.0 0.5 183288 10188 ? S 09:03 0:00 php-fpm: pool www
apache 23185 0.0 0.5 183288 10188 ? S 09:03 0:00 php-fpm: pool www
apache 23186 0.0 0.5 183288 10188 ? S 09:03 0:00 php-fpm: pool www
root 23305 0.0 0.0 12140 1176 pts/1 S+ 09:07 0:00 grep --color=auto php
#建议把php的启动账号换成nginx
[root@rocky8 ~]#vim /etc/php-fpm.d/www.conf
user = nginx
group = nginx
[root@rocky8 ~]#systemctl restart php-fpm.service
[root@rocky8 ~]#ps aux |grep php
root 23322 0.0 0.9 166940 17940 ? Ss 09:08 0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 23323 0.0 0.5 183288 10280 ? S 09:08 0:00 php-fpm: pool www
nginx 23324 0.0 0.5 183288 10284 ? S 09:08 0:00 php-fpm: pool www
nginx 23325 0.0 0.5 183288 10284 ? S 09:08 0:00 php-fpm: pool www
nginx 23326 0.0 0.5 183288 10284 ? S 09:08 0:00 php-fpm: pool www
nginx 23327 0.0 0.5 183288 10284 ? S 09:08 0:00 php-fpm: pool www
root 23329 0.0 0.0 12140 1080 pts/1 S+ 09:09 0:00 grep --color=auto php
#取消文件监听,改为9000端口监听
[root@rocky8 ~]#tail -n vim /etc/php-fpm.d/www.conf
;listen = /run/php-fpm/www.sock
listen = 9000
;listen.allowed_clients = 127.0.0.1 #注释掉这一行,要不然只能本机连
[root@rocky8 ~]#systemctl restart php-fpm.service
[root@rocky8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:9000 *:*
LISTEN 0 128 [::]:22 [::]:*
#更改nginx的配置
[root@rocky8 ~]#vim /apps/nginx/conf/nginx.conf #这里我是编译安装,yum安装的配置文件路径在/etc下
include /apps/nginx/conf.d/*.conf; #这个地方是在http模块下定义子配置文件生效的地方
#在10.0.0.28上安装MySQL 创建用户和数据库,并且授权
[root@rocky8 ~]#yum -y install mysql-server
[root@rocky8 ~]#systemctl enable --now mysqld
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
[root@rocky8 ~]#mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create user wordpress@'10.0.0.%' identified by '123456' ;
Query OK, 0 rows affected (0.00 sec)
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on wordpress.* to wordpress@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
安装wordpress
wordpress下载地址:https://cn.wordpress.org/download/
#在10.0.0.18上下载wordpress文件
[root@rocky8 ~]#unzip wordpress-6.2.2-zh_CN.zip
[root@rocky8 ~]#mv wordpress /data/php/
[root@rocky8 php]#ll /data/php/wordpress/
total 228
-rw-r--r-- 1 root root 405 Feb 6 2020 index.php
-rw-r--r-- 1 root root 19915 Jan 1 2023 license.txt
-rw-r--r-- 1 root root 7402 Mar 5 2023 readme.html
-rw-r--r-- 1 root root 7205 Sep 17 2022 wp-activate.php
drwxr-xr-x 9 root root 4096 May 24 19:00 wp-admin
-rw-r--r-- 1 root root 351 Feb 6 2020 wp-blog-header.php
-rw-r--r-- 1 root root 2338 Nov 10 2021 wp-comments-post.php
-rw-r--r-- 1 root root 3013 Feb 23 2023 wp-config-sample.php
drwxr-xr-x 5 root root 69 May 24 19:00 wp-content
-rw-r--r-- 1 root root 5536 Nov 23 2022 wp-cron.php
drwxr-xr-x 28 root root 12288 May 24 19:00 wp-includes
-rw-r--r-- 1 root root 2502 Nov 27 2022 wp-links-opml.php
-rw-r--r-- 1 root root 3792 Feb 23 2023 wp-load.php
-rw-r--r-- 1 root root 49330 Feb 23 2023 wp-login.php
-rw-r--r-- 1 root root 8541 Feb 3 2023 wp-mail.php
-rw-r--r-- 1 root root 24993 Mar 1 2023 wp-settings.php
-rw-r--r-- 1 root root 34350 Sep 17 2022 wp-signup.php
-rw-r--r-- 1 root root 4889 Nov 23 2022 wp-trackback.php
-rw-r--r-- 1 root root 3238 Nov 29 2022 xmlrpc.php
#要修改wordpress的所属者和所属组
[root@rocky8 php]#chown -R nginx.nginx /data/php/
[root@rocky8 php]#ll /data/php/wordpress/
total 228
-rw-r--r-- 1 nginx nginx 405 Feb 6 2020 index.php
-rw-r--r-- 1 nginx nginx 19915 Jan 1 2023 license.txt
-rw-r--r-- 1 nginx nginx 7402 Mar 5 2023 readme.html
-rw-r--r-- 1 nginx nginx 7205 Sep 17 2022 wp-activate.php
drwxr-xr-x 9 nginx nginx 4096 May 24 19:00 wp-admin
-rw-r--r-- 1 nginx nginx 351 Feb 6 2020 wp-blog-header.php
-rw-r--r-- 1 nginx nginx 2338 Nov 10 2021 wp-comments-post.php
-rw-r--r-- 1 nginx nginx 3013 Feb 23 2023 wp-config-sample.php
drwxr-xr-x 5 nginx nginx 69 May 24 19:00 wp-content
-rw-r--r-- 1 nginx nginx 5536 Nov 23 2022 wp-cron.php
drwxr-xr-x 28 nginx nginx 12288 May 24 19:00 wp-includes
-rw-r--r-- 1 nginx nginx 2502 Nov 27 2022 wp-links-opml.php
-rw-r--r-- 1 nginx nginx 3792 Feb 23 2023 wp-load.php
-rw-r--r-- 1 nginx nginx 49330 Feb 23 2023 wp-login.php
-rw-r--r-- 1 nginx nginx 8541 Feb 3 2023 wp-mail.php
-rw-r--r-- 1 nginx nginx 24993 Mar 1 2023 wp-settings.php
-rw-r--r-- 1 nginx nginx 34350 Sep 17 2022 wp-signup.php
-rw-r--r-- 1 nginx nginx 4889 Nov 23 2022 wp-trackback.php
-rw-r--r-- 1 nginx nginx 3238 Nov 29 2022 xmlrpc.php
#在wordpress上安装连接数据库和json的组件
[root@rocky8 php]#yum -y install php-mysqlnd php-json
#在nginx服务器上
[root@rocky8 ~]#mkdir -p /data/nginx/html/pc
#把wordpress从18上拷到8上 所以尽量就要把nginx和wordpress放在一个机器上,就可以省下这个步骤
[root@rocky8 php]#scp -r wordpress 10.0.0.8:/data/nginx/html/pc
#在nginx服务器上设置
[root@rocky8 ~]#cd /data/nginx/html/pc
[root@rocky8 pc]#ls
wordpress
[root@rocky8 pc]#vim /apps/nginx/conf.d/pc.conf
server {
listen 80;
root /data/nginx/html/pc/wordpress;
server_name www.ma.com;
index index.php;
location / {
root /data/nginx/html/pc/wordpress;
}
location ~ \.php$ {
root /data/php/wordpress;
fastcgi_pass 10.0.0.18:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[root@rocky8 pc]#vim /appnginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@rocky8 pc]#nginx -s reload
因为nginx和wordpress不在同一台机器上,所以上传的数据需要共享文件夹来实现
#在nginx和wordpress上都安装nfs
[root@rocky8 php]#yum -y install nfs-utils.x86_64
#在wordpress服务器上把文件共享出来
[root@rocky8 php]#vim /etc/exports
/data/php/wordpress/wp-content/uploads *(rw)
[root@rocky8 php]#systemctl enable --now nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
#在nginx上进行挂载
[root@rocky8 pc]#mkdir -p wordpress/wp-content/uploads/
[root@rocky8 pc]#showmount -e 10.0.0.18
Export list for 10.0.0.18:
/data/php/wordpress/wp-content/uploads *
[root@rocky8]#vim /etc/fstab
10.0.0.18:/data/php/wordpress/wp-content/uploads /data/nginxhtml/pc/wordpress/wp-content/uploads nfs _netdev 0 0
[root@rocky8 pc]#mount -a
三、总结 JumpServer管理配置
这里只写JumServer如何安装,他具体的一些操作都是界面的不是很好描述和截图,可以查看官方文档进行学习:https://docs.jumpserver.org/zh/v3/guide/currency/
JumpServer最主要的就是有三个账号
首先是 (一)登录JumpServer的登录账号—》管理员账号可设置普通账号和系统审计员(限制特定的权限)
PS:就相当于你去学校,学校的大门
其次是 (二)管理后端服务器的账号
PS:就相当于你是哪个年级的,学校的年级 (如果是后端服务器的密码都一样,就相当于你们学校只有一个年级)
再者是 (三)登录后端服务器的身份
PS:相当于你进入年级之后,学校年级下的班级 (不同的身份,进入不同的班级)
新版不在有(二)和(三),二者合一统称为系统用户。(二)被称为系统用户的特权用户,(三)被称为系统用户的普通用户
仅用docker安装
#docker安装脚本
#!/bin/bash
DOCKER_VERSION="20.10.10"
UBUNTU_DOCKER_VERSION="5:${DOCKER_VERSION}~3-0~`lsb_release -si`-`lsb_release -cs`"
COLOR_SUCCESS="echo -e \\033[1;32m"
COLOR_FAILURE="echo -e \\033[1;31m"
END="\033[m"
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_docker(){
if [ $ID = "centos" -o $ID = "rocky" ];then
if [ $VERSION_ID = "7" ];then
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name=docker
gpgcheck=0
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/
EOF
else
cat > /etc/yum.repos.d/docker.repo <<EOF
[docker]
name=docker
gpgcheck=0
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/8/x86_64/stable/
EOF
fi
yum clean all
${COLOR_FAILURE} "Docker有以下版本"${END}
yum list docker-ce --showduplicates
${COLOR_FAILURE}"5秒后即将安装: docker-"${DOCKER_VERSION}" 版本....."${END}
${COLOR_FAILURE}"如果想安装其它Docker版本,请按ctrl+c键退出,修改版本再执行"${END}
sleep 5
yum -y install docker-ce-$DOCKER_VERSION docker-ce-cli-$DOCKER_VERSION \
|| { color "Base,Extras的yum源失败,请检查yum源配置" 1;exit; }
else
dpkg -s docker-ce &> /dev/null && $COLOR"Docker已安装,退出" 1 && exit
apt update || { color "更新包索引失败" 1 ; exit 1; }
apt -y install apt-transport-https ca-certificates curl software-properties-common || \
{ color "安装相关包失败" 1 ; exit 2; }
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
${COLOR_FAILURE} "Docker有以下版本"${END}
apt-cache madison docker-ce
${COLOR_FAILURE}"5秒后即将安装: docker-"${UBUNTU_DOCKER_VERSION}" 版本....."${END}
${COLOR_FAILURE}"如果想安装其它Docker版本,请按ctrl+c键退出,修改版本再执行"${END}
sleep 5
apt -y install docker-ce=${UBUNTU_DOCKER_VERSION} docker-ce-cli=${UBUNTU_DOCKER_VERSION}
fi
if [ $? -eq 0 ];then
color "安装软件包成功" 0
else
color "安装软件包失败,请检查网络配置" 1
exit
fi
}
config_docker (){
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"] #可以去阿里云的镜像加速器换自己的加速器,不换也没得关系
}
EOF
systemctl daemon-reload
systemctl enable docker
systemctl restart docker
docker version && color "Docker 安装成功" 0 || color "Docker 安装失败" 1
}
set_alias (){
echo 'alias rmi="docker images -qa|xargs docker rmi -f"' >> ~/.bashrc
echo 'alias rmc="docker ps -qa|xargs docker rm -f"' >> ~/.bashrc
}
install_docker
config_docker
set_alias
对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
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
启动Redis
docker run -d -p 6379:6379 --name redis --restart always redis
生成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
#每个人生成的ley不同这个key在下面运行JumpServer的时候要用到
[root@ubuntu2004 ~]#tail -n2 .bashrc
SECRET_KEY=hm88zC7WABCxK1H5Hsh8hRDq6Z5vTnBqDNluOAEm3iu4fzQ0kf
BOOTSTRAP_TOKEN=bLeqTboUbVGvs47W
docker运行JumpServer
#一定一定要记住下面几处要改
docker run --name jms_all -d \
-v /opt/jumpserver/core/data:/opt/jumpserver/data \
-v /opt/jumpserver/koko/data:/opt/koko/data \
-v /opt/jumpserver/lion/data:/opt/lion/data \
-p 80:80 \
-p 2222:2222 \
-e SECRET_KEY=hm88zC7WABCxK1H5Hsh8hRDq6Z5vTnBqDNluOAEm3iu4fzQ0kf \ #用上面自己生成的key
-e BOOTSTRAP_TOKEN=bLeqTboUbVGvs47W \ #用上面自己生成的
-e LOG_LEVEL=ERROR \
-e DB_HOST=10.0.0.103 \ #主机地址
-e DB_PORT=3306 \
-e DB_USER=jumpserver \
-e DB_PASSWORD=123456 \
-e DB_NAME=jumpserver \
-e REDIS_HOST=10.0.0.103 \ #主机地址
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD='' \
--privileged=true \
jumpserver/jms_all
输入自己的主机地址就能访问JumpServer,首次登录的账号和密码都是admin
四、总结 tomcat实现多虚拟机
首先需要先安装jdk和tomcat
tomcat安装包下载地址:Apache Tomcat® - Welcome!
jdk8下载地址:https://www.oracle.com/java/technologies/downloads/#license-lightbox (需要登录)
jdk和tomcat安装脚本
#!/bin/bash
DIR=`pwd`
JDK_FILE="jdk-8u321-linux-x64.tar.gz" #换成自己的安装包版本
TOMCAT_FILE="apache-tomcat-9.0.59.tar.gz" #换成自己的安装包版本
JDK_DIR="/usr/local"
TOMCAT_DIR="/usr/local"
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$2" && $MOVE_TO_COL
echo -n "["
if [ $1 = "success" -o $1 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $1 = "failure" -o $1 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_jdk(){
if ! [ -f "$DIR/$JDK_FILE" ];then
color 1 "$JDK_FILE 文件不存在"
exit;
elif [ -d $JDK_DIR/jdk ];then
color 1 "JDK 已经安装"
exit
else
[ -d "$JDK_DIR" ] || mkdir -pv $JDK_DIR
fi
tar xvf $DIR/$JDK_FILE -C $JDK_DIR
cd $JDK_DIR && ln -s jdk* jdk
cat > /etc/profile.d/jdk.sh <<EOF
export JAVA_HOME=$JDK_DIR/jdk
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
. /etc/profile.d/jdk.sh
java -version && color 0 "JDK 安装完成" || { color 1 "JDK 安装失败" ; exit; }
}
install_tomcat(){
if ! [ -f "$DIR/$TOMCAT_FILE" ];then
color 1 "$TOMCAT_FILE 文件不存在"
exit;
elif [ -d $TOMCAT_DIR/tomcat ];then
color 1 "TOMCAT 已经安装"
exit
else
[ -d "$TOMCAT_DIR" ] || mkdir -pv $TOMCAT_DIR
fi
tar xf $DIR/$TOMCAT_FILE -C $TOMCAT_DIR
cd $TOMCAT_DIR && ln -s apache-tomcat-*/ tomcat
echo "PATH=$TOMCAT_DIR/tomcat/bin:"'$PATH' > /etc/profile.d/tomcat.sh
id tomcat &> /dev/null || useradd -r -s /sbin/nologin tomcat
cat > $TOMCAT_DIR/tomcat/conf/tomcat.conf <<EOF
JAVA_HOME=$JDK_DIR/jdk
EOF
chown -R tomcat.tomcat $TOMCAT_DIR/tomcat/
cat > /lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=$TOMCAT_DIR/tomcat/conf/tomcat.conf
ExecStart=$TOMCAT_DIR/tomcat/bin/startup.sh
ExecStop=$TOMCAT_DIR/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now tomcat.service &> /dev/null
systemctl is-active tomcat.service &> /dev/null && color 0 "TOMCAT 安装完成" || { color 1 "TOMCAT 安装失败" ; exit; }
}
install_jdk
install_tomcat
配置tomcat文件
[root@rocky ~]#vim /usr/local/tomcat/conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#下方添加虚拟主机
<Host name="node1.ma.com" appBase="/data/webapps1/" unpackWARs="true" autoDeploy="true"> </Host>
<Host name="node2.ma.com" appBase="/data/webapps2/" unpackWARs="true" autoDeploy="true"> </Host>
准备虚拟主机的文件和文件目录
[root@rocky tomcat]#mkdir -pv /data/webapps1/ROOT/
mkdir: created directory '/data'
mkdir: created directory '/data/webapps1'
mkdir: created directory '/data/webapps1/ROOT/'
[root@rocky tomcat]#mkdir -pv /data/webapps2/ROOT/
mkdir: created directory '/data/webapps2'
mkdir: created directory '/data/webapps2/ROOT/'
[root@rocky ~]#vim /data/webapps1/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@rocky ~]#vim /data/webapps2/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@rocky ~]#chown -R tomcat.tomcat /data/webapps{1,2}/
在主机设置host解析
测试
五、总结 tomcat定制访问日志格式和反向代理tomcat
tomcat日志格式可查看文档有详细介绍
Apache Tomcat 9 Configuration Reference (9.0.59) - The Valve Component #地址要用自己tomcat的地址
实现队tomcat虚拟主机的反向代理,用同一台机器安装nginx,通过上面的过程创建两个虚拟主机node1.ma.com和noed2.ma.com
#配置域名解析
[root@rocky ~]#vim /etc/hosts
10.0.0.88 node1.ma.com node2.ma.com
#安装nginx
[root@rocky ~]#yum -y install nginx
#实现nginx的反向代理
[root@rocky ~]#vim /etc/nginx/nginx.conf
location / {
proxy_pass http://node1.ma.com:8080;
}
[root@rocky ~]#systemctl restart nginx
IP地址、node1、node2访问看到的一样
六、完成 tomcat实现MSM集群
准备三台机器,用MSM的sticky模式
proxy:10.0.0.8
tomcat1和memcached2:10.0.0.18
tomcat2和memcached1:10.0.0.28
首先在两个tomcat上进行相同的配置 (通过执行上面安装tomcat脚本后进行下面操作)
#创建页面存放的文件夹
[root@tomcat1 ~]#mkdir -pv /data/tomcat/node1/ROOT/
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#下面添加这一条
<Host name="www.ma.com" appBase="/data/tomcat/node1/" unpackWARs="true" autoDeploy="true"> </Host>
#把这个测试页面移动到数据文件夹下面
[root@tomcat1 ~]#cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/ /data/tomcat/node1/ROOT/
#创建初始的测试页面
[root@tomcat1 ~]#vim /usr/locadata/tomcat/node1/ROOT/index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tomcat test2</title>
</head>
<body>
<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>
[root@tomcat1 ~]#systemctl restart tomcat.service
在代理服务器上进行配置
[root@rocky8 ~]#yum -y install nginx
[root@rocky8 ~]#vim /etc/nginx/nginx.conf
upstream tomcat {
server 10.0.0.18:8080;
server 10.0.0.28:8080;
}
server {
listen 80;
location / {
root html;
index index.html index.html;
proxy_pass http://tomcat;
proxy_set_header Host $http_host;
}
}
[root@rocky8 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@rocky8 ~]#nginx -s reload
在18和28上分别安装memcached
[root@tomcat1 ~]#yum -y install memcached.x86_64
[root@tomcat1 ~]#vim /etc/sysconfig/memcached
1 PORT="11211"
2 USER="memcached"
3 MAXCONN="1024"
4 CACHESIZE="64"
5 #OPTIONS="-l 127.0.0.1,::1" #注释掉此行,可以远程访问
[root@tomcat2 ~]#systemctl enable --now memcached.service
Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service → /usr/lib/systemd/system/memcached.service.
上述环境完成之后,开始下面的配置
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/context.xml
<Manager pathname="" />
-->
#---这个之下
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.18:11211,n2:10.0.0.28:11211"
failoverNodes="n1" #这里不同,表示的是故障转移节点
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
#---这个之上
</Context>
[root@tomcat2 ~]#vim /usr/local/tomcat/conf/context.xml
<Manager pathname="" />
-->#---这个之下
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.18:11211,n2:10.0.0.28:11211"
failoverNodes="n2" #这里不同,表示的是故障转移节点
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
#---这个之下
</Context>
下面是18和28两个服务器相同的动作,上传jar包
jar包可去网盘下载
链接: https://pan.baidu.com/s/1wdKbBxWENBdo9ohY5Rna-Q?pwd=beji
提取码: beji
[root@tomcat1 ~]#cd /usr/local/tomcat/lib/
[root@tomcat1 lib]#ls
annotations-api.jar catalina-ssi.jar el-api.jar jsp-api.jar tomcat-dbcp.jar tomcat-i18n-fr.jar tomcat-i18n-ru.jar tomcat-util.jar
catalina-ant.jar catalina-storeconfig.jar jasper-el.jar servlet-api.jar tomcat-i18n-cs.jar tomcat-i18n-ja.jar tomcat-i18n-zh-CN.jar tomcat-util-scan.jar
catalina-ha.jar catalina-tribes.jar jasper.jar tomcat-api.jar tomcat-i18n-de.jar tomcat-i18n-ko.jar tomcat-jdbc.jar tomcat-websocket.jar
catalina.jar ecj-4.20.jar jaspic-api.jar tomcat-coyote.jar tomcat-i18n-es.jar tomcat-i18n-pt-BR.jar tomcat-jni.jar websocket-api.jar
[root@tomcat1 lib]#systemctl restart tomcat
[root@tomcat1 lib]#srsystemctl status tomcat
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-10-06 13:50:53 CST; 1min 55s ago
Process: 26207 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
Process: 26232 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 26242 (java)
Tasks: 31 (limit: 11175)
Memory: 93.7M
CGroup: /system.slice/tomcat.service
└─26242 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dj>
Oct 06 13:50:53 tomcat1 systemd[1]: Stopped Tomcat.
Oct 06 13:50:53 tomcat1 systemd[1]: Starting Tomcat...
Oct 06 13:50:53 tomcat1 systemd[1]: Started Tomcat.
测试,主机轮询但是session不变
七、总结 JVM垃圾回收算法和分代
垃圾回收基本算法
(1)标记-清除Mark-Sweep
分垃圾标记阶段和内存释放两个阶段。
① 标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆
② 对未标记对象(即不再使用的对象)逐一进行清理。
特点
优点:算法简单
缺点:标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也会受到影响)
(2)标记-压缩(压实)Mark-Compact
分垃圾标记阶段和内存整理两个阶段。
①标记阶段,找到所有可以访问对象打个标记。
②内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。
特点
标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可以分配,没有内存碎片。
缺点是内存整理过程有消耗,效率相对低下。
(3)复制Copying
先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对象复制到B。复制到B的时候连续地使用内存,最后将A一次性清除干净。
特点
好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,队以及是对象很多,收回效率很高
缺点是比较浪费内存,只能时使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。
多种算法总结
没有最好的算法,在不同场景选择最合适的算法
①效率: 复制算法>标记清除算法> 标记压缩算法
②内存整齐度: 复制算法=标记压缩算法> 标记清除算法
③内存利用率: 标记压缩算法=标记清除算法>复制算法
STW
对于大多数垃圾回收算法而言,GC线程工作时,停止所有工作的线程,称为Stop The World。GC 完成时,恢复其他工作线程运行。这也是IVM运行中最头疼的问题。
分代
将heap内存空间分为三个不同类别: 年轻代、老年代、持久代
Heap堆内存分为:
(1)年轻代Young: Young Generation
①伊甸园区eden: 只有一个,刚刚创建的对象
②幸存(存活)区Servivor Space: 有2个幸存区,一个是from区,一个是to区。大小相等、地位0相同、可互换。
●from 指的是本次复制数据的源区
●to 指的是本次复制数据的目标区
(2)老年代Tenured: Old Generation,长时间存活的对象
默认空间大小比例:
默认VM试图分配最大内存的总内存的1/4,初始化默认总内存为总内存的1/64,年青代中heap的1/3,老年代占2/3
(3)永久代:IDK1.7之前使用,即Method Area方法区保存VM自身的类和方法存储AVA运行时的环境信息JDK1.8后 改名为 MetaSpace,此空间不存在垃圾回收,关闭VM会释放此区域内存,此空间物理上不属于heap内存,但逻辑上存在于heap内存
●永久代必须指定大小限制,字符串常量]DK1.7存放在永久代,1.8后存放在heap中
●MetaSpace 可以设置,也可不设置,无上限
规律: 一般情况99%的对象都是临时对象
八、总结 tomcat性能优化方式及java源码编译
内存空间优化
JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= -XX:MaxNewSize= "
-server:服务器模式
-Xms:堆内存初始化大小
-Xmx:堆内存空间上限
-XX:NewSize=:新生代空间初始化大小
-XX:MaxNewSize=:新生代空间最大值
线程池调整
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
......
常用属性:
●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
java源码编译安装
先要安装maven,maven之前也要安装相应的java环境
Maven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上
下面以一个spring-boot项目演示一下
#上面实验环境中有java环境,所以直接开始安装maven
[root@rocky ~]#java -version
openjdk version "1.8.0_332"
OpenJDK Runtime Environment (build 1.8.0_332-b09)
OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)
[root@rocky ~]#yum -y install git maven
[root@rocky ~]#mvn -v
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_321, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_321/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.18.0-372.9.1.el8.x86_64", arch: "amd64", family: "unix"
#镜像加速
[root@rocky ~]#vim /etc/maven/settings.xml
</mirror>
-->
#这个下面
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
#这个上面
</mirrors>
[root@rocky ~]#cd /data/
[root@rocky data]#git clone https://gitee.com/lbtooth/spring-boot-helloworld.git
[root@rocky data]#cd spring-boot-helloworld/
#编译
[root@rocky spring-boot-helloworld]#mvn clean package -Dmaven.test.skip\=true
[root@rocky spring-boot-helloworld]#ls target/
classes generated-sources maven-archiver maven-status spring-boot-helloworld-0.9.0-SNAPSHOT.jar spring-boot-helloworld-0.9.0-SNAPSHOT.jar.original
#运行jar包,完结撒花
[root@rocky spring-boot-helloworld]#java -jar target/spring-boot-helloworld-0.9.0-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
2023-10-06 15:09:40.138 INFO 3703 --- [ main] com.neo.Application : Starting Application v0.9.0-SNAPSHOT on rocky.shiyan with PID 3703 (/data/spring-boot-helloworld/target/spring-boot-helloworld-0.9.0-SNAPSHOT.jar started by root in /data/spring-boot-helloworld)
2023-10-06 15:09:40.143 INFO 3703 --- [ main] com.neo.Application : No active profile set, falling back to default profiles: default
2023-10-06 15:09:41.252 INFO 3703 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-10-06 15:09:41.278 INFO 3703 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-10-06 15:09:41.278 INFO 3703 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.16]
2023-10-06 15:09:41.289 INFO 3703 --- [ main] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal perfor