在 Linode, GCP 或 Amazon Ec2 上設定 Ubuntu 18.04 時區 帳戶 ufw, fail2ban 和新增 Swap | WordPress

在 Linode, GCP 或 Amazon Ec2 上設定 Ubuntu 18.04 時區 帳戶 ufw, fail2ban 和新增 Swap | Wordpress

完成 Linode、Google Computer Engine 或 Amazon Ec2 的設定之後,接著我們要開始用指令和 FTP 工具來建構我們主機的環境,這是為了讓 WordPress 可以順利的運作,也方便我們後續的操作。

後面雖然主要以指令和文字居多,比較沒有圖形的介面可以操作,但是我會盡量用簡單易懂的方式,讓你可以順利進行。當然我還是會說明這些操作的概念。這些操作時間加總起來,我覺得 5 分鐘可以完成。

操作軟體的介紹

因為我使用 Macbook 來進行操作,所以我將會使用 OSX 內建的終端機,以及另外下載 Filezilla 來完成我們所有的工作。
如果你是 Windows 的使用者,可以考慮「Putty」這個軟體,操作的觀念都是一樣的。

簡單來說,我們需要的工具有:終端機、FTP 連線軟體。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24
wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

Filezilla 可以到這裡下載最新版本,記得要找 Mac 的系統版本。

接著請先看一下我們接下來我們預計要完成的東西,我會打算把執行個體的系統架構做成如下。

1. Ubuntu 18.04 LTS 作業系統
2. Apache 2.4、Nginx 1.14 後端動態和前端靜態
3. Mariadb 10.3 資料庫系統
4. Varnish 6 網站快取
5. Redis 5 資料庫快取

當然也不是一定每個你都要安裝,我也會在過程中跟你說如果做到什麼步驟會出現什麼效果,方便你自己決定要做到什麼程度。

系統為何要採用 Ubuntu 18.04 呢?
第一,這是 LTS 長期支援版本,不用一直更新系統版本,對於系統維護會比較方便。Ubuntu 每半年初一次版本,而長期支援本則是每兩年出一次,而下一版將會是2018 年 4 月出版的 18.04,會支援兩年。
第二,我國中三年一直在使用這個系統,所以對於他的指令操作是比較熟悉的(私心),所以將會以 Ubuntu 作為示範系統,不過如果想要用其他的系統也是可以的,只是設定或操作或稍微改變。

關於 Apache 和 nginx 的功能和角色扮演

Nginx 在最前方處理 SSL、但只單純負責XXX,後台的部分則交給 apache 負責。如果你不使用 SSL(或是不使用 Cloudflare 等類似的服務),可以不用裝 ngnix 也沒有關係。不過如果還是要裝的話,Varnish 和 ngnix 的 port 設定要稍微調整一下。

而可能會有人疑問說,為何不要 Apache 和 Ngnix 擇一使用就好?原因在於 Varnish 目前對於 SSL 連線支援上不完整,因此我們需要把 Ngnix 作為前端負責接收 SSL 的 server,然後再接到 Varnish,而最後面則是由 Apache 作為執行 php 的工具。

順便一提,很多人常常會把 Linux、Apache、MySQL 和 PHP 一起擠稱為「LAMP」;至於 Linux、Nginx、MySQL、PHP 常常被稱作「LEMP」。
不過有人知道 Linux、Apache、Nginx、MySQL、PHP 全部放在一起叫做什麼嗎?我猜是 LANMP,在留言處請告訴我你的答案。

總結來說,Varnish 將會監聽 port 80,而 Apache 將會監聽 port 8080,nginx 監聽 port 443。Apache + MariaDB + PHP 7 是主要的運算處理系統。 Redis server + Redis PHP PECL extension 來快取資料庫的結果。而 Redis 的部分會在本系列文章倒數的部分介紹。

至於伺服器的部分,因為我們採用的是 Linode 的最基礎方案,所以 ping 值還是會有點高,不過以上述的結構架設完之後,網站載入完成的時間可以落在 3 到 5 秒的範圍,甚至更少。

「ping 值」其實就是指「與主機連線的網路速度」。 其單位是毫秒(ms),數值若是越高就代表著連線到你的主機所花的時間會越長,造成資料傳輸的延遲狀況發生。
我發現我一查這個相關的資料,在玩線上遊戲的人會很在乎這個東西。
要怎麼知道你的 ping 值高不高呢?可以打開終端機後,輸入以下指令。

