前言
在项目实战开发中,经常需要搭建服务器,但是一些配置和搭建步骤经常会忘,所以在次记录。
服务器采用的是阿里云服务器学生版CentOS 8.0 64位 (1核 2 GB)(便宜,真香),要通过脚本自动化上线项目,需要以下的配置:
- jdk
- mysql
- redis
- maven
- git
- nginx
自动化上线逻辑:
- 本地编写代码,上传git
- 服务器执行脚本,脚本拉取项目,打包运行
文章和方法有错误或更好的处理方式欢迎讨论👏
一、通过脚本登陆服务器
在开始之前,我们需要先在阿里云上购买服务器,并设置好安全组开放端口,不然无法远程连接,这些都可以百度。
设置好这些基本的配置后,我们首先需要远程连接服务器。
windows 可以通过PuTTY 或者XShell 来连接服务器。演示用的mac,所以可以用脚本通过ssh 来登陆。
先在你喜欢的目录创建一个脚本,server.sh:
$ pwd
/Users/wentong/sh/server
$ vim server.sh
$ ll
total 24
-rwxr-xr-x 1 wentong staff 169B 12 8 11:24 liuxue1.sh
-rwxr-xr-x 1 wentong staff 172B 12 8 11:27 liuxue2.sh
-rwxr-xr-x@ 1 wentong staff 158B 12 19 22:24 server.sh
#!/usr/bin/expect
set user "your_user"
set ipaddress "your_ip"
set passwd "your_password"
set timeout 30
spawn ssh $user@$ipaddress
expect "password"
send "$passwd\n"
interact
把上述脚本中的登陆信息换成你的就行,然后记得通过chmod 给脚本执行权限:
$ chmod +x server.sh
# 执行脚本就可以登陆服务器了
$ ./server.sh
补充
expect 是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信
执行顺序:
1. spawn 启动指定线程
2. expect 获取系统交互关键字(这里ssh 系统会让用户输入password)
3. send 获取到关键字,用send 向系统发送字符串
常见的expect 命令:
spawn 交互程序开始后面跟命令或者指定程序
expect 获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
set 定义变量
puts 输出变量
set timeout 设置超时时间
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
interact 允许用户交互
eof expect执行结束 退出
二、 安装JDK 1.8
Welcome to Alibaba Cloud Elastic Compute Service !
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sat Jan 18 22:18:47 2020 from 125.82.214.35
[root@iZwz9hmb50uzud432t180uZ ~]#
登陆服务器后,我们先安装jdk 1.8,我们采用安装包来安装。
在官网下载jdk1.8
然后我们在本地通过scp 命令,把安装包发到服务器/usr/local 目录
$ scp jdk-8u231-linux-x64.tar.gz root@120.79.94.90:/usr/local
进入/usr/local 目录解压jdk ,并在根目录下bash_profile 中配置Java 环境变量
[root@iZwz9hmb50uzud432t180uZ local]# cd /usr/local
[root@iZwz9hmb50uzud432t180uZ local]# tar -zxvf jdk-8u231-linux-x64.tar.gz
[root@iZwz9hmb50uzud432t180uZ local]# mv jdk1.8.0_231/ jdk1.8
#java environment
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
[root@iZwz9hmb50uzud432t180uZ local]# source ~/.bash_profile
[root@iZwz9hmb50uzud432t180uZ local]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
三、安装mysql ,并设置远程连接
在CentOs 里面默认使用的是mariadb(数据库对比:选择MariaDB还是MySQL?),要用mysql 就先把mariadb 和旧mysql 相关的删掉:
[root@iZwz9hmb50uzud432t180uZ ~]# rpm -qa | grep mariadb
# 把上面查出来的全删了
# 示例:rpm -e --nodeps mariadb-libs-5.5.35-3.el7.x86_64
[root@iZwz9hmb50uzud432t180uZ ~]# rpm -qa|grep -i mysql
# 把上面查出来的全删了
# 示例:yum -y remove mysql...
删干净后就可以安装mysql 了
[root@iZwz9hmb50uzud432t180uZ ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
[root@iZwz9hmb50uzud432t180uZ ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
[root@iZwz9hmb50uzud432t180uZ ~]# yum -y install mysql-server
安装好mysql,要修改密码,并打开远程连接,记得开3306 端口:
[root@iZwz9hmb50uzud432t180uZ mysql]# service mysqld start
Redirecting to /bin/systemctl start mysqld.service
# 第一次不需要密码
[root@iZwz9hmb50uzud432t180uZ mysql]# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.17 Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
# 修改root 密码
[root@iZwz9hmb50uzud432t180uZ mysql]# alter user 'root'@'localhost' identified by '你的密码';
# 配置远程连接
//进入mysql库
[root@iZwz9hmb50uzud432t180uZ mysql]# use mysql
//更新域设置,允许外部访问
[root@iZwz9hmb50uzud432t180uZ mysql]# update user set host='%' where user ='root';
//不重启直接生效
[root@iZwz9hmb50uzud432t180uZ mysql]# FLUSH PRIVILEGES;
//进行授权
[root@iZwz9hmb50uzud432t180uZ mysql]# GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
测试是否可以远程连接
四、安装redis,并设置远程访问
redis 可以直接通过yum 安装
[root@iZwz9hmb50uzud432t180uZ ~]# yum install redis
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:00:03 ago on Sun Jan 19 00:10:07 2020.
Package redis-5.0.3-1.module_el8.0.0+6+ab019c03.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@iZwz9hmb50uzud432t180uZ ~]# service redis start
Redirecting to /bin/systemctl start redis.service
[root@iZwz9hmb50uzud432t180uZ ~]# redis-cli
127.0.0.1:6379> exit
设置远程访问,我们需要修改redis.conf
# 可以通过whereis 来查找redis.conf
[root@iZwz9hmb50uzud432t180uZ etc]# whereis redis
redis: /usr/lib64/redis /etc/redis.conf
修改redis.conf 中的bind 127.0.0.1 为bind 0.0.0.0
bind 0.0.0.0 代表所有人都可以访问
找到#requirepass那行并打开注释,在后面写自己的密码,如下
requirepass yourpassword
建议设置密码,不然有可能被被别人通过端口挖矿
在vim 中可以通过输入/bind 回车来快速查找,vim 查找功能
测试
// 本级远程连接
$ redis-cli -h 120.79.94.90 -p 6379
120.79.94.90:6379> KEYS *
(error) NOAUTH Authentication required.
// 输入密码
120.79.94.90:6379> AUTH 这是密码
OK
120.79.94.90:6379> KEYS *
(empty list or set)
120.79.94.90:6379>
补充
###安装软件
yum install 包名
###卸载包
yum remove | erase 包名
###更新本地软件
yum update
###更新本地缓存
yum makecache
###列出所有可安装的软件包
yum list
###列出所有可更新的软件包
yum list updates
###列出所有已安装的软件包
yum list installed
###列出所有可更新的软件包信息
yum info updates
###列出所有已安裝的软件包信息
yum info installed
###搜索软件
yum search 包名
五、安装git
git 的安装很简单
[root@iZwz9hmb50uzud432t180uZ ~]# yum install git
[root@iZwz9hmb50uzud432t180uZ ~]# git --version
git version 2.18.2
六、安装maven
安装需要先到maven 官网下载安装包
我们可以复制下载地址在CentOs 里面通过wget 下载
# 在/usr/local 目录下下载
[root@iZwz9hmb50uzud432t180uZ lib]# cd /usr/local/
[root@iZwz9hmb50uzud432t180uZ local]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
[root@iZwz9hmb50uzud432t180uZ local]# tar -zxvf apache-maven-3.6.3-bin.tar.gz
// 修改目录名
[root@iZwz9hmb50uzud432t180uZ local]# mv apache-maven-3.6.3 maven
再修改~/.bash_profile 里面的路径(类似配置jdk 环境变量)
[root@iZwz9hmb50uzud432t180uZ local]# vim ~/.bash_profile
MAVEN_HOME=/usr/local/maven/
export PATH=${MAVEN_HOME}/bin:${PATH}
// 更新
[root@iZwz9hmb50uzud432t180uZ local]# source ~/.bash_profile
测试
[root@iZwz9hmb50uzud432t180uZ project]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "4.18.0-80.11.2.el8_0.x86_64", arch: "amd64", family: "unix"
七、远程拉取项目
前面我们安装了Java、git 和maven 已经可以在我们的服务器上拉取项目并打包运行了
在github 上拉一下自己的项目
拉项目之前先把服务器的密钥加入项目,方便拉取
服务器的密钥都放在~/.ssh 目录下
[root@iZwz9hmb50uzud432t180uZ local]# cd ~/.ssh/
[root@iZwz9hmb50uzud432t180uZ .ssh]# ls
authorized_keys
这里我们因为是新服务器还没创建密钥,可以通过命令ssh-keygen -t rsa 来创建密钥,什么都不用输,一路回车
[root@iZwz9hmb50uzud432t180uZ .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vafOfGfI/atLMz+RZTb1DzJBAZ4L4debWFKFZB6uwCw root@iZwz9hmb50uzud432t180uZ
The key's randomart image is:
+---[RSA 3072]----+
| . .+B+. |
| + o Bo. .|
| E * = =. o|
| . = *oo..=|
| S = oo +=|
| . o.|
| ...* .|
| o o= B. |
| .=. =o++|
+----[SHA256]-----+
[root@iZwz9hmb50uzud432t180uZ .ssh]#
[root@iZwz9hmb50uzud432t180uZ .ssh]# ls
authorized_keys id_rsa id_rsa.pub
我们把id_rsa.pub 里面的内容复制到github 项目的密钥管理里面
设置好密钥,我们就可以在服务器上拉取,并用maven 打包运行:
[root@iZwz9hmb50uzud432t180uZ ~]# cd ~
[root@iZwz9hmb50uzud432t180uZ project]# mkdir project && cd project\
[root@iZwz9hmb50uzud432t180uZ project]# git clone git@github.com:tanwt/TheCentralCertification.git
...
[root@iZwz9hmb50uzud432t180uZ ~]# cd TheCentralCertification
[root@iZwz9hmb50uzud432t180uZ ~]# mvn clean && package
...
[root@iZwz9hmb50uzud432t180uZ ~]# cd target
[root@iZwz9hmb50uzud432t180uZ ~]# java -jar certification-0.0.1-SNAPSHOT.jar
启动项目后,来测试能否访问接口
八、安装nginx
通过yum 安装nginx
[root@iZwz9hmb50uzud432t180uZ ~]# yum install nginx
[root@iZwz9hmb50uzud432t180uZ ~]# service nginx start
当然nginx 还有很多其他的作用,比如映射静态资源、代理、https等等,感兴趣可以自己去研究一下。
九、通过脚本自动发布项目
其实走完整套流程过后,你会发现在服务器上发布一个项目无非就是那几个命令,所以我们可以通过脚本来简化我们的操作:
[root@iZwz9hmb50uzud432t180uZ ~]# cd ~/project/
[root@iZwz9hmb50uzud432t180uZ project]# vim start.sh
source ~/.bash_profile
cd TheCentralCertification
git checkout master && git pull && mvn clean install
cd -
APP_NAME=certification
VERSION=0.0.1-SNAPSHOT
FILE_NAME=/root/project/TheCentralCertification/target/$APP_NAME-$VERSION.jar
SPRING_PROFILES_ACTIVE=product
APP_LOG_PATH=/var/logs/$APP_NAME
mkdir -p $APP_LOG_PATH
cat certification.pid | xargs kill -9
cd `dirname $0`
PID=`ps -ef | grep java | grep "$FILE_NAME" |awk '{print $2}'`
if [ -n "$PID" ]; then
echo "ERROR: $APP_NAME is already started!!"
exit 1
fi
echo "Starting $FILE_NAME profiles=$SPRING_PROFILES_ACTIVE label=$SPRING_CLOUD_CONFIG_LABEL logPath=$APP_LOG_PATH ..."
JAVA_OPTS="$JAVA_OPTS -server -Dfile.encoding=UTF-8 -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128m"
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -Xms1024m -Xmx1024m"
echo "JAVA_OPTS: $JAVA_OPTS"
nohup java $JAVA_OPTS -jar $FILE_NAME --spring.profiles.active=$SPRING_PROFILES_ACTIVE </dev/null > $APP_LOG_PATH/${APP_NAME}_java_stdout.log 2>&1 &
echo "$!" > certification.pid
sleep 3
PID=`ps -ef | grep java | grep "$FILE_NAME" |awk '{print $2}'`
echo "Startd $FILE_NAME on $PID(`cat certification.pid`)"
[root@iZwz9hmb50uzud432t180uZ project]# chmod +x start.sh
[root@iZwz9hmb50uzud432t180uZ project]# ./start.sh
查看接口是否能够访问
现在我们只需要把本地的代码上传到远程仓库,再到服务器执行一下脚本,就可以发布项目了