直接切入正题,简要分析我们项目开发中的实际部署需求。首先本节讲解的是标准云服务器项目部署,所以我们的项目主体是直接部署在 Linux 上的,没有使用任何容器技术等方案部署,所以一切从简。我们需要解决的问题如下:
将 SpringBootJar 包部署到 Linux 上运行
使用 Nginx 代理项目中特殊文件目录(上传文件根目录等)
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
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,有手就行!
查看系统是否已经安装 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 lower_case_table_names=1 [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
可能出现的报错
启动 MySQL 服务时报 my_print_defaults:未找到命令错误,解决方法是检查并修改 /etc/my.cnf 中的 MySQL 的安装目录
启动 MySQL 服务时报 updating PID file 错误,解决方法是在安装目录下重新授权,然后再启动 MySQL
Starting MySQL…The server quit without updating PID file ([失败]ocal/mysql/
权限不足导致的,添加权限 举例: chown -R mysql:mysql /usr/local
将 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 安装完成
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 了!
部署 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:项目端口即可访问项目
首先安装 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 --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 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 | 重启 |