haproxy,nginx,jumpserver,tomcat_jump,comcat-程序员宅基地

技术标签: nginx  tomcat  运维  haproxy  运维基础  docker  

一、haproxy + nginx 实现四、七层IP透传

haproxy配置四层代理
四层方式:

  1. 客户端向代理服务器发起http请求
  2. 客户端和代理服务器进行TCP连接,代理服务器根据自身指定的调度规则返回web服务器的IP给客户端
  3. 客户端再次发起对web服务器http请求,客户端和web服务器建立连接,然后进行通信
  4. 客户端发起请求后,代理服务器和指定的web服务器不会将客户端的请求又重新请求一次,也就是代理服务器和指定的web服务器之间不会建立连接。

注意:haproxy是伪四层代理,所以在四层模式中,haproxy会和后台web进行连接。
特点:四层代理通过IP:端口方式进行请求,虽然可以通过调度规则修改请求的web服务器的IP,但是每台web服务器存放的内容都是一样的,所以客户端无感知变化。
四层拓扑:
在这里插入图片描述

  1. haproxy需要安装lua环境,所以需要编译lua
    编译lua:
yum install -y gcc readline-devel
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar xf lua-5.3.5.tar.gz -C /usr/local
cd /usr/local/lua-5.3.5/

make linux test

编译haproxy:

yum -y install gcc openssl-devel pcre-devel systemd-devel
wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-2.2.6.tar.gz/sha512/b9afa4a4112dccaf192fce07b1cdbb1547060d998801595147a41674042741b62852f65a65aa9b2d033db8808697fd3a522494097710a19071fbb0c604544de5/haproxy-2.2.6.tar.gz
tar xf haproxy-2.2.6.tar.gz 
cd haproxy-2.2.6
make  ARCH=x86_64 TARGET=linux-glibc  USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1  USE_SYSTEMD=1  USE_LUA=1 LUA_INC=/usr/local/lua-5.3.5/src/ LUA_LIB=/usr/local/lua-5.3.5/src/
make install PREFIX=/haproxy

添加变量
echo 'PATH=/haproxy/sbin:$PATH' > /etc/profile.d/haproxy.sh  
source /etc/profile.d/haproxy.sh  

mkdir /haproxy/log
mkdir /haproxy/pid 
mkdir /haproxy/etc 

添加service
vi /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/haproxy/sbin/haproxy -f /haproxy/etc/haproxy.cfg  -c -q
ExecStart=/haproxy/sbin/haproxy -Ws -f /haproxy/etc/haproxy.cfg -p /haproxy/pid/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target


vi /haproxy/etc/haproxy.cfg  创建配置文件
global
    maxconn 100000
    chroot /haproxy
    stats socket /haproxy/haproxy.sock mode 600 level admin
    #uid 99
    #gid 99
    user  haproxy
    group haproxy
    daemon
    #nbproc 4
    #cpu-map 1 0
    #cpu-map 2 1
    #cpu-map 3 2
    #cpu-map 4 3
    pidfile /haproxy/pid/haproxy.pid
    log 127.0.0.1 local2 info
defaults
    option http-keep-alive
    option  forwardfor
    maxconn 100000
    mode http
    timeout connect 300000ms
    timeout client  300000ms
    timeout server  300000ms
listen stats  #创建状态页面
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri     /haproxy-status
    stats auth    admin:admin


useradd -r -s /sbin/nologin -d /haproxy/ haproxy  添加账户
chown haproxy.haproxy -R /haproxy 
systemctl daemon-reload
systemctl start haproxy


开启日志记录,和rsyslog搭配使用
vi /etc/rsyslog.conf

#### MODULES ####   全局配置下开启
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514

#### RULES ####   定义日志记录路径
local2.*     /haproxy/log/haproxy.log

systemctl restart rsyslog   重启服务

http://192.168.116.132:9999/haproxy-status  访问状态页面,测试haproxy是否正常编译
输入账户admin,密码amdin

在这里插入图片描述

  1. 编译安装nginx:
