從零搭建基于 Java 的服務器生產(chǎn)環(huán)境

之前的文章介紹了我最近開發(fā)的一款工具軟件 移動工具箱,然而安裝包放在華為應用市場上面,如果不安裝華為應用市場就無法下載軟件,無奈村视,只能自己從零搭建一個服務器來進行應用的宣傳和下載。搭建一個服務器是很簡單的,這里我們將服務器的要求提高一些废麻,以對標 “生產(chǎn)” 的標準進行要求,要做的東西比較多模庐,故作此文烛愧,加以記錄。

首先說下環(huán)境掂碱,騰訊云怜姿,CentOS 7.5 64 位,服務器采用 Java 完成疼燥,具體來說就是 Springboot. 大致羅列下要做的事情:

  • 介紹服務器遠程連接方式
  • 進行基礎(chǔ)的服務器安全配置
    • 禁止 root 用戶直接登錄服務器
    • 關(guān)閉 22 登錄端口
    • 警惕空密碼賬戶
    • 設(shè)置密碼過期時間
    • 設(shè)置密碼復雜度要求
    • 禁止 ping 服務器
    • 最重要的沧卢,防止 rm -rf
  • 搭建生產(chǎn)服務器環(huán)境
    • 安裝 ftp 服務
    • 連接 ftp 服務器
    • 安裝 JDK
    • 搭建 Springboot 環(huán)境
  • 發(fā)布應用
    • 在服務器中啟動 Springboot 程序
    • 指定虛擬機啟動參數(shù)
    • 編寫服務器啟動腳本程序
    • 配置域名

1、介紹服務器遠程連接方式

對于騰訊云醉者,一種連接方式是直接使用騰訊云提供的在線的 webshell 進行登錄但狭,這種登錄方式提供的是 ssh 登錄违寿。假如我們進行 ftp 登錄來上傳文件的話比較不方便。騰訊云的 webshell 還是比較好用的熟空,不過一般我們推薦使用 Xshell 進行 ssh 登錄,使用 xftp 進行 ftp 登錄搞莺∠⒙蓿可以到我的公眾號后臺回復 【服務器連接軟件】 獲取我打包好的軟件。

拿到一個新的服務器才沧,我們要做的第一件事情就是到控制臺里去重置密碼迈喉。對于密碼,為了系統(tǒng)安全起見温圆,應該選擇比較復雜的口令挨摸,例如最好使用 8 位長的口令,口令中包含有大寫岁歉、小寫字母和數(shù)字得运,不應該包含單詞,應該與姓名锅移、生日等不相同熔掺。

按照上面的介紹重置密碼之后就可以進行登錄了,這里使用 Xshell 進行登錄非剃,登錄方式比較簡單置逻,此處略過。

2备绽、進行基礎(chǔ)的服務器安全配置

2.1 禁止 root 用戶直接登錄服務器

為啥要禁止 root 登錄呢券坞?首先,root 這個用戶是眾所周知的肺素,使用 root 用戶增加了被攻擊的風險恨锚。其次,root 權(quán)限比較高倍靡,不論是服務器擁有者還是服務器的協(xié)同開發(fā)都不應該直接使用 root 操作服務器眠冈。使用 root 用戶,一旦出現(xiàn)操作意外菌瘫,就可能會給服務器帶來致命的危害蜗顽。

禁止 root 登錄之前先添加一個新的管理員用戶,

# Step 1: 創(chuàng)建新用戶 admin
adduser the_xxx_admin
# Step 2: 修改用戶密碼雨让,密碼也應該滿足上述要求哦
passwd the_xxx_admin
# Step 3: 賦予該用戶 su 執(zhí)行權(quán)限
gpasswd -a the_xxx_admin wheel

這里增加了一個名為 the_xxx_admin (用戶名不要太大眾化)的管理員用戶雇盖,并將其用戶組設(shè)置為 wheel. wheel 在 linux 中是一個特殊的用戶組,這個組被設(shè)計用來解決 su 指令的授權(quán)問題栖忠。也就是只有在 wheel 組里面的成員才能使用 su 切換到 root 用戶崔挖。如果一個用戶不在 wheel 組里面贸街,即使使用 su 指令并正確地輸入了密碼也無法切換到 root 用戶。wheel 用戶組不僅具有 su 指令的權(quán)限狸相,也具有 sudo 的權(quán)限薛匪,可以通過瀏覽 /etc/sudoers 文件來了解。

增加了新的用戶之后并賦予 sudo 權(quán)限之后脓鹃,我們就可以禁止 root 用戶登錄了:

  1. 修改 /etc/ssh/sshd_config 文件將 #PermitRootLogin yes 修改為 PermitRootLogin no逸尖;
  2. 使用 service sshd restart 重啟 ssh 服務并驗證登錄效果即可。