ping [你想要測試的網站]

例如:ping www.google.com.tw
你 ping 出去之後,對方就會給你一個 pong 的回應,藉此來測試速度。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

按下「Control」+「C」就可以停止,會顯示 ping 值的統計結果如標準差、最小時、最大值、平均。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

大致理解以上的概念之後,我們接下來就直接開始進行所有的安裝和設定流程。

重新整體 Ubuntu 的套件庫

STEP 1

打開終端機後,請輸入:

sudo apt-get -qy update
sudo apt-get -qy upgrade
sudo apt -y autoremove

讓 Ubuntu 的安裝套件庫更新到最新。這裡可能要花一點時間進行,所以要稍微等一下下。
接著請安裝 software-properties-common、curl 和 gnupg。

sudo apt-get install software-properties-common curl gnupg -y

會顯示。

…
Hit:4 http://archive.canonical.com/ubuntu bionic InRelease
Hit:5 http://security.ubuntu.com/ubuntu bionic-security InRelease
…
Get:11 https://packagecloud.io/varnishcache/varnish5/ubuntu bionic/main amd64 Packages [3,338 B]
Fetched 65.9 kB in 2s (32.5 kB/s)
Reading package lists...

STEP 2

另外如果是你是使用 Amazon Ec2 的執行個體,Amazon 官方其實不會提供完善的套件庫清單給你(Linode 和 Google 有另外有架設和維護套件庫,這點就還不錯),Amazon 基本上就是保持原汁原味的 Ubuntu 給你,所以要由自己處理的手續會比較多一點。這時可以把套件庫清單換成 Google 或是 Linode 提供的,我已經把清單從這些清單給擷取下來了。

以下的內容就是從 Google 或 Linode 建立的執行個體裡的「/etc/apt/sources.list」檔案裡面的內容。

Google

Linode

Digital Ocean

挑選一個然後將這些內容全部覆蓋到你的「/etc/apt/sources.list」這個檔案裡面。

最簡單的方式是輸入以下指令,但因為資料量有點大,建議先在記事本或是 Sublime Text 裡面先複製貼上好指令。

sudo tee /etc/apt/sources.list <<EOF
[Google 或是 Linode 選擇一個一挑選,取代這整個括號]
EOF

這樣就完成建立檔案。
之後再輸入以下指令,設定 sources.list 的取用權限。

sudo chown -R root:root /etc/apt/sources.list
sudo chmod -R 644 /etc/apt/sources.list

為 Ubuntu 增加套件庫來源

接著,為了後續的安裝順利,這裡我透過官網找到了比較穩定的來源套件庫,是 MariaDB 和 Varnish 的套件庫。
為了安裝最新版的套件,有些是 Ubuntu 官方套件庫所沒有的,需要從官網去搜尋並自行設定套件庫。因此我把所有的加入方式和步驟放在下面供大家直接使用。
接著請在終端機中輸入。

MariaDB 10.3

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64] http://ftp.ubuntu-tw.org/mirror/mariadb/repo/10.3/ubuntu bionic main'

這樣應該會進行下載金鑰的動作,並在套件庫新增 MariaDB 的套件來源。

Executing: /tmp/apt-key-gpghome.USVOjPgEEt/gpg.1.sh --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
gpg: key F1656F24C74CD1D8: 5 signatures not checked due to missing keys
gpg: key F1656F24C74CD1D8: public key "MariaDB Signing Key <signing-key@mariadb.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1

Varnish 6

現在官方網站已經整理出一套自動化的安裝腳本,直接使用腳本設定安裝來源即可。

curl -s https://packagecloud.io/install/repositories/varnishcache/varnish60/script.deb.sh | sudo bash

但如果你要手動安裝也是可以的。

curl -L https://packagecloud.io/varnishcache/varnish60/gpgkey | sudo apt-key add -

這時會先開始下載金鑰,並新增至套件庫當中。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  3954  100  3954    0     0   2497      0  0:00:01  0:00:01 --:--:-- 26360
OK

接著請安裝 apt-transport-https。

sudo apt-get install -y apt-transport-https

最後再套件庫清單裡面增加套件的來源就大功告成了。