wget http://nginx.org/download/nginx-1.18.0.tar.gz
yum install -y gcc pcre-devel openssl-devel zlib-devel     安装依赖包
tar xf nginx-1.18.0.tar.gz 
cd nginx-1.18.0
useradd -r -s /sbin/nologin nginx
编译安装
./configure --prefix=/nginx \
--user=nginx  \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module  \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

make && make install
echo 'PATH=/nginx/sbin:$PATH' >/etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh

mkdir /nginx/run
vi /nginx/conf/nginx.conf
pid        /nginx/run/nginx.pid;          修改PID这行

chown -R nginx.nginx /nginx

配置service
vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/nginx/run/nginx.pid
ExecStart=/nginx/sbin/nginx -c /nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target

systemctl daemon-reload  加载service文件
  1. nginx1配置
hostnamectl set-hostname nginx1

vi /nginx/conf/nginx.conf   删除其他内容,修改为下面这些
user nginx;
worker_processes auto;
error_log /nginx/logs/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    
    worker_connections 1024;
}
http {
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$proxy_protocol_addr" ';
                      #$proxy_protocol_addr这个就是开启记录真实的客户端IP
    access_log  /nginx/logs/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    default_type        application/octet-stream;
    server {
    
        listen       80 proxy_protocol;  #开启四层代理模式
        listen       [::]:80;
        server_name  _;
        error_page 404 /404.html;
        location = /404.html {
    
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    
        }
        location / {
    
                root /nginx/html;
                index index.html;
        }
    }
}


echo nginx1-192.168.116.133 >/nginx/html/index.html
systemctl restart nginx
  1. nginx2配置
hostnamectl set-hostname nginx2

vi /nginx/conf/nginx.conf   删除其他内容,修改为下面这些
user nginx;
worker_processes auto;
error_log /nginx/logs/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    
    worker_connections 1024;
}
http {
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$proxy_protocol_addr" ';
                      #$proxy_protocol_addr这个就是开启记录真实的客户端IP
    access_log  /nginx/logs/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    default_type        application/octet-stream;
    server {
    
        listen       80 proxy_protocol;  #开启四层代理模式
        listen       [::]:80;
        server_name  _;
        error_page 404 /404.html;
        location = /404.html {
    
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    
        }
        location / {
    
                root /nginx/html;
                index index.html;
        }
    }
}


echo nginx2-192.168.116.134 >/nginx/html/index.html
systemctl restart nginx
  1. haproxy配置四层代理和转发真实客户端IP
hostnamectl set-hostname haproxy
vi /haproxy/etc/haproxy.cfg    在文件底部添加
listen webs
    bind 192.168.116.132:80
    mode tcp
    balance static-rr
    server web1 192.168.116.133 send-proxy
    server web2 192.168.116.134 send-proxy
#send-proxy就是在四层代理下转发客户端IP的配置
systemctl restart haproxy

测试:
客户端访问网站

for i in {
    1..10};do curl http://192.168.116.132;done

在nginx服务器查看日志

tail /nginx/logs/access.log    可以在nginx服务器看到IP被透传了

在这里插入图片描述
在这里插入图片描述

haproxy配置七层代理
七层IP透传
在这里插入图片描述

七层方式:

  1. 客户端向代理服务器发起http请求
  2. 客户端和代理服务器进行连接,代理服务器根据自身指定的调度规则和其他配置对请求报文进行修改
  3. 代理服务器将修改好的报文发送给后端web进行请求连接
  4. 代理服务器收到web服务器返回的数据内容后再返回给客户端

特点:七层代理时四层代理的升级版本,七层代理基于IP:端口/uri进行访问,代理服务器可以根据不同的url将请求调度到不同的web服务器上,但是客户端无感知。

按照上面编译安装haproxy和nginx后
配置haproxy的七层配置:

vi /haproxy/etc/haproxy.cfg 
global
    maxconn 100000
    chroot /haproxy
    stats socket /haproxy/haproxy.sock mode 600 level admin
    #uid 99
    #gid 99
    user  haproxy
    group haproxy
    daemon
    #nbproc 4
    #cpu-map 1 0
    #cpu-map 2 1
    #cpu-map 3 2
    #cpu-map 4 3
    pidfile /haproxy/pid/haproxy.pid
    log 127.0.0.1 local2 info