此處修改文件的時候可以使用 vim /etc/ssh/sshd_config 命令瘸右,然后輸入 /PermitRootLogin 定位到 #PermitRootLogin yes 所在的一行娇跟,輸入 a 進入編輯模式,修改完畢之后使用 :wq! 退出即可太颤。

重啟之后再使用 root 進行登錄苞俘,立刻顯示 “服務器拒絕 ssh 連接”,然后使用新增的用戶進行登錄即可龄章。

2.2 關(guān)閉 22 登錄端口

主要是因為 22 端口登錄已經(jīng)是眾所周知的了吃谣,如果我們使用其它端口實現(xiàn) 22 端口的功能可以減少被攻擊的風險。修改登錄端口需要修改 /etc/ssh/sshd_config 文件做裙。在該文件中基协,我們先新增一個端口,推薦使用 10000 號以上的端口菇用。注意這里應該先保留 22 端口澜驮,設(shè)置完畢并驗證新的端口可以登錄之后再刪除 22 端口。還有需要注意的地方惋鸥,驗證新的接口是否可以登錄之前一定要先打開防火墻杂穷,防火墻關(guān)閉的時候端口可以直接使用,而一旦防火墻打開卦绣,而你又沒有使用防火墻打開該端口耐量,那么防火墻可能會直接屏蔽該端口,導致你無法登錄自己的服務器滤港。

這里直接使用 vim 編輯 /etc/ssh/sshd_config 文件的時候應該會出現(xiàn) Permission Denied廊蜒。此時,可以通過 sudo 命令來完成溅漾,

sudo vim /etc/ssh/sshd_config

與 sudo 類似的還有 su 命令山叮。sudosu 功能類似,區(qū)別在于 sudo 命令需要輸入當前用戶的密碼添履,su 命令需要輸入要切換到的用戶的密碼屁倔。 sudosu 更合理一些,因為暮胧,比如如果希望某個用戶切換到 root 用戶锐借,使用 su 的方式要求執(zhí)行者必須知道 root 賬戶的密碼问麸,密碼被很多人知道顯然不安全。而 sudo 只要求確認當前執(zhí)行者的身份钞翔,如果當前執(zhí)行的用戶在 sudoers 中被授予過訪問 root 的權(quán)限严卖,則它可以切換到 root 用戶,這樣我們既賦予了該用戶切換到 root 的權(quán)限布轿,又無需告知該他 root 賬戶的密碼哮笆。此外,我們還可以通過在 sudoers 文件中進行配置來限制用戶的權(quán)限驮捍,記錄更多的用戶日志等。

進入編輯模式之后找到 Port 22 并在下面新增一行 Port 10022

Port 22
Port 10022

然后脚曾,我們需要按照上述管理端口的邏輯開放 10022 端口东且。然后,重啟 ssh 服務

systemctl restart sshd # 或者 service sshd restart

如果驗證登錄成功本讥,再將上面的 Port 22 注釋掉珊泳,重啟 ssd 服務然后再使用 22 端口登錄,驗證是否已經(jīng)禁止拷沸。

此時色查,我再使用 22 端口進行登錄,提示 Connection failed撞芍,表明禁止 22 端口登錄成功秧了。

2.3 警惕空密碼賬戶

空密碼賬戶會增加系統(tǒng)的安全風險。使用如下指令查詢:

cat /etc/shadow | awk -F: '($2==""){print $1}'

另外序无,可以通過修改 ssh 配置文件 /etc/ssh/sshd_config 來禁止空密碼賬戶進行登錄:

PermitEmptyPasswords no

2.4 設(shè)置密碼過期時間

設(shè)置和查詢密碼有效期會用到指令 chage验毡,該指令格式如下:

chage [參數(shù)] [數(shù)值]

常用參數(shù):

  1. -m : 密碼可更改的最小天數(shù)。為零時代表任何時候都可以更改密碼帝嗡。
  2. -M : 密碼保持有效的最大天數(shù)。
  3. -W : 用戶密碼到期前,提前收到警告信息的天數(shù)丈秩。
  4. -E : 帳號到期的日期仅乓。過了這天,此帳號將不可用巢寡。
  5. -d : 上一次更改的日期喉脖。
  6. -I : 停滯時期。如果一個密碼已過期這些天抑月,那么此帳號將不可用动看。
  7. -l : 例出當前的設(shè)置。由非特權(quán)用戶來確定他們的密碼或帳號何時過期爪幻。

一般的使用示例如下菱皆。

首先查詢用戶密碼的有效期:

chage -l admin

顯示信息如下:

Last password change                                    : Apr 07, 2020
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

我們可以使用 chage 指令來修改密碼的過期時間须误,比如使用如下指令將密碼的最大有效期設(shè)置為 99 天:

chage -M 99 admin

2.5 設(shè)置密碼復雜度要求

有兩種方式來設(shè)置密碼復雜度。

