部署: AWS EC2 + LAMP + phpmyadmin + Filezilla


Posted by Christy on 2021-09-23

本篇為部署背景知識 + 實作筆記,選用的是 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 這套軟體來管理資料庫。

[Day15] 資料庫 - 介紹與比較

3. Filezilla

一種跨平台的 FTP 檔案傳輸軟體,可以把多個檔案或資料夾上傳至遠端主機。

二、部署中的專有名詞

1. ssh: Secure Shell

一種加密的網路傳輸協議,常用於登入遠端系統中。

[Security] 你該知道所有關於 SSH 的那些事

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 的操作。

ufw:簡易防火牆設置

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 如果還是有防火牆問題,可能是自己電腦端的防火牆設定

如何在Ubuntu 16.04上使用UFW设置防火墙

UFW 防火牆設定軟體操作指南

【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 檔案,但瀏覽器卻沒有顯示錯誤

  1. 上傳網頁卻一片空白,出現 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 找錯誤記錄

假設找不到錯誤,試著開別的檔案看看

或者慢慢的一個一個放註解,縮小錯誤範圍










Related Posts

進階 React Component Patterns 筆記(下)

進階 React Component Patterns 筆記(下)

Node.appendChild() vs. Element.append()

Node.appendChild() vs. Element.append()

DAY3:Jaden Casting Strings

DAY3:Jaden Casting Strings


Comments