linux服务器运行java项目个人笔记

注:日常更版只需执行步骤五、六即可

所有文件存放、软件安装一般都在 /opt 目录下。

(一)、用户相关配置

一、添加用户、设置密码

adduser -m dpsapp
passwd dpsapp

二、给用户赋予root权限

1、修改文件/etc/sudoers权限

chmod 600 /etc/sudoers

2、修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉

%wheel ALL=(ALL) ALL 

3、参照root配置方法,在下面配置dpsapp用户

root ALL=(ALL:LL) ALL
dpsapp ALL=(ALL:LL) ALL

4、/etc/sudoers权限恢复,否则会报错

chmod 400 /etc/sudoers

(二)、服务相关配置

[切换到dpsapp用户执行以下操作]

一、文件位置

jdk1.8 压缩包上传至 /opt/software 目录;

jdk1.8 解压文件放在 /opt/jdk 目录,即为jdk安装目录

 tar -xvf jdk-8u311-linux-x64.tar 

二、配置java环境变量

[说明]:永久修改,仅对dpsapp用户有效

1、修改dpsapp用户目录下的.bash_profile文件

vim /home/dpsapp/.bash_profile

2、在文件最后添加下面的内容

export JAVA_HOME=/opt/jdk/jdk1.8.0_311
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

3、运行以下命令使配置立即生效

source /home/dpsapp/.bash_profile

4、检查java环境变量配置是否生效

java -version

三:安装Git

[说明]:公司内部原因,生产环境部署时,jar包只能通过git上传至服务器,所以需要安装。

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum -y install git-core

检查git安装是否成功及查看版本

git --version

四:防火墙相关:

1、查看开放的端口列表

firewall-cmd --list-ports

2、开放服务端口

firewall-cmd --zone=public --add-port=8080/tcp --permanent

3、重启防火墙

firewall-cmd --reload

4、查看开放端口列表,确认是否开放成功

五、项目git地址: http://*****.****.git

1、切换到服务相关主目录

cd /opt/appservice

2、如果已存在cockpit-1.0-SNAPSHOT.jar文件,请先将文件备份(yyyyMMdd-n 年月日+编号)

cp cockpit-1.0-SNAPSHOT.jar ./versionHist/cockpit-1.0-SNAPSHOT.jar.yyyyMMdd-n

2、进入到指定目录,从Git仓库拉取文件

cd /opt/appservice/cockpit
git clone http://*****.****.git

4、复制jar文件

cd /opt/appservice
cp /opt/appservice/cockpit/target/cockpit-1.0-SNAPSHOT.jar ./

4、编辑配置文件(如果有配置文件修改,则执行以下命令修改添加)

cd /opt/appservice/conf
vim application.yml
vim logback-spring.xml

六、运行脚本,启动服务。

./run.sh start

如果不清楚命令或想得到全部命令参数,可输入./run.sh 查看相应参数。

七、关于log文件:

1、所有日志相关文件全部存放在log文件夹下。

2、gc.log 为java垃圾回收日志,调优时使用。

3、每日的日志会新建文件夹。文件夹以当日日期命名。格式“yyyy-MM-dd”。

4、开启的日志级别为INFO,info.yyyy-MM-dd.0.log 文件包含INFO日志和ERROR日志,error.yyyy-MM-dd.0.log只包含ERROR日志。

[说明]:单个日志文件大于50M,则会新建文件输出日志。

自定义切面

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;


/**
 * 检查入参,切面处理类
 *
 * @author fanxinlai
 */
@Slf4j
@Aspect
@Component
public class CheckEmpCodeAspect {


    @Value("${hy.auth.url: }")
    private String authUrl;

    public static final ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<>();

    @Pointcut("@annotation(com.hy.cockpit.common.annotation.CheckEmpCode)")
    public void checkPointCut() {
    }

    @Around("checkPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // 请求的类名
        String className = point.getTarget().getClass().getName();
        // 请求的方法名
        String methodName = point.getSignature().getName();
        // 请求参数
        Object[] args = point.getArgs();
        log.info("请求类及方法为: {}.{}()", className, methodName);
        log.info("请求参数有: {}", args);
        long beginTime = System.currentTimeMillis();

        // 1. 获取request,拿到Token
        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
        String authToken = request.getHeader("Authorization");

        // 2. 携带Token请求鉴权接口获取empCode
        log.info("获取到request.head中的Authorization信息: " + authToken);
        HashMap<String, String> headers = new HashMap<>();//存放请求头,可以存放多个请求头
        headers.put("hytoken", authToken);
        // 2.1 发送get请求并接收响应数据
        HttpResponse execute = HttpUtil.createGet(authUrl).addHeaders(headers).execute();
        String resultBody= execute.body();
        log.info("=========[鉴权执行耗时(单位毫秒)]====>>> {}", System.currentTimeMillis() - beginTime);

        // 2.2 解析返回的参数,获取empCode
        String empCode = getEmpCode(resultBody);
//        String empCode = request.getParameter("emp_code");
        log.info("鉴权返回的员工编号为: {}", empCode);

        // 3. 保存鉴权接口返回的员工工号
        HashMap<String, String> map = new HashMap<>();
        map.put(Const.EMP_CODE, empCode);
        threadLocal.set(map);

        // 4. 执行方法
        Object result = point.proceed();

        threadLocal.remove();
        log.info("===== 请求结果===== \n{}", result);
        log.info("=========[方法总耗时(单位毫秒)]====>>> {}", System.currentTimeMillis() - beginTime);

        return result;
    }

启动脚本

#!/bin/bash
#项目包名
APP_NAME=cockpit-1.0-SNAPSHOT.jar
#项目启动脚本使用说明,用来提示输入参数
usage() {
    echo "Usage: sh run.sh [start|stop|restart|status]"    
    exit 1
}

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法、命令
start(){
  is_exist
  if [ $? -eq 0 ]; then
    echo "${APP_NAME} is already running. pid=${pid}"
  else
    nohup java -Dloader.path="./lib" -Dspring.config.location=./conf/application.yml -jar -Xms2048m -Xmx2048m  -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./log/gc.log ${APP_NAME} >>./log/log_$(date +%F).log 2>&1 &
  fi
}

#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
  else
    echo "${APP_NAME} is not running"
  fi  
}

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}

#重启
restart(){
  stop
  sleep 5
  start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac
#日志路径
echo "查看日志命令: tail -f ./log/log_$(date +%F).log"

日志配置文件

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">

    <!-- Log file path -->
    <property name="log.path" value="/home/xinlai/testlog" />

    <!-- Console log output -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{MM-dd HH:mm:ss.SSS} %-5level [%logger{50}] - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- Log file debug output -->
    <appender name="fileRolling_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
        </encoder>
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level>
            <onMatch>DENY</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter> -->
    </appender>
    <!-- Log file error output -->
    <appender name="fileRolling_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
    <root level="info">
        <!--{dev.start}-->
        <!--        <appender-ref ref="console" />-->
        <!--{dev.end}-->
        <!--{alpha.start}
        <appender-ref ref="fileRolling_info" />
        {alpha.end}-->
        <!--        {release.start}-->
        <appender-ref ref="fileRolling_info" />
        <!--        {release.end}-->
        <appender-ref ref="fileRolling_error" />
    </root>
    <!-- Framework level setting -->
    <include resource="config/logger-core.xml" />

    <!-- Project level setting -->
    <!-- <logger name="your.package" level="DEBUG" /> -->
    <logger name="org.springframework" level="INFO"></logger>
    <logger name="org.mybatis" level="INFO"></logger>
</configuration>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容