一種方式是修改 /etc/login.defs 文件仇轻,這里面幾個比較重要的選項京痢。可以通過修改選項的值來設(shè)置對密碼對要求:

PASS_MAX_DAYS   90  #密碼最長過期天數(shù)
PASS_MIN_DAYS   80  #密碼最小過期天數(shù)
PASS_MIN_LEN    10  #密碼最小長度
PASS_WARN_AGE   7   #密碼過期警告天數(shù)

另外一個方法是篷店,修改 /etc/pam.d/system-auth 文件祭椰。編輯該文件,在下面這行進行配置即可:

password required pam_pwquality.so dcredit=-1 ucredit=-1 ocredit=-1 lcredit=0

配置的可選參數(shù)可以參考 /etc/security/pwquality.conf 文件疲陕。常用的參數(shù)如下:

  1. retry=N:定義登錄/修改密碼失敗時方淤,可以重試的次數(shù);
  2. Difok=N:定義新密碼中必須有幾個字符要與舊密碼不同蹄殃。但是如果新密碼中有1/2以上的字符與舊密碼不同時携茂,該新密碼將被接受;
  3. minlen=N:定義用戶密碼的最小長度诅岩;
  4. dcredit=N:定義用戶密碼中必須包含多少個數(shù)字讳苦;
  5. ucredit=N:定義用戶密碼中必須包含多少個大寫字母;
  6. lcredit=N:定義用戶密碼中必須包含多少個小寫字母吩谦;
  7. ocredit=N:定義用戶密碼中必須包含多少個特殊字符(除數(shù)字鸳谜、字母之外);

2.6 禁止 ping 服務器

禁止 ping 后式廷,不讓別人通過域名 ping 到你的 ip. 禁用后咐扭,你在 ping 自己的域名會給你返回服務商的 IP 并提示超時,這樣你就可以減少 IP 暴露滑废,增加一點安全草描。

實現(xiàn)的方式是:編輯 /etc/sysctl.conf 里面配置,如果沒有添加上下面一行配置:

net.ipv4.icmp_echo_ignore_all=1

然后使用如下命令使配置生效:

sysctl -p

這樣就禁止了對服務器的 ping 操作策严。如果要解除穗慕,只需要將上面的 1 換成 0 即可。

配置完畢之后在本地的命令行里輸入 ping 你的ip 地址妻导,如果顯示請求超時逛绵,則說明配置成功。

2.7 最重要的倔韭,防止 rm -rf

rm -rf 這個梗想必大家都了解术浪,這節(jié)我們不是要教你如何在服務器上面執(zhí)行該操作,來觀察它帶來的喜劇效果寿酌,而是如何避免該操作帶來的負面影響胰苏。需要注意的地方:下面的操作會使用 source 命令,這個指令也是萬分危險的指令醇疼,必須慎重硕并! 這個指令用來修改類似于 windows 中的環(huán)境變量法焰,假如 source 出現(xiàn)問題,可能會導致幾乎所有的命令都無法使用倔毙,非常危險埃仪。

實現(xiàn)的原理是對 rm 命令進行改寫,將其關(guān)聯(lián)到一個自定義腳本陕赃。首先卵蛉,我們在 ~ 目錄下面一個隱藏的 .trash 文件和 .tools 文件夾,

# 創(chuàng)建 .trash 文件夾
mkdir .trash
# 創(chuàng)建 .tools 文件夾
mkdir .tools
# 檢查創(chuàng)建結(jié)果
ls -al

然后么库,在 .tools 文件夾中創(chuàng)建一個名稱為 remove.sh 的腳本傻丝,編輯其內(nèi)容如下:

#!/bin/sh
trash_dir=~/.trash/`date +%Y%m%d`

if [ ! -d ${trash_dir} ] ;then
    mkdir -p ${trash_dir}
fi

for i in $*
do
    suffix=`date "+%H%M%S"`
    if [ ! -d "${i}" ]&&[ ! -f "${i}" ];then    # 首先判斷是否是合法的文件或者文件夾
        if [[ "${i}" != "-rf" && "${i}" != "-f" ]];then    # 這里對-rf進行處理允睹,因為mv指令后面沒有-rf,-f參數(shù)
            echo "[${i}] do not exist"
        fi
    else
        file_name=`basename $i`   # 取得文件名稱
        mv ${i} ${trash_dir}/${file_name}_${suffix}_${RANDOM}
        echo "[${i}] delete completed"
    fi
done

這里簡單解釋下這個腳本文件的內(nèi)容吧。這個腳本文件按照文件名拼接的規(guī)則,在文件名中增加了日期信息(用來對同名文件進行區(qū)別)机蔗,然后使用 mv 命令將指定對文件夾移動到 ~/.trash 目錄下面。應該注意這里對 -rf 參數(shù)的處理咱枉。之前也看過一些博客的腳本颜懊,沒有對這兩個參數(shù)做處理夷恍,導致 mv 命令無法執(zhí)行侄刽。