echo "deb https://packagecloud.io/varnishcache/varnish60/ubuntu/ bionic main" | sudo tee -a /etc/apt/sources.list.d/varnishcache_varnish60.list
echo "deb-src https://packagecloud.io/varnishcache/varnish60/ubuntu/ bionic main" | sudo tee -a /etc/apt/sources.list.d/varnishcache_varnish60.list

終端機應該會顯示這個。

deb https://packagecloud.io/varnishcache/varnish60/ubuntu/ bionic main
deb-src https://packagecloud.io/varnishcache/varnish60/ubuntu/ bionic main

注意:如果使用非官方的來源的話,會有不穩定的問題,盡量避免使用。或是你可以去該官網找到你國家的伺服器位置,網站資料我都放在文章末端的參考資料區。

Nginx 1.14

在 Ubuntu 18.04 當中,Nginx 的版本已經升級為 1.14,不需要另外在設定套件庫。

但如果想要安裝功能比較多但是可能稍微不穩定的版本,以及新增如「Brotli 模組」等功能,可以到下一個章節的「安裝 Nginx」章節,會教你如何另外使用編譯安裝來達成。

設定伺服器資訊

STEP 1

以下操作用如果用一般的身份無法進行下去,請輸入以下的指令,切換到 root 操作,或是在指令前自己加上 sudo。

sudo su

應該會顯示這個。

root@test:/home/XXX#

STEP 2

接著,如果你已經有申請網域的話,請輸入以下指令,沒有的話可以先不用下這個指令,但是申請好之後請一定要回來操作這兩行指令。

echo "[你的網站網域名稱]" > /etc/hostname
hostname -F /etc/hostname

設定時區和網路校準時間

STEP 1

首先請輸入以下的指令。

sudo dpkg-reconfigure tzdata

STEP 2

先選擇「Asia」。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

先選擇「Taipei」。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

然後會顯示類似的訊息。

Current default time zone: 'Asia/Taipei'
Local time is now:      Thu May 24 11:32:36 CST 2018.
Universal Time is now:  Thu May 24 03:32:36 UTC 2018.

STEP 3

接著安裝校準時間的軟體。
話說這裡有人整理校準時間的伺服器,可以參考一下。

sudo apt-get install ntpdate -y
sudo ntpdate watch.stdtime.gov.tw

然後應該會出現這個訊息。

24 May 11:33:16 ntpdate[3256]: adjust time server 118.163.81.63 offset 0.003201 sec

設定帳號權限

接著這也是一個非常重要的動作,這裡你可以新增你想要的帳戶去管理你所有的檔案。

adduser [你想要新增的帳戶名稱]

先切換到你剛剛新增的帳戶裡面。

sudo su [你剛剛新增的帳戶名稱]

為你的新帳戶設定新密碼。

sudo passwd

終端機上不會顯示你輸入的密碼是什麼,所以要注意不要打錯。

Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

然後把你的帳戶加入 root 權限當中,每當需要權限的指令前面加上「sudo」的時候,就可以有 root 的權限執行。

sudo usermod -a -G sudo [你剛剛新增的帳戶名稱]

編輯 SFTP port 和 ufw 防火牆

接著我們要編輯「sshd_config」這個檔案,需要透過這裡改變 port 的數字。
會這樣做的原因是,我們希望透過改變這個數字,好讓駭客不隨意猜到我們使用的 port 的數字,預設都是 22。

注意:如果是 Amazon Ec2 的執行個體的話,因為 Amazon 的後台無法改變 sftp 的 port,所以請不要編輯。

STEP 1

sudo nano /etc/ssh/sshd_config

把「#Port 22」的「#」拿掉,後面的數字改成你想要的數字,但請牢記。
另外把 PermitRootLogin prohibit-password 或是 PermitRootLogin yes 改成 PermitRootLogin no,以避免 root 帳戶被其他登入,不然就糟了。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

編輯完成之後,按下「Control」+「X」離開,會詢問你要不要儲存「Save modified buffer (ANSWERING “No” WILL DESTROY CHANGES) ? 」,所以按下「Y」。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

接著會問你服寫在哪個檔案上面「File Name to Write: /etc/ssh/sshd_config」,直接按下「Enter」結束這回合。

wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

STEP 2

請輸入以下指令重新啟動 sshd 這個程式讓你設定的數字生效。

sudo systemctl restart sshd.service