defaults
    option http-keep-alive
    option  forwardfor
    maxconn 100000
    mode http
    timeout connect 300000ms
    timeout client  300000ms
    timeout server  300000ms
frontend webs                #分组,定义2个ACL匹配对应2个web
    bind 192.168.116.132:80
    mode http
    log global
    acl acl_nginx1 url_dir nginx1.html
    acl acl_nginx2 url_dir nginx2.html
    use_backend server_nginx1 if acl_nginx1
    use_backend server_nginx2 if acl_nginx2
backend server_nginx1
    server web1 192.168.116.133
backend server_nginx2
    server web2 192.168.116.134


systemctl restart haproxy

2台nginx配置:

vi /nginx/conf/nginx.conf    2台nginx配置文件都是一样的

user nginx;
worker_processes auto;
error_log /nginx/logs/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    
    worker_connections 1024;
}
http {
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /nginx/logs/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    default_type        application/octet-stream;
    server {
    
        listen       80;
        listen       [::]:80;
        server_name  _;
        error_page 404 /404.html;
        location = /404.html {
    
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    
        }
        location / {
    
                root /nginx/html;
                index index.html;
        }
    }
}

在nginx1创建网页文件

echo nginx1-test-192.168.116.133>/nginx/html/nginx1.html
echo nginx1-test-192.168.116.133>/nginx/html/nginx2.html
systemctl restart nginx

在nginx2创建网页文件

echo nginx2-test-192.168.116.134>/nginx/html/nginx1.html
echo nginx2-test-192.168.116.134>/nginx/html/nginx2.html
systemctl restart nginx

客户端测试

可以看到虽然2台nginx都配了同样的文件,但是因为报文被haproxy修改了,所以都访问了ACL规则对应的web服务器
curl http://192.168.116.132/nginx1.html     
curl http://192.168.116.132/nginx2.html

在这里插入图片描述

nginx查看七层IP透传

tail /nginx/logs/access.log

在这里插入图片描述
在这里插入图片描述

二、haproxy服务器动态下线

拓扑:
在这里插入图片描述

  1. 后台web1配置:
    LAMP和httpd编译:LAMP
    用yum安装httpd如下:
hostnamectl set-hostname web1
yum install -y httpd
echo http-192.168.116.133>/var/www/html/index.html
systemctl start httpd
  1. 后台web2配置:
hostnamectl set-hostname web2
yum install -y httpd
echo http-192.168.116.134>/var/www/html/index.html
systemctl start httpd
  1. 按照上面编译好haproxy后
    haproxy配置:
yum -y install socat   安装动态修改工具
vi /haproxy/etc/haproxy.cfg

global
    maxconn 100000
    chroot /haproxy
    stats socket /haproxy/haproxy.sock mode 600 level admin
    #uid 99
    #gid 99
    user  haproxy
    group haproxy
    daemon
    #nbproc 4
    #cpu-map 1 0
    #cpu-map 2 1
    #cpu-map 3 2
    #cpu-map 4 3
    pidfile /haproxy/pid/haproxy.pid
    log 127.0.0.1 local2 info
defaults
    option http-keep-alive
    option  forwardfor
    maxconn 100000
    mode http
    timeout connect 300000ms
    timeout client  300000ms
    timeout server  300000ms
listen webs
    bind 192.168.116.132:80
    log global
    mode  http
    server web1 192.168.116.133
    server web2 192.168.116.134

systemctl restart haproxy
  1. 测试
    客户端连续访问网站
while true;do curl http://192.168.116.132;sleep 1;done   一直访问网站
可以看到网站可以正常访问

在这里插入图片描述
在haproxy服务器上,用命令关闭web2(192.168.116.134)这台服务器的代理
从图上可以看到当关闭web2后,只有web1响应客户端的访问

echo "disable server webs/web2" | socat stdio /haproxy/haproxy.sock

webs就是haproxy.cfg定义的listen webs
web2对应server web2 192.168.116.134这里的web2

在这里插入图片描述
在haproxy查看配置文件是否发生了变动