然后指黎,我們修改 ~/.bashrc 文件,在末尾追加下面一行代碼州丹。將 rm 命令關(guān)聯(lián)到指定的 Shell 文件:

alias rm='sh ~/.tools/remove.sh'

然后醋安,使用如下命令來使我們對修改生效,

source ~/.bashrc

最后墓毒,在用戶根目錄下面創(chuàng)建文件夾吓揪,并使用 rm -rf 文件夾 指令測試效果。

這里本質(zhì)上是把要刪除的目錄移動到了 .trash 目錄下面所计。然后根據(jù)操作的日期對移除對文件夾進行管理柠辞。這無疑地會導致我們的文件夾越來越大,所以主胧,我們要定期對該文件夾進行刪除叭首。這里,我們使用腳本來實現(xiàn)這個目標讥裤。

這里我們創(chuàng)建一個定時任務來執(zhí)行刪除操作放棒。在 .tools 文件夾下面添加一個腳本文件 clean.sh ,編輯內(nèi)容如下己英。其作用是找到回收站中修改日期大于 3 天的文件间螟,執(zhí)行真正的刪除操作:

#!/bin/sh
trashdir=~/.trash
find ${trashdir} -mtime +3 -exec 'rm' -rf {} \;

然后,我們將該任務添加到 crontab 任務中。

使用 crontab -e 命令進入定時任務編輯界面厢破,在最后面加入

0 3 * * * sh ~/.tools/clean.sh     #每天 3:00 執(zhí)行清理回收站的腳本

使用 service crond restart 重啟 crontab 服務荣瑟,使用 crontab -l 命令如果可以看到剛才添加的那段話,則證明添加成功摩泪。這里使用了一段 cron 表達式笆焰,Linux 的 cron 表達式和 Springboot 中的表達式起始單位有些不同,需要注意下见坑。

另外嚷掠,注意到上文中需要使用 source ~/.bashrc 才能使配置的 bash 文件生效。當用戶重新登錄的時候也必須這么做才能使我們的配置再次生效荞驴。作為程序員不皆,這當然是無法容忍的。于是熊楼,我們可以用下面的方法來解決這個問題霹娄,來讓每次登錄服務器之后我們的配置自動生效,

# 編輯 .profile 文件
vim .profile

# 在文件中增加如下的配置
if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

# 或者直接增加下面的代碼也行鲫骗,不過簡單粗暴了點
source ~/.bashrc

這樣配置之后犬耻,每次啟動重新登錄的時候我們的配置就可以自動生效了。

最后的一個問題执泰,如果用戶目錄下面不存在 .bashrc 或者 .profile 文件枕磁,那么可以從 /etc/skel 文件下面將其拷貝到用戶目錄下面,然后再做上面的配置即可坦胶。

3透典、搭建生產(chǎn)服務器環(huán)境

上面的配置已經(jīng)做到了安全性的基本要求晴楔。下面著手搭建服務器生產(chǎn)環(huán)境顿苇。既然是基于 Java 的生產(chǎn)環(huán)境,那么要求安裝的東西不多税弃,一個必備的 ftp 服務纪岁,一個 JDK 環(huán)境即可。當然则果,正式的話還有數(shù)據(jù)庫 MySQL, Redis幔翰,以及常用的中間件 MQ、ES 等西壮。這里我們先搭建一個基礎(chǔ)的 Java 環(huán)境遗增,能運行起 Springboot 即可,所以 JDK 就夠了款青。

3.1 安裝 ftp 服務

Ftp 還是比較重要的做修,我一般使用 ftp 上傳要發(fā)布的 jar 包。另外,個別軟件的安裝包比較大饰及,而且存在網(wǎng)絡連接問題蔗坯,導致下載速率比較低,因此燎含,有時候會選擇本地下載完成安裝包之后通過 ftp 上傳到服務器再進行安裝宾濒。所以,ftp 是非常重要的一個環(huán)節(jié)屏箍。

先安裝 vsftpd绘梦,

yum install -y vsftpd

安裝之后會生成 /etc/vsftpd//var/ftp/,其中

  1. /etc/vsftpd/ 目錄下面包含四個文件:

    1. ftpusers 指定了哪些用戶不能訪問 ftp 服務
    2. user_list 當 vsftpd 里 userlist_deny=NO 時赴魁,只允許這里的用戶訪問 ftp 服務谚咬;當 vsftpd 里 userlist_deny=YES(默認) 時,不允許這里的用戶 訪問 ftp 服務
    3. vsftpd.conf 是 vsftpd 的核心配置文件
    4. vsftpd_conf_migrate.sh 是 vsftpd 操作的一些變量和設(shè)置腳本
  2. /var/ftp/ 是匿名訪問 ftp 服務器的時候能夠訪問的目錄

