暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

传统模式项目部署

稻草人技术圈 2021-03-16
479

一、传统模式项目部署

直接切入正题,简要分析我们项目开发中的实际部署需求。首先本节讲解的是标准云服务器项目部署,所以我们的项目主体是直接部署在Linux上的,没有使用任何容器技术等方案部署,所以一切从简。我们需要解决的问题如下:

  • 将SpringBootJar包部署到Linux上运行
  • 使用Nginx代理项目中特殊文件目录(上传文件根目录等)

开发软件下载:https://www.yuque.com/lb6pg1/omdpt5/nrq7w5

  • jdk-8u191-linux-x64.tar.gz
  • mysql-8.0.22-el7-x86_64.tar.gz
  • redis-6.2.0.tar.gz
  • nginx-1.19.7.tar.gz

所有上传的项目文件,统一存放在目录:/home/project

(1)安装JDK

JDK1.8 官网下载地址,找到jdk-8u191-linux-x64.tar.gz下载,将下载好的安装包放到 Linux 的 /home/project 文件夹下,解压安装包

mkdir -p /home/project && cd /home/project

tar -zxvf jdk-8u191-linux-x64.tar.gz

创建安装目录

mkdir -p /usr/local/java/

移动 解压文件夹

mv jdk1.8.0_191 /usr/local/java/

安装完成,继续配置环境变量

修改环境变量配置文件,在末尾增加配置

vim /etc/profile

#jdk环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

刷新配置文件

source /etc/profile

使用java、javac验证安装结果,OK,有手就行!

(2)安装MySQL

查看系统是否已经安装mariadb

rpm -qa | grep mariadb

如果有,则卸载相对应的模块

rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

安装MySQL依赖包 libaio

yum install libaio

创建MySQL安装目录和数据存放目录,并授权

mkdir /usr/local/mysql
mkdir /usr/local/mysql/mysqldb
chmod -R 777 /usr/local/mysql
chmod -R 777 /usr/local/mysql/mysqldb/

# 或者执行以下一条组合命令
mkdir /usr/local/mysql && mkdir /usr/local/mysql/mysqldb && chmod -R 777 /usr/local/mysql && chmod -R 777 /usr/local/mysql/mysqldb/

创建MySQL组:创建MySQL用户,并设置密码

useradd mysql
passwd mysql

将mysql目录的权限授给mysql用户和mysql组

chown -R mysql:mysql /usr/local/mysql

上传并解压安装包,解压的所有文件是放在/usr/local/mysql目录下的

tar -zxvf mysql-8.0.22-el7-x86_64.tar.gz

