2023-10-04 第九周

一、总结 nginx反向代理及https安全加密。

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的
一种方式,这是用的比较多的一种方式。
nginx反向代理和lvs的区别

  • 工作层: 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通讯过程

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架构及机器地址
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

wordpress
wordpress

因为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

Taylor Swift

三、总结 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 &quot;%r&quot; %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解析

Windows host解析

测试

node1
node2

五、总结 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访问看到的一样

node1
IP

六、完成 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 &quot;%r&quot; %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

DNS解析

测试1
测试2
测试3

在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不变

tomcat1
tomcat2
tomcat1

七、总结 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值