使用 vim vsftpd.conf 編輯配置文件尚粘,比較重要的配置項說明:

# 是否允許匿名登錄择卦,默認 YES,為了安全起見郎嫁,我們應該將其關(guān)閉
anonymous_enable=NO
# 是否允許本地賬號(系統(tǒng)賬號)登錄
local_enable=YES
# 是否運行上傳操作秉继,如果要運行上傳那么就要開啟這個配置
write_enable=YES
# 是否以獨立運行的方式監(jiān)聽服務,ftp 服務的運行模式泽铛,NO 時表示 xinetd 模式尚辑;YES 時表示 standlone 模式
listen=NO
# 控制 user_list 的功能,允許 user_list 列表用戶登錄ftp
userlist_enable=YES
# 控制 user_list 的功能盔腔,不允許 user_list 列表用戶登錄ftp
userlist_deny=YES
# 這個指令應該謹慎!!因為當其設(shè)置為 YES 的時候杠茬,雖然可以登錄服務器,但是登錄的 ftp 用戶可以訪問上級目錄
chroot_local_user=NO
# 不受限制的用戶列表弛随,在 vsftpd 目錄下面建立 chroot_list 文件瓢喉,寫入指定的用戶名即可
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES # 這句必須有

其他配置還可以選擇:

# 地址:設(shè)置監(jiān)聽f t p服務的ip地址,默認監(jiān)聽所有IP地址
listen_address=IP
# 設(shè)置監(jiān)聽ftp服務的端口號
listen_port=21
# 允許下載權(quán)限
download_enable=YES
# 用戶切換進入目錄時顯示 “.message”文件(如果已存在)的內(nèi)容
dirmessage_enable=YES
# 啟用xferlog日志舀透,默認記錄到 /var/log/xferlog
xferlog_enable=YES
# ftp日志格式
xferlog_std_format=YES
# 數(shù)據(jù)連接端口號默認20
connect_from_port_20=YES
# 禁止被動模式連接栓票;默認允許被動模式連接
pasv_enable=NO
# 起始端口號
pasv_max_port=21600
# 結(jié)束端口號
pasv_min_port=21700
# 開啟PAM驗證
pam_service_name=vsftpd
# 限制多個客戶端同時連接(0為無限制)
max_clients=0
# 允許相同IP地址訪問ftp連接次數(shù)(0為無限制)
max_per_ip=0
# ftp的訪問控制列表提升安全性使用
tcp_wrappers=YES

配置完成之后就可以使用以下命令開啟服務:

service vsftpd start

另外還需要配置 系統(tǒng)的安全模塊 SELinux:

# Step 1: 打開 SELinux 文件進行編輯:
vim /etc/sysconfig/selinux

# Step 2: 將 SELINUX=1 修改為 disabled

然后,我們需要添加一個獨立的用戶來進行 ftp 訪問愕够,并且限制 ftp 用戶只能進行 ftp 連接走贪,不能進行服務器登錄,不應該將 ftp 用戶和登錄用戶混為一談惑芭,以此來進一步保障服務器的安全性:

# Step 1: 添加用戶坠狡,語法是 useradd [-mMnr][-c <備注>][-d <登入目錄>][-e <有效期限>][-f <緩沖天數(shù)>][-g <群組>][-G <群組>][-s <shell>][-u <uid>][用戶帳號]
# 用戶登錄終端設(shè)為 /sbin/nologin,即使之不能登錄系統(tǒng)遂跟,只能訪問 ftp
useradd ftpuser -d /home/ftpuser -s /sbin/nologin

# Step 2: 修改用戶密碼
passwd ftpuser

# Step 3: 設(shè)置用戶權(quán)限逃沿,/path/you/set 為剛剛設(shè)定的該用戶 ftp 的根目錄
chown -R ftpuser /home/ftpuser

# Step 4: 再到 /etc/vsftpd 目錄下新建(或者修改) chroot_list 文件 并添加允許訪問的用戶

# Step 5: 重啟 ftp 服務
service vsftpd restart

# Step 6: 若出現(xiàn)無法上傳或者讀取目錄情況码荔,設(shè)置之前指定的目錄的讀寫權(quán)限
chmod 777 /home/ftpuser

3.2 連接 ftp 服務器

1. 遠程連接 ftp

在 Mac 上面,可以使用 finder 連接 ftp 服務器感挥,缺點是只能下載不能上傳缩搅。參考文章 《Mac自帶FTP工具用法》 進行連接即可,另外還可以使用 iterm2 連接触幼。iterm2 是 Mac 上的終端神奇硼瓣。其安裝和配置可以參考 《MAC終端神器iterm2——告別黑白》,然后需要在 Mac 上面安裝 ftp置谦,參考 《Mac ftp 命令安裝即使用》堂鲤。至于 Windows 上面,直接使用 Xftp 即可媒峡∥疗埽可以到我的公眾號后臺回復 【服務器連接軟件】 獲取我打包好的軟件。