可以看到配置文件没有变化,证明这个socat工具是通过内存修改,所以当haproxy重启服务时,配置还是会还原
tail -n 10 /haproxy/etc/haproxy.cfg 

在这里插入图片描述

三、自行实现jumpserver管理资产及MySQL(设置运维、开发、测试三个组,每个组授权不同的资产和用户)

基于容器docker方式安装jumpserver
注意:

  • 安装jumpserver的硬件配置:需要2个CPU以上,4G内存,50G硬盘及以上
  • mysql版本需要大于5.6

1. 初始化环境:

cd /etc/yum.repos.d/
yum install -y wget
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo
mv CentOS-Base.repo CentOS-Base.repo.bak
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum clean all
yum makecache
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

2. 安装docker

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-19.03.12-3.el7 docker-ce-cli-19.03.12-3.el7  -y
systemctl start docker
systemctl enable docker

3. 创建mysql容器

创建配置文件
mkdir -p /etc/mysql/mysql.conf.d/
mkdir -p /etc/mysql/conf.d/
vi /etc/mysql/mysql.conf.d/mysqld.cnf
[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

vi /etc/mysql/conf.d/mysql.cnf
[mysql]
default-character-set=utf8  

#创建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 


yum install -y mysql    安装mysql客户端

4. 创建redis容器

docker run -d -p 6379:6379 --name redis --restart always  redis:5.0.9

5. 创建jumpserver容器

生成2个随机数当登录jumpserver的验证码,要保存好这2个
echo SECRET_KEY=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 50` >jumpserver_key.txt
echo BOOTSTRAP_TOKEN=`cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 16` >>jumpserver_key.txt 

cat jumpserver_key.txt    查看key和token信息
SECRET_KEY=mu9ghjm7ogBbNgO6S2cPC8I1qkcs2k6YPWdbxsAobnjaw90ORW
BOOTSTRAP_TOKEN=XKG61a9dslNI09p5

修改指定的key和token信息,输入数据库账户密码,创建容器
docker run --name jms_all -d \
  -v /opt/jumpserver/data:/opt/jumpserver/data \
  -p 80:80 \
  -p 2222:2222 \
  --restart always \
  -e SECRET_KEY=mu9ghjm7ogBbNgO6S2cPC8I1qkcs2k6YPWdbxsAobnjaw90ORW \
  -e BOOTSTRAP_TOKEN=XKG61a9dslNI09p5 \
  -e DB_HOST=192.168.116.130 \
  -e DB_PORT=3306 \
  -e DB_USER=root \
  -e DB_PASSWORD=123456 \
  -e DB_NAME=jumpserver \
  -e REDIS_HOST=127.0.0.1 \
  -e REDIS_PORT=6379 \
  -e REDIS_PASSWORD='' \
  --privileged=true \
  jumpserver/jms_all:v2.4.4

在这里插入图片描述

6. 查看容器状态

docker ps -a
docker logs -f 7bc68f42982f    指定容器ID查看日志

出现进入容器命令 docker exec -it jms_all /bin/bash    表示容器正常运行

在这里插入图片描述

在这里插入图片描述

7. 进入网页控制界面,默认账户admin,密码admin

http://192.168.116.130/core/auth/login/

在这里插入图片描述

7.1 创建用户

创建yunwei1,kaifa1,test1 3个用户
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2创建用户组

创建运维,开发,测试3个组,将yunwei1,kaifa1,test1 3个用户绑定到用户组
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 创建资产

准备3个虚拟机作为资产列表
在每台虚拟机创建3个相同账户密码的管理账户,可以不是root账户,但是权限必须是最高权限,这里以root账户为例子
在jumpserver服务器的网页上添加管理账户,这个账户是用户获取设备信息的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将3个虚拟机添加到资产列表
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.4 创建资产管理的系统用户

在网页上创建系统账户,这个是用来登录系统的,不是root账户,这个账户可以自动推送到已经设置好的资产列表的设备中自动创建账户
注意:如果不选择自动推送,那么必须在资产列表的设备上创建这个账户
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.5 测试管理账户和资产的通信

测试管理账户和虚拟机是否能正常通信
在这里插入图片描述
在这里插入图片描述

会弹出窗口,如果都为ok,证明管理账户和资产列表的设备都能通信
在这里插入图片描述

7.6 测试系统账户和资产的通信

测试系统账户和资产列表的虚拟机的通信
在这里插入图片描述
推送是自动推送的,可能会有延迟,可以自己手动推送,然后再测试通信
在这里插入图片描述

推送账户弹窗
在这里插入图片描述

在这里插入图片描述
测试弹窗
在这里插入图片描述

7.7 将资产的权限授权给对应的账户

选择权限管理,将资产列表的3台虚拟机分别授权给yunwei1,kaifa1,test1账户
在这里插入图片描述
注意:选择节点时不要选择节点,要不然会把全部虚拟机都添加给这个账户管理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.8 登录账户,测试资产和账户的权限对应关系

用yunwei1,kaifa1,test1账户登录jumpserver网页,查看是否分配成功
在这里插入图片描述
在这里插入图片描述
在命令执行输入id putong,测试账户是否有管理对应的虚拟机功能
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、编写脚本实现tomcat一键安装8.5版本


vi tomcat8.5.sh

#!/bin/bash
. /etc/init.d/functions
INSTALL_JAVA_DIR=/usr/local
INSTALL_TOMCAT_DIR=/usr/local

java_install(){
    
#java8u202_install
wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz --no-check-certificate &>/dev/null|| {
     action "java源码包下载失败" false;exit; }
tar xf jdk-8u202-linux-x64.tar.gz -C ${INSTALL_JAVA_DIR}
cd ${INSTALL_JAVA_DIR}
ln -s ${INSTALL_JAVA_DIR}/jdk1.8.0_202/ ${INSTALL_JAVA_DIR}/jdk
cat > /etc/profile.d/java.sh <<EOF
export JAVA_HOME=${INSTALL_JAVA_DIR}/jdk
export PATH=$PATH:${INSTALL_JAVA_DIR}/jdk/bin
export JRE_HOME=${INSTALL_JAVA_DIR}/jdk/jre
export CLASSPATH=${INSTALL_JAVA_DIR}/jdk/lib/:${INSTALL_JAVA_DIR}/jdk/lib
EOF
source /etc/profile.d/java.sh
if java -version &>/dev/null;then
        action "java 编译成功"
else
        action "java 编译失败" false
fi
}

tomcat_install() {
    
#tomcat8.5.73_install
wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.73/bin/apache-tomcat-8.5.73.tar.gz --no-check-certificate &>/dev/null|| {
     action "tomcat源码包下载失败" false;exit; }
tar xf apache-tomcat-8.5.73.tar.gz -C ${INSTALL_TOMCAT_DIR}
cd ${INSTALL_TOMCAT_DIR}
ln -s ${INSTALL_TOMCAT_DIR}/apache-tomcat-8.5.73/ tomcat
cat > /etc/profile.d/tomcat.sh <<EOF
PATH=${INSTALL_TOMCAT_DIR}/tomcat/bin:$PATH
EOF
source /etc/profile.d/tomcat.sh
if id tomcat &>/dev/null;then
        action "tomcat 用户已经存在" false
else
        useradd -r -s /sbin/nologin tomcat
        action "tomcat 用户创建成功"
fi
echo "JAVA_HOME=${INSTALL_JAVA_DIR}/jdk"> ${INSTALL_TOMCAT_DIR}/tomcat/conf/tomcat.conf
chown -R tomcat.tomcat -R ${INSTALL_TOMCAT_DIR}
cat > /lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=${INSTALL_TOMCAT_DIR}/tomcat/conf/tomcat.conf
ExecStart=${INSTALL_TOMCAT_DIR}/tomcat/bin/startup.sh
ExecStop=${INSTALL_TOMCAT_DIR}/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat &> /dev/null &&  action "TOMCAT 安装完成" || {
     action "TOMCAT 安装失败" false ; exit; }
}
java_install
tomcat_install

bash tomcat8.5.sh  执行脚本

在这里插入图片描述
访问测试

http://192.168.116.130:8080/

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/DLWH_HWLD/article/details/122176981

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search