• JavaWeb项目运维部署


    一、项目部署介绍

    Web项目网络拓扑图
    在这里插入图片描述

    部署目录介绍

    项目目录:/home/projectName
    启动文件目录:/home/projectName/bin
    后端项目:/home/projectName/target
    Web前端资源 :/home/projectName/dist
    备份文件:/home/projectName/backup
    nginx配置文件目录:/home/nginx
    nginx项目http代理配置:/home/nginx/server666
    nginx项目https代理配置:/home/nginx/ssl888

    二、网络模型底层原理-Nginx

    Nginx简介

    nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
    nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    Nginx的优点

    1. 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
    2. 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
    3. 配置文件非常简单:风格跟程序一样通俗易懂
    4. 成本低廉:nginx为开源软件,可以免费使用。而购买F5
      BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币支持
    5. Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
    6. 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
    7. 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
    8. 稳定性高:用于反向代理,宕机的概率微乎其微
    9. 模块化设计:模块可以动态编译
    10. 外围支持好:文档全,二次开发和模块较多
    11. 支持热部署:可以不停机重载配置文件
    12. 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

    静态HTTP服务器

    首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
    配置:

    server {
      listen 80; 
      server_name  localhost;
    	location / {
          root   /home/html;
          index  index.html index.htm;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    正向代理

    说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理
    在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
    在这里插入图片描述

    特点:

    1. 代理服务器位于用户与服务器之间
    2. 用户了解访问的服务器到底是谁.(指定了访问的服务器)
    3. 只有用户可以使用正向代理 (客户端代理)
    4. 正向代理保护了用户的信息. 称之为客户端代理

    反向代理

    反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
    反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
    在这里插入图片描述

    特点:

    1. 代理服务器位于用户和服务器之间
    2. 用户以为代理服务器就是目标服务器.
    3. 用户无需了解真实服务器地址.
    4. 反向代理保护了服务器信息. 称之为服务器端代理

    负载均衡

    当网站访问量非常大,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将相同的应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
    Nginx可以通过反向代理来实现负载均衡。
    配置:

    upstream myweb {
    	server 192.168.0.111:8080; # 应用服务器1
    	server 192.168.0.112:8080; # 应用服务器2
    }
    server {
    	listen 80;
    	location / {
    		proxy_pass http://myweb;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    虚拟主机

    网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。

    例如将http://www.aaa.com和http://www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。

    配置:

    server {
    	listen 80 default_server;
    	server_name _;
    	return 444; # 过滤其他域名的请求,返回444状态码
    }
    server {
    	listen 80;
    	server_name www.aaa.com; # www.aaa.com域名
    	location / {
    		proxy_pass http://localhost:8080; # 对应端口号8080
    	}
    }
    server {
    	listen 80;
    	server_name www.bbb.com; # www.bbb.com域名
    	location / {
    		proxy_pass http://localhost:8081; # 对应端口号8081
    	}
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    Nginx安装配置

    (1)安装依赖包
    nginx安装依赖GCC、openssl-devel、pcre-devel和zlib-devel软件库。

    yum install  pcre pcre-devel -y 
    yum install openssl openssl-devel -y 
    
    • 1
    • 2

    (2)开始编译

    使用./configure --help查看各个模块的使用情况,使用–without-http_ssi_module的方式关闭不需要的模块。可以使用–with-http_perl_modules方式安装需要的模块。

    wget http://nginx.org/download/nginx-1.19.4.tar.gz
    tar -zxvf nginx-1.19.4.tar.gz 
    cd nginx-1.19.4/
    ./configure --prefix=/data/nginx-1.19.4.tar.gz --user=nginx --group=nginx  --with-http_ssl_module  --with-http_stub_status_module
    
    useradd nginx -M -s /sbin/nologin 
    make && make install 
    ln -s /data/nginx-1.19.4.tar.gz /data/nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (3)启动nginx服务

    /data/nginx/sbin/nginx  -t  ##检查配置文件
    /data/nginx/sbin/nginx      ##确定nginx服务
    netstat -lntup |grep nginx      ## 检查进程是否正常
    curl http://localhost           ## 确认结果
    /data/nginx/sbin/nginx -s reload ##重新加载配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5

    nginx配置文件

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
        #include /home/nginx/nginxConf/*.conf;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    通常我们不会直接在nginx.conf配置文件上修改,而是通过include直接引入外部配置文件
    配置http和https代理访问端口

    # http代理配置
    server {
        listen       666;
        server_name loc.enzoz.top;
    	  port_in_redirect off;
        include /home/nginx/nginxConf/server666/*.conf;	
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    # https代理配置
    server {
         listen 888 ssl;
         server_name loc.enzoz.top;
         root html;
         index index.html index.htm;
         ssl_certificate   /home/nginx/nginxConf/cert/8182068_loc.enzoz.top_nginx/8182068_loc.enzoz.top.pem;
         ssl_certificate_key  /home/nginx/nginxConf/cert/8182068_loc.enzoz.top_nginx/8182068_loc.enzoz.top.key;
         ssl_session_timeout 5m;
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers on;
    	   port_in_redirect off;
         include /home/nginx/nginxConf/ssl888/*.conf;
    	  error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    配置代理访问项目

    	location / {
    		alias /home/projectName/dist/;#前端静态资源文件
        }
    	location /projectName/ {
    		proxy_pass http://127.0.0.1:1666;#后端项目接口地址
    	}
    	location ^~/api/ {
    		proxy_pass http://127.0.0.1:1666/projectName/;#前端配置带api的后端项目接口地址
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、安装JDK

    1.下载及解压

    下载及解压jdk

    wget https://download.oracle.com/otn/java/jdk/8u241-b07/1f5b5a70bf22433b84d0e960903adac8/jdk-8u241-linux-x64.tar.gz?AuthParam=1580274182_a2486bb3808fe518260214c7c09124d6
    tar -zxvf jdk-8u241-linux-x64.tar.gz
    
    • 1
    • 2

    2.配置环境变量

    编辑配置文件

    vi /etc/profile
    
    • 1

    i键进入编辑模式
    追加jdk环境变量配置

    export JAVA_HOME=/home/software/java/jdk1.8.0_241
    export PATH=$JAVA_HOME/bin:$PATH
    
    • 1
    • 2

    Esc键退出编辑
    输入:wq然后Enter, 保存并退出
    执行使修改的配置生效命令

    source /etc/profile
    
    • 1

    3.验证Java环境

    输入命令查看环境变量是否配置成功

    java -version
    
    • 1

    四、安装Mysql数据库

    官网下载是用于Linux的Mysql安装包

    下载及解压:

    wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
    tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 
    
    • 1
    • 2

    解压完成后,可以看到当前目录下多了一个解压文件,移动该文件到/usr/local/下,并将文件夹名称修改为mysql。

    mv mysql-5.7.24-linux-glibc2.12-x86_64  /usr/local/
    cd /usr/local/
    mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql
    
    • 1
    • 2
    • 3

    创建数据目录和日志目录

    cd mysql
    mkdir data
    mkdir logs
    
    • 1
    • 2
    • 3

    创建mysql用户

     useradd mysql -s /bin/bash
    
    • 1

    更改mysql目录下所有的目录及文件夹所属的用户组和用户,以及权限

    chown -R mysql:mysql /usr/local/mysql
    chmod -R 755 /usr/local/mysql
    
    • 1
    • 2

    编译安装并初始化mysql,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)
    (root@localhost: K_;fJtj<0T-V)

    cd /usr/local/mysql/bin
    ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --lower-case-table-names=1
    
    • 1
    • 2

    若初始化失败,则添加插件

    yum install  libaio-devel.x86_64
    
    • 1

    编辑配置文件my.cnf

     vi /etc/my.cnf
    
    • 1

    添加配置如下:

    [mysqld]
    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data
    port=3306
    symbolic-links=0
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    max_connections=600
    innodb_file_per_table=1
    lower_case_table_names=1
    character-set-server=utf8  
    
    skip-grant-tables
    
    log_bin=/usr/local/mysql/logs/mysql-bin.log
    long_query_time=0.1
    slow_query_log=ON
    slow_query_log_file=/usr/local/mysql/logs/mysql-slow.log
    general_log=ON
    general_log_file=/usr/local/mysql/logs/logmysql.log
    server-id=1
    
    [mysqld_safe]
    pid-file=/var/run/mariadb/mariadb.pid
    
    !includedir /etc/my.cnf.d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    测试启动mysql服务器

    /usr/local/mysql/support-files/mysql.server start
    
    • 1

    添加软连接,并重启mysql服务

    ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 
    ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
    service mysql restart
    
    • 1
    • 2
    • 3

    登录mysql,修改密码,创建新账号

    mysql -u root -p
    ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
    flush privileges;
    
    
    • 1
    • 2
    • 3
    • 4

    创建用户

    -- 方式1 创建了一个名为:test 密码为:123456 的用户
    CREATE USER 'dbName'@'%' IDENTIFIED with mysql_native_password  BY 'dbPassword';
    -- 方式2
    create user 'dbName'@'%' identified by 'dbPassword';
    
    • 1
    • 2
    • 3
    • 4

    创建数据库

    create database dbName;
    
    • 1

    授权指定数据库权限

    GRANT all privileges ON dbName.* TO 'dbName'@'%';
    
    • 1

    数据库还原

    /usr/local/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p dbName< /home/projectName/backup/dbName_20220730.sql
    
    
    • 1
    • 2

    mysql数据库备份命令

    /usr/local/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p dbName> /home/proejctName/backup/dbName_20220730.sql
    
    • 1

    数据库日志还原

    /usr/local/mysql/bin/mysqlbinlog "/usr/local/mysql/logs/mysql-bin.000001"  |mysql -u root -p
    
    • 1

    五、部署springboot后台服务

    配置maven编译环境

    本地下载apache-maven-3.3.9,并解压
    添加环境变量
    MAVEN_HOME=D:\Software\maven\apache-maven-3.3.9
    PATH增加%MAVEN_HOME%\bin

    验证maven环境配置

    mvn -version
    
    • 1

    项目编译

    进入后端springboot项目根目录,目录下存在pom.xml,输入以下命令进行编译

    mvn clean install
    
    • 1

    目录下生成target文件夹
    文件夹中的xxx.jar即为编译好的springboot项目

    项目启动命令

    通过以下命令可启动项目

    java -jar xxx.jar
    
    • 1

    部署

    将xxx.jar上传到后端项目:/home/project/target目录
    添加在bin目录添加启动脚本start.sh,脚本内容如下

    #!/bin/sh
    APP_NAME=xxx.jar
    TARGET_PATH=../target/
    #
    JAVA_OPTS="-server -Xms128m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xverify:none -XX:+DisableExplicitGC -Djava.awt.headless=true"
    tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
    if [ ${tpid} ]; then
    echo Stop $APP_NAME Process...
    kill -15 $tpid
    fi
    sleep 5
    tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
    if [ ${tpid} ]; then
    echo Kill $APP_NAME Process!
    kill -9 $tpid
    else
    echo Stop $APP_NAME Success!
    fi
    
    tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
    if [ ${tpid} ]; then
        echo $APP_NAME is running.
    else
        echo $APP_NAME is NOT running.
    fi
    
    rm -f tpid
    ls
    nohup  java $JAVA_OPTS -jar $TARGET_PATH$APP_NAME --spring.profiles.active=test &
    echo $! > tpid
    echo Start $APP_NAME  Success!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    配置nginx代理

    location /projectName/ {
    		proxy_pass http://127.0.0.1:1666;#后端项目接口地址
    	}
    
    • 1
    • 2
    • 3

    服务端配置代理前端

    public void addResourceHandlers(ResourceHandlerRegistry registry) {
            System.out.println("前端目录:" + getVuePath());
            registry.addResourceHandler("/web/**").addResourceLocations("file:" + getVuePath());
            System.out.println("文件上传目录:" + FileUtil.getUploadFileFolder());
            registry.addResourceHandler("/upload/**").addResourceLocations("file:" + FileUtil.getUploadFileFolder());
            System.out.println("临时文件目录:" + FileUtil.getTempFolder());
            registry.addResourceHandler("/temp/**").addResourceLocations("file:" + FileUtil.getTempFolder());
            System.out.println("资源文件路径:" +FileUtil.getStaticFileFolder().getAbsolutePath().concat(File.separator));
            registry.addResourceHandler("/files/**").addResourceLocations("file:" + FileUtil.getStaticFileFolder().getAbsolutePath().concat(File.separator));
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    六、部署Vue前端项目

    配置Node编译环境

    本地下载node-v16.14.2-win-x64,并解压
    添加环境变量
    NODE_HOME=D:\Software\nodejs\node-v16.14.2-win-x64
    PATH增加%NODE_HOME%

    验证Node环境配置

    node -v
    
    • 1

    npm私仓配置 (私仓具有下载中央仓库的功能,并具有缓存的功能)

    npm set registry http://repository.dct99.com:8100/repository/npm-public/
    
    • 1

    安装pnpm

    npm install -g pnpm
    
    • 1

    安装cli脚手架

    pnpm install dc-vue-base-cli -g
    
    • 1

    项目编译

    使用以下命令编译项目

    pnpm install --no-frozen-lockfile
    pnpm install
    pnpm run build
    
    • 1
    • 2
    • 3

    部署

    将编译生成的dist打包上传到Web前端资源 :/home/projectName/dist,并解压
    配置nginx代理

    location /projectName/web/ {
    		alias /home/projectName/dist/;#前端静态资源文件
        }
    
    • 1
    • 2
    • 3

    然后就可以通过nginx端口访问项目了!

  • 相关阅读:
    iOS——【Blocks】
    软件工程导论第六版 第五章 总体设计
    Python中类型的可变和不可变、变量赋值浅复制深复制后变量id的变化、小整数、拆包应用交换两个变量的值和Python中几种输出方式
    超详细教程:在Blender中打造毛毡风格角色
    基于超分辨率的遥感图像小目标检测
    【2024】TCP、UDP和 HTTP 的区别是?
    域名解析DNS:如何查询txt类型的解析记录
    南园十三首·其五
    系统性认知网络安全
    八股——const 关键字
  • 原文地址:https://blog.csdn.net/u013964774/article/details/126046204