2. 連接 ftp 服務器的問題

用 xftp 連接提示無法打開谅阿,無法顯示遠程文件夾:選擇 “屬性->選項->將使用被動模式” 選項去掉即可半哟。

3.3 安裝 JDK

需要注意:Java SDK 和 ElasticSearch 等其他的中間件的版本對應關(guān)系,一般來說 JDK 8+ 可以滿足大部分需求签餐。

到官方網(wǎng)站 JDK 官方下載地址 下載 JDK 即可寓涨。在官網(wǎng)下載之前需要先進行用戶登錄,獲取到下載鏈接之后使用 wget 命令進行下載即可:

wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz?AuthParam=1531155951_4e06a4d17c6c1dbfb8440352e19dd2ae

注意下載后綴中包含 AuthParam 參數(shù)氯檐,如果鏈接不包含這個參數(shù)戒良,下載之后可能無法使用。

如果從官網(wǎng)下載速度比較慢冠摄,可以嘗試從華為鏡像下載:華為 JDK 鏡像糯崎。

進行安裝:

# Step 1: 創(chuàng)建安裝目錄
mkdir /usr/local/java/

# Step 2: 解壓至安裝目錄
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/java/

設(shè)置環(huán)境變量:

# Step 1:打開 profile 編輯模式
vim /etc/profile

# Step 2:在 profile 文件末尾追加環(huán)境變量
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# Step 3:使 profile 生效
source /etc/profile

# Step 4:添加軟鏈接
ln -s /usr/local/java/jdk1.8.0_171/bin/java /usr/bin/java

# Step 5: 檢測是否安裝成功
java -version

3.4 搭建 Springboot 環(huán)境

如果僅僅是提供一個下載服務的話,還是比較簡單的河泳,直接使用 Springboot 的 web 和模板引擎構(gòu)建一個 html 頁面沃呢,apk 放到 static 目錄下即可。也有問題需要注意下乔询,即如果這樣簡簡單單地搭建的一個服務是不安全的樟插,因為沒有做限流處理韵洋。而一般我會使用 Redis 做限流竿刁,但是這樣就要介紹如何安裝 Redis 以及 Redis 的各種安全配置等……所以,目前先不做搪缨,當前能夠展示應用詳情食拜,并且能夠給用戶提供下載渠道即可。

4副编、發(fā)布應用

4.1 在服務器中啟動 Springboot 程序

Springboot 應用開發(fā)完畢负甸,直接在項目根目錄執(zhí)行 mvn install 編譯打包即可。打出來的包,通過 ftp 上傳到服務器呻待。

對于 jar 包打月,如果想要在后臺啟動,可以使用如下指令蚕捉,

nohup java -jar target/包名.jar --spring.profiles.active=lt &

也就是使用 nohup 并且末尾追加了一個 &奏篙。如果不使用 nohup 只追加一個 &,也可以后臺啟動迫淹,但是這種方式在 ssh 會話結(jié)束之后程序就會停止秘通。

按照上面 nohup 的啟動方式,會在當前目錄下面生成一個名為 nohup.out 的文件敛熬,終端的內(nèi)容會被寫入到這個文件當中肺稀。使用這種啟動方式的時候終端不會顯示啟動過程,所以我們只能通過獲取 nohup.out 的內(nèi)容來判斷程序是否啟動成功应民。動態(tài)獲取文件的內(nèi)容可以使用指令 tail -f nohup.out 來獲取话原。當然,如果希望將輸出人日志重定向到某個具體的文件或者不輸出日志(重定向到 /dev/null)也是可以的诲锹。比如下面的命令用來將日志重定向到 catalina.out 文件:

nohup java -jar xxx.jar > catalina.out  2>&1 &

查看 Springboot 工程的進程使用如下命令稿静,

ps aux | grep "java -jar" | grep -v "grep"

上述顯示的內(nèi)容中包含了進程的 pid,如果要殺掉某個進程辕狰,直接輸入下面的命令即可:

kill -9 pid

4.2 指定虛擬機啟動參數(shù)

1. 遠程連接虛擬機

首先改备,我們需要遠程連接上我們的應用來觀察虛擬機的狀況。不論是排查線上問題還是項目啟動之前虛擬機參數(shù)調(diào)整蔓倍,這個都比較重要悬钳。常用的連接工具有 jconsole 和 jvisualvm 兩個。讓我們的虛擬機可以被遠程監(jiān)控偶翅,需要我們做小小的配置默勾。