mv mysql-8.0.22-el7-x86_64/* /usr/local/mysql/

cd /usr/local/mysql

在系统根目录的/etc创建MySQL的安装初始化配置文件my.cnf

vi /etc/my.cnf

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/mysqldb
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8

安装MySQL8.0.22,进入MySQL安装目录bin下

cd /usr/local/mysql/bin

执行命令,并记住随机密码

 ./mysqld --initialize --console

如果报错:./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory

解决方案:

如果安装mysql出现了以上的报错信息.这是却少numactl这个时候如果是Centos就yum -y install numactl就可以解决这个问题了.

ubuntu的就sudo apt-get install numactl就可以解决这个问题了

启动MySQL服务

cd /usr/local/mysql/support-files
./mysql.server start

可能出现的报错

  1. 启动MySQL服务时报 my_print_defaults:未找到命令错误,解决方法是检查并修改 /etc/my.cnf 中的 MySQL的安装目录
  2. 启动MySQL服务时报 updating PID file 错误,解决方法是在安装目录下重新授权,然后再启动MySQL

将MySQL加入系统进程中

cp mysql.server /etc/init.d/mysqld

# 然后重启MySQL服务:

service mysqld restart

修改登录密码

cd /usr/local/mysql/bin

./mysql -u root -p

修改语句

 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

任意目录登录MySQL问题,解决方法是创建一个软连接到 /usr/bin

ln -s /usr/local/mysql/bin/mysql /usr/bin

设置允许远程登录

use mysql;

update user set user.Host='%' where user.User='root';

flush privileges;

最后使用quit命令退出MySQL,重启服务即可完成安装

 service mysqld restart

至此MySQL安装完成

(3)安装Redis

redis官网可以下载安装包,https://redis.io/,安装包名称redis-6.2.0.tar.gz,或者使用下载命令直接下载

http://nginx.org/download/nginx-1.19.7.tar.gz

一般都会将redis目录放置到 /usr/local/redis目录,顺带把redis的解压文件名改为redis

 mv redis-6.2.0 /usr/local/redis && cd /usr/local/redis

对redis进行编译,编译过程会有很多日志打印出来

make

安装redis

make PREFIX=/usr/local/redis install

这里多了一个关键字 PREFIX= 这个关键字的作用是编译的时候用于指定程序存放的路径。比如我们现在就是指定了redis必须存放在/usr/local/redis目录。假设不添加该关键字Linux会将可执行文件存放在/usr/local/bin目录,

库文件会存放在/usr/local/lib目录。配置文件会存放在/usr/local/etc目录。其他的资源文件会存放在usr/local/share目录。这里指定号目录也方便后续的卸载,后续直接rm -rf /usr/local/redis 即可删除redis。

根据上面的操作已经将redis安装完成了。在目录/usr/local/redis 输入下面命令启动redis

./bin/redis-server& ./redis.conf

修改redis.conf配置文件,配置redis为后台运行,以及允许远程连接,也就是外网访问

vim /usr/local/redis/redis.conf

这里我要将daemonize改为yes,不然我每次启动都得在redis-server命令后面加符号&,不这样操作则只要回到Linux控制台则redis服务会自动关闭,同时也将bind注释,将protected-mode设置为no,这样启动后我就可以在外网访问了。

通过/关键字查找出现多个结果则使用 n字符切换到下一个即可,查找到结果后输入:noh退回到正常模式

  • 通过 /daemonize 查找到属性,默认是no,更改为yes即可
  • 通过 /protected-mode 查找到属性,默认是yes,更改为no即可
  • 通过 /bind 127 查找到属性, 注释掉bind 127.0.0.1 -::1或者bind 127.0.0.1 即可

查看Redis是否正在运行

# 采取查看进程方式
ps -aux | grep redis

# 采取端口监听查看方式
netstat -lanp | grep 6379

# 杀死进程
kil -9 pid

启动redis的方式修改为以下命令,因为我们修改的默认配置文件是在上级目录,所以需要../指定

cd /usr/local/redis/bin

./redis-server ../redis.conf

到此远程连接可以直接访问redis了!

(4)部署SpringBootJar包

部署SpringBoot的jar包,我们需要将项目打包成jar格式,例如xxs-system-1.0-SNAPSHOT.jar,然后将jar包上传到/home/project目录下

在/home/project目录下创建一个项目启动脚本start.sh,其中我们只需要修改APP_NAME名称为自己的jar包名称即可

#!/bin/bash

#jar包文件路径及名称(目录按照各自配置)
APP_NAME=./xxs-system-1.0-SNAPSHOT.jar

#日志文件路径及名称(目录按照各自配置)
LOG_FILE=./syslogin.log

#查询进程,并杀掉当前jar/java程序

pid=`ps -ef|grep $APP_NAME | grep -v grep | awk '{print $2}'`
kill -9 $pid
echo "$pid进程终止成功"

sleep 2

#判断jar包文件是否存在,如果存在启动jar包,并时时查看启动日志

if test -e $APP_NAME
then
echo '文件存在,开始启动此程序...'

# 启动jar包,指向日志文件,2>&1 & 表示打开或指向同一个日志文件
nohup java -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -jar $APP_NAME > $LOG_FILE 2>&1 &

#实时查看启动日志(此处正在想办法启动成功后退出)
tail -f $LOG_FILE

#输出启动成功(上面的查看日志没有退出,所以执行不了,可以去掉)

#echo '$APP_NAME 启动成功...'
else
echo '$APP_NAME 文件不存在,请检查。'
fi

执行脚本文件,随后控制台会打印项目启动日志,并且使用Ctrl + C也不会中断执行,默认会在后台运行

./start.sh

浏览器使用IP:项目端口即可访问项目

(5)安装Nginx

首先安装Nginx所需要的四个核心依赖

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

解压Nginx安装包,创建Nginx目录,将解压文件复制到根目录,进入根目录

tar -zxvf nginx-1.19.7.tar.gz
mkdir /usr/local/nginx
mv nginx-1.19.7/* /usr/local/nginx/
cd /usr/local/nginx/

# 或者使用以下的组合命令
tar -zxvf nginx-1.19.7.tar.gz && mkdir /usr/local/nginx && mv nginx-1.19.7/* /usr/local/nginx/ && cd /usr/local/nginx/

编译Nginx,安装Nginx,我直接一个命令

./configure && make && make install

创建Nginx日志存放目录

mkdir /usr/local/nginx/logs

修改配置文件

vi /usr/local/nginx/conf/nginx.conf

我这里修改的主要内容

  • 域名映射到IP地址
  • SpringBoot上传的文件根目录映射
  • 静态资源优化访问数据
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush  on; # 防止网络阻塞
    tcp_nodelay  on; # 防止网络阻塞
    client_header_buffer_size 4k;
    client_max_body_size 100m;
    open_file_cache max=65535 inactive=90s;
    open_file_cache_valid 80s;
    open_file_cache_min_uses 1;
    server_tokens off;

    keepalive_timeout  60;
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
    gzip_buffers 4 64k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
    gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
    gzip_comp_level 6; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
    gzip_disable "MSIE [1-6]\.";
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
    gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据

    upstream myserver {
        server 42.193.189.77:9000;
    }

    server{
        listen 80;
        server_name xxs.xfr666.cn;
        
        location /tmp/ {
            alias /home/project/upload/;
            autoindex on;
        }
        
        location ~ .*\.(js|css|txt|html|eot|svg|ttf|woff)?$ {
            root /home/project/;
            expires 1h;
        }
        location / {
            add_header backendIP $upstream_addr;
            proxy_pass http://myserver;
            proxy_redirect off;
            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        }
    }
}

Nginx相关操作命令可以在/usr/local/nginx/sbin目录下进行

cd /usr/local/nginx/sbin

# 可以直接目录使用
/usr/local/nginx/sbin/nginx -s reload

./nginx启动
./nginx -s stop关闭
./nginx -s reload重启
文章转载自稻草人技术圈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论