如果在這裡更改 port 的話,Google 這邊也要更改 port 的規則。
請到 Google cloud 的「VPC 網路」裡面,點選左邊的「防火牆規則」,然後點右上方的「建立防火牆規則」,點選「default-allow-ssh」,把原本的 port 22 的那個規則改成你剛剛新建的數字,這樣就可以順利透過終端機或是 Filezilla 連線上了。

請參考:
1. https://console.cloud.google.com/networking/firewalls/
wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24
wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24
wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24
wp-ssl-ubuntu-lamp-nginx-varnish-redis-5
作者ヤンヤン編輯於 2018 / 3 / 24

接著我們要安裝防火牆,並且設定防火牆的規則。

要注意這個防火牆的規則和 Google Console 或 Amazon 的規則要有重疊的部分,意思就是說如果你需要開放某些 port 使之可以連線,在執行個體的管理平台如 Google Console 的防火牆設定以及執行個體系統的防火牆設定都要弄好。

STEP 3

請在終端機中輸入以下指令安裝防火牆軟體,不過如果你是使用 Google 的執行個體,基本上他已經安裝好了,可以直接跳下一個步驟。

sudo apt-get install ufw

如果是 Google Computer Engine,預設會幫你安裝。

STEP 4

接著設定防火牆的規則。

sudo ufw default deny incoming && sudo ufw allow http && sudo ufw allow https && sudo ufw allow [你剛剛 sshd port 新建的數字]
sudo ufw allow 21/tcp

應該會顯示這個。

Rules updated
Rules updated (v6)

STEP 5

另外如果你有需要使用 FTP 連線的功能,可以先設定一個範圍的數字,請記住起始和終點的數字,待會兒可以用到。

sudo ufw allow xxxxxx:yyyyyy/tcp

STEP 6

最後關閉 ufw 並再次開啟,重新載入設定。

sudo ufw disable && sudo ufw enable

請輸入「y」確定重新開啟 ufw

Firewall stopped and disabled on system startup
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

安裝並設定 fail2ban

安裝這個主要是為了進行基本的網路攻擊的防禦。但小站台可以不用擔心駭客入侵的問題,因為攻擊你沒有意義也沒有錢拿。

STEP 1

請輸入以下指令安裝 fail2ban 並啟動 fail2ban。

sudo apt-get install fail2ban -y
sudo service fail2ban start
sudo systemctl enable fail2ban

STEP 2

接著我們要設定 fail2ban。根據「mitchellkrogza」作者的「Fail2Ban Blacklist JAIL for Repeat Offenders」,可以透過紀錄檔案動態新增想要 DDOS 的黑名單。雖然本質上 DDOS 攻擊是沒有辦法擋下來,除非購買過濾 DDOS 的主機才有辦法,但至少可以拒絕 DDOS 的請求。

請輸入以下指令安裝。

cd /etc/fail2ban/filter.d
sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/filter.d/blacklist.conf -O blacklist.conf
cd /etc/fail2ban/action.d
sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/action.d/blacklist.conf -O blacklist.conf

STEP 3

接著我們要設定 fail2ban 的設定檔案,讓他可以自動納入記錄檔案來新增黑名單。

首先請先備份 fail2ban 的設定檔案。

sudo cp -f /etc/fail2ban/jail.conf /etc/fail2ban/jail.confbak

之後請輸入以下指令編輯設定檔。

sudo nano /etc/fail2ban/jail.conf

請在檔案最下面新增這些內容。

[blacklist]
enabled = true
logpath  = /var/log/fail2ban.*
filter = blacklist
banaction = blacklist
bantime  = 31536000   ; 1 year
findtime = 31536000   ; 1 year
maxretry = 10

編輯完成後請按「Control」+「X」,按「Y」,再按「Enter」完成編輯。

然後要新增空白的黑名單清單檔案。

sudo touch /etc/fail2ban/ip.blacklist
sudo chmod 755 /etc/fail2ban/ip.blacklist

STEP 4

最後重新啟動 fail2ban

sudo service fail2ban restart

建立 Swap 空間

接著我們就要開始建立一個 Swap 給我們使用,我們會在「/」根目錄上建立 Swap 檔案。

我們要使用「fallocate」來清出一個 3GB 的大的空間,其實它的概念是新增一個 3GB 大的檔案,裡面全部都是「0」。不要注意,此步驟請考量自己電腦的硬碟速度,否則可能電腦很容易當機。