首先,我們需要修改虛擬機遠程連接的密碼聚谁。進入 jre 安裝目錄下面的 management 目錄中母剥,比如我的 jdk1.8.0_181/jre/lib/management。然后形导,復制 jmxremote.password.template 并將其重命名為 jmxremote.password环疼,然后注釋掉最后兩行的注釋,這里的 monitorRole 就是默認的遠程連接的登錄賬號朵耕,緊隨其后的就是登錄密碼炫隶。需要把默認的密碼修改掉,增加服務器的安全性阎曹。

然后伪阶,我們需要在項目的啟動參數(shù)中增加幾個參數(shù)來配置并啟用遠程連接煞檩,比如我的設(shè)置了之后的參數(shù)如下:

nohup java -jar -Djava.rmi.server.hostname=23.123.122.31 -Dcom.sun.management.jmxremote.port=11162 -Dcom.sun.management.jmxremote.rmi.port=11163 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true $portal_app_jar > portal.out 2>&1 &

這里我們的參數(shù)配置及其含義如下:

  1. java.rmi.server.hostname:遠程連接的時候的 ip,就是你的服務器的真實 ip 地址栅贴;
  2. com.sun.management.jmxremote.port:遠程連接的時候的端口斟湃,不能和應用的端口相同;
  3. com.sun.management.jmxremote.rmi.port:遠程 rmi 連接的時候的端口檐薯,不能和應用的端口相同桐早;
  4. com.sun.management.jmxremote.ssl:是否使用 ssl 連接方式;
  5. com.sun.management.jmxremote.authenticate:是否啟用身份認證功能厨剪,這個應該啟用哄酝,否則就別人不需要輸入密碼就可以直接連接并查看你的虛擬機了。

這樣配置完成之后開發(fā)上面填寫的兩個端口祷膳,然后重新啟動應用陶衅。

本地遠程連接虛擬機的時候使用 jconsole 和 jvisualvm 皆可。這兩個可執(zhí)行文件放在 jdk 的 bin 目錄下面直晨。雙擊打開之后直接連接即可搀军。

2. 應用啟動參數(shù)配置

首先是一些官方的參考資料

常用的參數(shù):

-XX:MetaspaceSize=128m (元空間默認大小)
-XX:MaxMetaspaceSize=128m (元空間最大大辛舱)
-Xms1024m (堆默認大小也是最小的大忻爬谩)
-Xmx1024m (堆最大大小)
-Xmn256m (新生代大行忠)
-Xss256k (棧最大深度大型驮丁)
-XX:SurvivorRatio=8 (新生代分區(qū)比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,這里使用CMS收集器)
-XX:+PrintGCDetails (打印詳細的GC日志)

具體取值多少要根據(jù)自己的應用的類型捕虽、并發(fā)量和服務器環(huán)境綜合分析慨丐,可以結(jié)合上面的一些文檔為自己的程序指定參數(shù)。

4.3 編寫服務器啟動腳本程序

當然了泄私,指定服務器啟動參數(shù)還是比較繁瑣的房揭,所以,通常我們會編寫啟動腳本晌端,然后通過執(zhí)行腳本來啟動和終止程序捅暴。下面是一段參考代碼,

#!/bin/bash
# 程序運行腳本程序
# 作者:王守恒
# 定義要啟動的程序的 Jar 文件斩松,不指定 Jar 文件的版本
app_jar=box.jar

# 腳本文件使用說明
usage() {
echo "|====================================================================="
echo "|                           腳本文件用法說明                         |"
echo "|====================================================================="
echo "|  sh 腳本名稱.sh [start|stop|restart|status] [prev]                 |"
echo "|                                                                    |"
echo "|                               參數(shù)說明                             |"
echo "|                                                                    |"
echo "|  start: 啟動程序                                                   |"
echo "|  stop: 停止程序                                                    |"
echo "|  restart: 重新啟動程序                                             |"
echo "|  status: 程序狀態(tài)                                                  |"
echo "|                                                                    |"
echo "|  prev: 可選參數(shù)伶唯,如果指定該參數(shù),則會將程序的運行日志輸出到指定    |"
echo "|     的文件中惧盹,否則不輸出乳幸,建議項目正式發(fā)布的時候不啟用該選項       |"
echo "|====================================================================="
}

# 程序啟動函數(shù)
# 函數(shù)體內(nèi)使用 $ 獲取的參數(shù)是函數(shù)調(diào)用的時候傳入的參數(shù),
# 而不是整個腳本被調(diào)用的時候傳入的參數(shù)
start() {
  # 運行portal程序
  vm_opt='-XX:NewSize=216m -XX:MaxNewSize=216m -XX:SurvivorRatio=8 -Xms1024m -Xmx2048m -XX:+PrintGCDetails -Djava.rmi.server.hostname=你的ip -Dcom.sun.management.jmxremote.port=你的端口 -Dcom.sun.management.jmxremote.rmi.port=你的端口 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true'
  if [[ $1 == "prev" ]]; then
    # 預覽
    nohup java -jar $vm_opt $app_jar > box.out 2>&1 &
    echo "box[prev] start succeed"
  else
    nohup java -jar $vm_opt $app_jar > /dev/null &
    echo "box app start succeed"
  fi  
}

