Java项目部署

使用 Nginx + Maven + Git + Pm2 完成项目的部署及维护

后端项目配置

环境配置

  • JDK
    1. 安装命令:yum install java-1.8.0-openjdk.x86_64
    2. 检测命令:java -version
  • Maven
    1. 安装命令:yum install maven
    2. 检测命令:mvn -v
  • Node
    1. 安装命令:yum install nodejs
    2. 检测命令:npm -v
  • pm2
    1. 前置条件:需要安装 Node
    2. 安装命令:npm install pm2 -g

拉取代码

  1. 连接服务器,选择要存放代码的文件夹,然后拉取代码

    git clone [仓库地址]
  2. 环境配置

    # maven 配置
    mvn -N io.takari:maven:0.7.7:wrapper
    mvn clean install
  3. 编写pm2.json进程管理代码

    { 
            // 应用名称
            "name": "myweb",
    
            "script": "/usr/bin/java",
    
            // 设置项目启动的参数,需要修改active
            "args": [
                    "-Xms128m",
                    "-Xmx512m",
                    "-XX:PermSize=128m",
                    "-XX:MaxNewSize=256m",
                    "-XX:MaxPermSize=128m",
                    "-XX:+HeapDumpOnOutOfMemoryError",
                    "-XX:+UseParallelGC",
                    "-XX:+UseParallelOldGC",
                    "-jar",
                    "target/jweb_tl_pms-1.0.0-SNAPSHOT.jar",
                    "--spring.profiles.active=beta2"
            ],
    
            "exec_interpreter": "",
    
            "exec_mode": "fork"
    } 
    
  4. 编写build.sh脚本文件,用来统一执行命令

    # 拉取最新代码
    git pull
    
    # 删除7天以前备份文件
    location="/data/backup/myweb/"
    fileName=`date +%Y%m%d%H%M%S`
    path="${ location} ${ fileName} .jar"
    # echo "start copy to ${ path}  !"
    find $location -mtime +1 -type f |xargs rm -f
    
    # 备份.jar文件
    cp ./target/*.jar ${ path} 
    
    # 打包和重启
    ./mvnw clean package -Dmaven.test.skip=true
    # 这里对应pm2.json中的应用名称
    pm2 restart myweb    
  5. 创建备份文件路径/data/backup/myweb/

  6. 依次执行下方代码

    # 项目打包,生成jar包
    mvn clean package -Dmaven.test.skip=true
    
    # 创建pm2 应用
    pm2 start pm2.json
  7. 此后更新均可以通过 sh build.sh命令一键拉取、打包和运行了

Nginx配置

  1. 创建conf.d目录用来存放nginx配置文件

    image-20211003204614294

  2. 修改nginx.conf配置文件,用于指向该目录下的所有配置文件

    image-20211003204724455

  3. 编写新的配置文件,注意这里不需要添加 http

    upstream myweb_dev{ 
        # 这里必须指向我们刚才pm2启动的应用程序的端口
        server 127.0.0.1:8000;
    } 
    
    server { 
        listen 80;
        listen [::]:80;
        # 通过访问这个域名就可以访问到该项目了
        server_name www.lxjstudy.top;
        return 301 https://www.lxjstudy.top;
    } 
    
    server { 
        listen                 443 ssl;
        server_name            www.lxjstudy.top;
        index                  index.html;    
    
        gzip             on;
        gzip_min_length  1k;
        gzip_comp_level  5;
        gzip_types       text/plain application/x-javascript text/css application/xml application/javascript application/json;
    
        ssl_certificate /usr/local/nginx/cert/6143058_www.lxjstudy.top.pem;
        ssl_certificate_key /usr/local/nginx/cert/6143058_www.lxjstudy.top.key;
    
        ssi on;
        ssi_silent_errors on;
        ssi_types text/shtml;
    
        # 这里必须这样配置,不然访问不了项目内容
        location / { 
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    
            proxy_pass    http://myweb_dev/;
            proxy_set_header Host $host;
            proxy_intercept_errors on;
        } 
        location /connectWebSocket/ { 
            # 这里需要设置端口
            proxy_pass http://127.0.0.1:8000/connectWebSocket/;     
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        } 
    } 

配置项目输入日志

  1. 创建日志配置文件logback-dev.xml,并指定对应的日志位置

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds"
                   debug="false">
    
        <contextName>myweb</contextName>
        <!-- 配置日志的路径 -->
        <property name="path" value="/data/jweblog/myweb_beta" />
    
        <!-- 控制台 -->
        <appender name="console"
                  class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>[%date{ HH:mm:ss.SSS} ] [%thread] [%-5level] [%logger{ 36} ] %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 访问日志 -->
        <appender name="access"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy
                    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ path} /access/access.%d{ yyyy-MM-dd} .log
                </fileNamePattern>
                <maxHistory>3</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>[%date{ HH:mm:ss.SSS} ] [%thread] [%-5level] [%logger{ 36} ] %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 运行日志 -->
        <appender name="run"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy
                    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ path} /run.%d{ yyyy-MM-dd} .log</fileNamePattern>
                <maxHistory>7</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>[%date{ HH:mm:ss.SSS} ] [%thread] [%-5level] [%logger{ 36} ] %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 错误日志 -->
        <appender name="error"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy
                    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ path} /error.%d{ yyyy-MM-dd} .log</fileNamePattern>
                <maxHistory>21</maxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>[%date{ HH:mm:ss.SSS} ] [%thread] [%-5level] [%logger{ 36} ] %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 访问日志 -->
        <logger name="access" level="INFO" additivity="false">
            <appender-ref ref="access" />
        </logger>
        <logger name="com.tl" level="DEBUG">
        </logger>
        <root level="INFO">
            <appender-ref ref="run" />
            <appender-ref ref="error" />
            <appender-ref ref="console" />
        </root>
    </configuration>
  2. application-dev.yaml配置文件中编写日志信息

    # 配置日志文件
    logging:
      config: classpath:logback-dev.xml

    image-20211003210842413

  3. 提交代码

    image-20211003211124126

  4. 在服务器项目目录下执行sh build.sh执行更新

    image-20211003211322590

  1. 配置完成之后就可以通过 域名 进行访问了

    image-20211003205658924