- 在 Linode 上建立免費且疾速的 WordPress 網站並使用 Ubuntu 18.04, LAMP, Nginx, Varnish and Redis 加速你的網站 | WordPress
- 手把手教你用 Google Cloud Platform 安裝免費且快速的 WordPress 網站並使用 Ubuntu 18.04, LAMP, Nginx, Varnish 和 Redis 加速你的網站(一年 300 美金的免費額度可以使用) | WordPress
- 用 Gandi 或 Namecheap 購買網域 | WordPress
- 在 Linode, GCP 或 Amazon Ec2 上設定 Ubuntu 18.04 時區 帳戶 ufw, fail2ban 和新增 Swap | WordPress
- 用 Varnish Nginx 和 Apache 製作 HTTP2 反向代理伺服器 | WordPress
- 初次安裝 WordPress 到 VPS 上並設定 MariaDB | WordPress
- 安裝並設定 Redis 讓 WordPress 速度起飛 | WordPress
完成 Linode、Google Computer Engine 或 Amazon Ec2 的設定之後,接著我們要開始用指令和 FTP 工具來建構我們主機的環境,這是為了讓 WordPress 可以順利的運作,也方便我們後續的操作。
後面雖然主要以指令和文字居多,比較沒有圖形的介面可以操作,但是我會盡量用簡單易懂的方式,讓你可以順利進行。當然我還是會說明這些操作的概念。這些操作時間加總起來,我覺得 5 分鐘可以完成。
操作軟體的介紹
因為我使用 Macbook 來進行操作,所以我將會使用 OSX 內建的終端機,以及另外下載 Filezilla 來完成我們所有的工作。
如果你是 Windows 的使用者,可以考慮「Putty」這個軟體,操作的觀念都是一樣的。
簡單來說,我們需要的工具有:終端機、FTP 連線軟體。
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 的回應,藉此來測試速度。
按下「Control」+「C」就可以停止,會顯示 ping 值的統計結果如標準差、最小時、最大值、平均。
大致理解以上的概念之後,我們接下來就直接開始進行所有的安裝和設定流程。
重新整體 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」檔案裡面的內容。
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」。
先選擇「Taipei」。
然後會顯示類似的訊息。
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 帳戶被其他登入,不然就糟了。
編輯完成之後,按下「Control」+「X」離開,會詢問你要不要儲存「Save modified buffer (ANSWERING “No” WILL DESTROY CHANGES) ? 」,所以按下「Y」。
接著會問你服寫在哪個檔案上面「File Name to Write: /etc/ssh/sshd_config」,直接按下「Enter」結束這回合。
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/
接著我們要安裝防火牆,並且設定防火牆的規則。
要注意這個防火牆的規則和 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