# 程序停止函數(shù)
stop() {
# 獲取程序的pid并kill之
is_exist $app_jar
if [ $? -eq "0" ]; then
  kill -9 $pid
  echo "Box was killed with pid ${pid}"
else
  echo "Box is NOT running" 
fi
}

# 程序狀態(tài)函數(shù)
status() {
is_exist $app_jar
if [ $? -eq "0" ]; then
  echo "Box is running with pid ${pid}"
else
  echo "Box is NOT running" 
fi
}

# 程序重新啟動函數(shù)
restart() {
  stop $app_jar
  start $app_jar
}

# 判斷指定的進程存不存在
is_exist() {
pid=`ps -ef | grep $1|grep -v grep | awk '{print $2}'`
if [ -z "${pid}" ]; then
  return 1
else
  return 0
fi
}

# 根據(jù)用戶輸入?yún)?shù)選擇執(zhí)行的函數(shù)
case "$1" in
"start")
start $2
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac

# End
# =========================================================================

這里我區(qū)分了預覽和正式環(huán)境钧椰,因為有時候應用啟動之前就因為某些配置錯誤無法啟動粹断,此時如果使用正式環(huán)境的話,日志會按照我們上述的配置被丟掉嫡霞,從而無法配查問題瓶埋。可以通過啟動的時候指定一個 prev 參數(shù)將啟動過程中的日志重定向到當前的目錄下的指定文件中诊沪。這里主要有幾個功能吧:啟動养筒、重啟、判斷是否啟動以及指令說明端姚。

4.4 配置域名

按照上面的配置我們已經(jīng)可以可以使用 ip 地址進行訪問了晕粪,但是我們還是要配置一下域名。這里我使用的是之前的一個子域名渐裸。當然巫湘,除了配置域名之外還要配置一下 CDN,配置了 CDN 之后的訪問邏輯如下:

box.meiyan.tech -> CDN 域名 -> CDN 域名指定的 ip 地址或者 ip 地址加端口號

配置 CDN 比直接使用域名映射到 ip 地址的方式還有一個好處昏鹃,就是在 ping 指定的域名的時候不會直接暴露 ip 地址尚氛,這樣可以阻擋一步分流量攻擊。

總結(jié)

這里介紹了搭建服務器和服務器安全配置相關(guān)的知識洞渤,也涉及到了一些 linux 指令阅嘶,因篇幅的原因,上面僅僅介紹了一部分载迄,更無法詳細進行介紹奈懒。此外,我寫了完整的十幾篇文章宪巨,從基礎(chǔ)的 linux 指令到各種常用的中間件安全配置等詳細的知識磷杏,感興趣的話關(guān)注下吧。這里提到的 移動工具箱 是我最近開發(fā)的一款 Android 工具軟件捏卓,非常實用极祸,其中包含了很多對開發(fā)者非常實用的功能,感興趣可以下載嘗試怠晴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遥金,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒜田,更是在濱河造成了極大的恐慌稿械,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冲粤,死亡現(xiàn)場離奇詭異美莫,居然都是意外死亡页眯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門厢呵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窝撵,“玉大人夭禽,你說我怎么就攤上這事鲫凶』常” “怎么了宛徊?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵耙旦,是天一觀的道長描扯。 經(jīng)常有香客問我映九,道長鳍悠,這世上最難降的妖魔是什么哩都? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任魁兼,我火速辦了婚禮,結(jié)果婚禮上茅逮,老公的妹妹穿的比我還像新娘璃赡。我一直安慰自己,他們只是感情好献雅,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布碉考。 她就那樣靜靜地躺著,像睡著了一般挺身。 火紅的嫁衣襯著肌膚如雪侯谁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天章钾,我揣著相機與錄音墙贱,去河邊找鬼。 笑死贱傀,一個胖子當著我的面吹牛惨撇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播府寒,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼魁衙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了株搔?” 一聲冷哼從身側(cè)響起剖淀,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纤房,沒想到半個月后纵隔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年捌刮,在試婚紗的時候發(fā)現(xiàn)自己被綠了碰煌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡糊啡,死狀恐怖拄查,靈堂內(nèi)的尸體忽然破棺而出吁津,到底是詐尸還是另有隱情棚蓄,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布碍脏,位于F島的核電站梭依,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏典尾。R本人自食惡果不足惜役拴,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钾埂。 院中可真熱鬧河闰,春花似錦、人聲如沸褥紫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽髓考。三九已至部念,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氨菇,已是汗流浹背儡炼。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留查蓉,地道東北人乌询。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像豌研,于是被迫代替她去往敵國和親妹田。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355