前言
在項目實戰開發中,經常需要搭建服務器,但是一些配置和搭建步驟經常會忘,所以在次記錄。
服務器採用的是阿里雲服務器學生版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 [email protected]:/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 [email protected]: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
查看接口是否能夠訪問
現在我們只需要把本地的代碼上傳到遠程倉庫,再到服務器執行一下腳本,就可以發佈項目了