sudo fallocate -l 3G /swapfile

為了讓除了「root」以外的所有的使用者都無法使用此檔案(為了安全),我們必須要改變此檔案的權限設定。

sudo chmod 600 /swapfile

到這裡可以用這個指令查看,這檔案已經建立,權限也已經變成 600 了。
不過到這裡為止還不夠,電腦還不知道這是一個 Swap,我們要下指令把檔案格式化為 Swap 空間。

sudo mkswap /swapfile

應該會顯示類似訊息。

Setting up swapspace version 1, size = 3 GiB (3221221376 bytes)
no label, UUID=c4c62901-5851-478b-b16a-5af8eedcc15d

接著使用此指令啟動 Swap 空間。

sudo swapon /swapfile

接著我們要設定每次系統啟動時,都會自動使用 Swap 空間,輸入以下指令。

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

設定 Swap 使用方式

如果你是使用 Linode,這個步驟可以略過,因為在部署時就先問過你是否要新增 Swap 了。另外關於 Swap 的設定,可以到我寫的這篇文章看比較詳細的說明。

你可以用一些設定去控制多少資料要放到記憶體,多少資料要放到 Swap。
從 0 到 100,表示有多少百分比的資料會從記憶體轉移到 Swap。也就是說,如果數字接近 0,系統會盡量把資料留在記憶體,系統會比較快。如果數字接近 100,這樣系統會把資料盡量轉移到 Swap,系統會變慢。

sudo sysctl vm.swappiness=10

另外,「vfs_cache_pressure」是控制系統記憶體重新快取(Cache pressure)目錄與 inode 檔案的程度,預設是 100,降低數字會減緩重新快取的頻率。

sudo sysctl vm.vfs_cache_pressure=50

但以上都是暫時性的,要在系統檔案裡面寫好永久設定。

sudo echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo echo 'sysctl vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf

下一個章節將會教你關於 Apache2 和 Nginx 的安裝和設定,此章節非常重要,要非常小心的處理。

引用資料區
1. 在Linode上安裝Wordpress (二):主機基本設定,hhliu's blog,2017 / 8 / 27。
2. linux - How to add a security group to a running EC2 Instance? - Server Fault,Stack Exchange,n.d.。
3. How to Install Apache 2.4.x, MariaDB 10.x, and PHP 7.x on Ubuntu 16.04,Vultr,2017 / 3 / 30。
4. Install MariaDB 10.1 on Ubuntu14.04 and 16.04,LinuxBabe,2016 / 3 / 20。
5. varnishcache/varnish60 - Installation · packagecloud
6. How to Install Nginx Latest Version on Ubuntu 16.04 and Ubuntu 16.10
7. Setup Ubuntu 16.04 LTS with Nginx 1.13.8, MariaDB 10.2, PHP-FPM 7.2 (LEMP) – Website for Students
8. Install | NGINX
9. NGINX Docs | Installing NGINX Plus
10. Debian/Ubuntu 環境下自行編譯及安裝 Nginx 網頁伺服器 | PcSetting Blog
11. Centos 7 源码编译安装 Nginx 1.13 - 任我乐
12. How to install a LEMP stack on Ubuntu 18.04 | libre-software.net
13. 308 redirect loop when setting "force-ssl-redirect" to "true"
14. Building NGINX
15. How to uninstall nginx (installed from source)? - Unix & Linux Stack Exchange

關於建立 Swap
16. 
How To Resolve "Out of Memory" Errors on Ubuntu 17.10
17. Linux 的記憶體快取(Cache Memory)功能:Linux 系統把記憶體用光了? - G. T. Wang
18. Ubuntu 16.04 建立 Swap file & 調校 swap  | Mr. 沙先生
19. How To Add Swap Space on Ubuntu 16.04 | DigitalOcean
20. How to Enable Or Add Swap Space on Ubuntu 16.04

關於 Fail2ban 的設定
21. Fail2Ban SSH Nginx Persistent Bans Ubuntu 16.04
22. mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning: A customised jail with action and filter file for Fail2Ban. This jail is based on the recidive jail but makes use of a simple text file to enable extended and permanent bans.
23. mitchellkrogza/fail2ban-useful-scripts: A collection of useful scripts for automation of & easing maintenance of Fail2Ban