本篇為部署背景知識 + 實作筆記,選用的是 AWS EC2 遠端主機、建立 LAMP 環境、資料庫 phpmyadmin 及 Filezilla 上傳網頁
一開始完全沒有頭緒,是先跟著參考資料部署完成以後,才慢慢理解部署的相關名詞。可以先大概看一下,等部署完再回來看會更清楚。
分成部署前的背景知識及部署流程。
部署前的背景知識:
aws 名詞解釋
在 Amazon Web Services(以下簡稱 aws) 裡,所有產品都有自己的名稱,一開始使用會有點疑惑,以下為相關名詞解釋:
1. AWS: Amazon Web Services
亞馬遜雲端服務,網路只是其中一塊,還有跨足運算、儲存、資料庫、分析等等。
2. AMI: Amazon Machine Image
亞馬遜自有的虛擬光碟映像檔,用來創建虛擬機器。
Image: 光碟映像檔,是一種虛擬光碟的概念,可以不需要有實體光碟機,也可以安裝各種軟體。常見的有三種檔案格式:.IMG, .ISO, .BIN。
實際運用:比如說我想要在 mac 電腦上裝 Linux 系統,可以去下載 ubuntu 這個版本,然後把下載的 ISO 檔放入隨身碟中,做一個開機灌系統的隨身碟。
3. Amazon EC2: Amazon Elastic Compute Cloud
亞馬遜自有的虛擬主機,使用者可在裡面運行任何軟體或應用程式。
4. instance: 虛擬主機
解惑時間:EC2 vs instance 差別在哪?
EC2 是主機型號;instance 則是虛擬主機。
可點進去 aws 的 compute 裡面,除了 EC2 以外,還可以選擇 AWS Lambda, AWS Batch 等等。
可以把 EC2, AWS Lambda, AWS Batch 想成是亞馬遜自有的虛擬主機型號,而 instance 是主機總稱。舉個例子,大同電鍋裡面有 A, B, C 三種型號(EC2, AWS Lambda, AWS Batch),但他們都是一種電鍋(instance)。
部署名詞介紹
一、部署軟體包
1. LAMP
一種架站應用程式組合包,會成為主流的原因是開源及普遍性。
Linux: 作業系統,這裡用的是其中一個版本叫 ubuntu。
Apache: Server 伺服器是什麼?有哪些種類?
MySQL: 資料庫管理系統
PHP: 程式語言
2. phpmyadmin
因為 MySQL 是沒有介面的,所以用 phpmyadmin 這套軟體來管理資料庫。
3. Filezilla
一種跨平台的 FTP 檔案傳輸軟體,可以把多個檔案或資料夾上傳至遠端主機。
二、部署中的專有名詞
1. ssh: Secure Shell
一種加密的網路傳輸協議,常用於登入遠端系統中。
2. sudo: substitute user do
是一套在類 Unix 作業系統上的程式,用來執行只有管理員才能做的任務。
一開始叫做 superuser do,後來衍伸為標題的意思,logo 是一個三明治,挺可愛的。
3. apt: Advanced Packaging Tools
在 ubuntu 上面管理軟體的程式,用來安裝/移除/升級套件,類似 npm。
4. tasksel
可以快速安裝 LAMP 環境的一個套件。
5. root: 最高管理員
6. ufw: Uncomplicated Firewall
ubuntu 系統上預設的防火牆套件,主要為了簡化 iptables 的操作。
PS 防火牆什麼時候要開?
通常在環境建置好以後,上傳資料庫跟網頁之前就可以先打開了。
有了這些背景知識以後,我們可以開始部署流程了。
部署流程
由於這篇文章 部署 AWS EC2 遠端主機 + Ubuntu LAMP 環境 + phpmyadmin 已經寫得很清楚了,這裡只紀錄文字版本,並補充一些知識點。
部署大致上有四個重點:設置遠端主機、建立環境、設置資料庫及上傳網頁
以下提到的 IPv4 皆是指 Public IPv4 address
一、設定 AWS EC2 遠端主機
1. 建立帳號登入後台:Amazon Web Services
2. 右上角地區選項:
可選離自己近的;還是美東或美西有一個比較便宜的也行。
假設發現自己主機不見了,有可能是地區選錯了。
3. 啟動虛擬機器,選 EC2:Launch a virtual machine with EC2
4. 進入 Step1 - 6 選項:
Step 1: Choose an Amazon Machine Image (AMI)
選最新版的 ubuntu
Step 2: Choose an Instance Type
選 Free tier eligible 那一個,接下來可以一路按 Next 到 Step 6 停下來
Instance Type: 不同主機的等級
Step 3: Configure Instance Details
這一頁基本上都是網路相關的設定,可以不用改動
Step 4: Add Storage: 主機硬碟大小,預設 8G
Step 5: Add Tags:方便管理主機,但用不到不用管
Step 6: Configure Security Group
aws 上面防火牆的規則;可以用 ssh 指令連到主機,source 是指「允許什麼 ip 連線」;0.0.0.0/0 -> 允許所有 ip 都可以連得到;
除了預設的 ssh,可以新增 HTTP/HTTPS/MySQL(port 3306) 這些規則
選好以後按 review and launch,確認沒問題以後就可以 launch
Step 7: Review Instance Launch: 下載 private key file 到電腦裡 -> launch instance
接著就可以進到自己的主機裡面了,按 connetc 即可連線
把 IPv4 Public IP 記下來,接下來會常用到它
二、進入遠端主機
遠端主機只能到 terminal 用 CLI 指令操作
1. 用 ssh 這個安全協議,連線到遠端伺服器
$ ssh -i ~/path/key.pem ubuntu@IPv4
tips: 可以直接把 key.pem 拖進 terminal 會自動生成路徑
2. 進入遠端主機
如果發現你的 terminal 變成 ubuntu@IPv4:~$
就表示成功連進去了
實用指令:top,會出現你遠端主機所有的資訊;按 q 可離開
三、設定 Ubuntu LAMP 環境
1. 更新 ubuntu 的系統
$ sudo apt update && sudo apt upgrade && sudo apt dist-upgrade
sudo: 用管理員的身份來執行
apt: 在 ubuntu 上面管理軟體的程式;類似 npm update
2. 用 apt 來安裝 tasksel
$ sudo apt install tasksel
tasksel 是一個可以快速安裝 dns server、lamp,等等應用的軟體包
3. 用 tasksel 安裝 lamp-server
$ sudo tasksel install lamp-server
4. 測試 server 有沒有裝好
把 IPv4 貼到瀏覽器上面,有出現 'Apache2 ubuntu default page' 代表成功了
三、安裝 phpmyadmin 在遠端主機裡
1. 安裝 phpmyadmin:
$ sudo apt install phpmyadmin
2. Configuring phpmyadmin:
這裡用按空白鍵的方式,選擇 apache2
3. 設定 phpmyadmin 管理員密碼
在這裡設的密碼,是「管理 phpmyadmin」用的,也就是說裡面的管理員帳號是 phpmyadmin,密碼是這裡設的密碼。
4. 改變 phpmyadmin 登入方式,變成用密碼登入
帳號:root / 密碼:下面接著設定
a. 先用管理員身份登入 mysql: $ sudo mysql -u root mysql
b. 讓 root 可以用密碼登入:$ UPDATE user SET plugin='mysql_native_password' WHERE User='root';
c. 更新權限:$ FLUSH PRIVILEGES;
d. 離開:$ exit
5. 設定 root 密碼
$ sudo mysql_secure_installation
這裡的幾個選項都可選 y,唯獨 'Disallow root login remotely?' 可以選 n (不過我跟著前輩的筆記做,一開始選的是 y)
最後出現 All Done 表示完成了。
6. 登入 MySQL
在瀏覽器輸入:IPv4/phpmyadmin,會看到登入畫面,輸入 root/剛剛設的密碼
PS 如果用 mac,也可以用 Sequel Pro 這套軟體。如果用 Sequel Pro 連線有問題,先登入 phpmyadmin,到「資料庫叫做 phpmyadmin」的權限裡面,把 root 權限 -> 登入資訊 -> 主機選任何主機,改好就可以登入了。
四、設定防火牆
1. 上傳資料或網頁前,先設防火牆
2. 防火牆開了哪些 port
$ sudo ufw status verbose
:,通常預設是沒有開
如果忘記自己設了哪些 port,可以到 aws 左側選單 Network & Security 底下的 Security Groups 裡面看或更改設定
3. IPv6 = yes
$ sudo nano /etc/default/ufw
: 進到設定裡面,確保 IPv6 = yes
4. 先把 aws Security Groups 設定的 port 都打開
$ sudo ufw allow ssh
$ sudo ufw allow 443
$ sudo ufw allow 3306
$ sudo ufw allow 80
$ sudo ufw allow 22
IPv4 與 IPv6 分別有下面幾個 port
HTTPS: 443
HTTP: 80
SSH: 22
MYSQL/Aurora: 3306
5. 啟用防火牆:
更新:老師說遠端主機的防火牆可以不用開,因為 aws 已經有設定了。但可以參考同學筆記裡面 在 AWS 上面部署 LEMP server 寫得很詳細,就把防火牆打開吧,反正開不用錢
$ sudo ufw enable
,會出現:Command may disrupt existing ssh connections. Proceed with operation (y|n)? 選 y
$ sudo ufw status verbose
可以看開了哪些 port
PS 如果還是有防火牆問題,可能是自己電腦端的防火牆設定
【Linux】Ubuntu 防火牆設定 - 使用 ufw 指令
五、確認網頁檔案內容
1. 匯出資料庫檔案,再匯入到遠端 phpmyadmin
2. 確認 php 檔案內容
a. conn.php 裡面:
server_name: localhost
username and password: phpmyadmin 登入那組
b. 記得有用到 url 的都要改
http://IPv4/board/檔名
c. 注意資料庫名稱
六、利用 Filezilla 上傳檔案
1. 修改遠端主機的權限
a. 通常網頁檔案會放在 /var/www/html 裡面,但這時還沒有權限可以修改任何資料
b. 進入www 資料夾:$ cd /var/www
c. 用 $ ls -al
,可以看到權限只有 root,表示只有管理員有改資料夾的權限
d. 把 html 這個資料夾,改成 ubuntu 這個用戶也有權限修改:$ sudo chown ubuntu /var/www/html
chown: change ownership
2. 建立 Filezilla 新站台
Filezilla 設定:
協定:SFTP - SSH File Transfer Protocol
主機:IPv4
登入型式:金鑰檔案
使用者:ubuntu
金鑰檔案:要連接位置
連線以後,把整個資料夾上傳到 /var/www/html 底下,在瀏覽器輸入 IPv4/index.html
就可以看到網頁了。
PS 也可以在 GitHub 開一個 repo 再 clone,但要記得把 conn.php 放到 .gitignore
PS2 假設部署的是靜態網站,那不用 phpmyadmin,直接把檔案放上去就可以了。
3. 把網域指向 ip
我的網域使用的是 gandi, 在區域檔紀錄把 A 改成 Ipv4
A: 把 ip 對應到網域
CNAME: 設定子網域
輸入自己網域,就可以看到網頁了!
如果對於上述不夠清楚的話,在 W14 直播檢討筆記 影片的後段有詳細的部署介紹。
待研究:
SSL Certificate Cloudflare深入介紹
設定子網域
error logs:
這個錯誤訊息我沒有遇到,老師示範怎麼 debug,紀錄一下思路:
主要在於上傳 PHP 檔案,但瀏覽器卻沒有顯示錯誤
- 上傳網頁卻一片空白,出現 500 Internal Server Error
a. google 'php show error on page'
php ini ubuntu lamp
b. 發現顯示錯誤設定應該會在 etc/php7.2/apache2/php.ini 設定檔裡面,更改設定顯示錯誤,若要更改權限:
先到 etc/php7.2/apache2 底下,$ sudo vim php.in
c. 把 display_errors = on
打開
d. 更改任何設定,都要 restart $ sudo service apache2 restart
假設以上方法行不通,可以去 /var/log/apache2/error.log 找錯誤記錄
假設找不到錯誤,試著開別的檔案看看
或者慢慢的一個一個放註解,縮小錯誤範圍