在練習這週的網站部署時,主要參考下列幾篇筆記:
- [ 紀錄 ] 部屬 AWS EC2 雲端主機 + LAMP Server + phpMyAdmin
- AWS EC2 佈署網站:卡關記錄 & 心得
- 部署 AWS EC2 遠端主機 + Ubuntu LAMP 環境 + phpmyadmin
部署流程
網站部署大致可分為下列幾個步驟:
- 設定 AWS EC2 主機
- 註冊 AWS 會員
- 架設遠端主機 EC2
- 選擇 Ubuntu Server 並完成設定
- 儲存私鑰後運行主機
- 以 CLI 輸入指令連線主機
- 更新 Ubuntu Server
- 設定 LAMP Server
- 安裝 Tasksel
- 以 Tasksel 套件來安裝 lamp-server
- 設定 phpMyAdmin
- 安裝 phpmyadmin
- 設定使用者密碼
- 修改 MySQL 登入設定
- 設定 MySQL 的 root password
- 設定域名
- 部署寫好的程式到 Server
- 利用 git clone 上傳檔案
- 設定 FileZilla 上傳檔案
設定 AWS EC2 主機
- 註冊 AWS 會員
- 進入 AWS 管理控制台,右上方的選單可以選擇架設主機的地區(離所在地越近主機速度越快,但相對之下價格也會比較貴)
- 啟動虛擬機器 - 使用 EC2
- 選擇主機 Image 方案:找到「Ubuntu Server 18.04 LTS (HVM), SSD Volume Type」並點選 Select
Ubuntu 是基於 Debian 的 Linux 發行版,是個免費開源的作業系統。Ubuntu Server 版是為執行伺服端的應用程式而設計的伺服器版本。
- 選擇主機等級:選有綠色標籤的免費方案,按右下角的 Next,一直到 Step6
- 設定防火牆:也就是允許哪些 IP 連線。點選「Add Rule」新增欄位,共需新增兩個,分別是「HTTP 跟 HTTPS」,後面的資料會自動帶入(例如 port 80 和 port 443)
- 接著點選「Review and Launch」,進入下一步
- 確認設定都沒問題後,點選 Launch
- 再來是選擇私鑰,第一格選擇「Create a new key pair」,第二格輸入私鑰名稱,填好後點選右下角儲存私鑰檔案
- 下載後點選「Launch Instances」啟動設置
- 確認 Server 有在運行,並記下 IPv4 Public IP(公有 IPv4 地址)
- 接著點選上方的「連線」,會進入以下頁面
- 依照說明,在 CLI 輸入下列指令來連線
$ chmod 400 <私鑰檔案路徑>
$ ssh -i "<私鑰檔案路徑>" ubuntu@ec2-< IPv4 位置>.us-east-2.compute.amazonaws.com
實用指令
更新 Ubuntu Server
安裝好 Ubuntu Server 後,需要把更新系統版本到最新,避免遇到安全性漏洞以及程式的 BUG。
CLI 指令如下,其中 apt 是用來管理 ubuntu 軟體的程式(可想像成 npm install
):
$ sudo apt update && sudo apt upgrade && sudo apt dist-upgrade
top
:查看主機即時資訊
會進去下方介面,可查看有哪些 process 在運行、或占用多少 Memory等等。點選 Q 鍵可離開。
exit
:結束連線狀態
輸入 exit
後就會直接登出,回到本地端。
這個指令雖然很基本,自己一開始卻沒有想到,反而還會重開 bash 或等它自動斷線XD
此外,bash 可以同時開啟多個視窗,所以是可以分別對本機和遠端主機下指令的。
設定 LAMP Server
什麼是 LAMP?
LAMP 是 Linux 系統上的開源架站組合,縮寫分別代表:
- L:Linux 作業系統
- A:Apache 網頁伺服器
- M:MySQL 資料庫
- P:PHP 程式語言
LAMP 設定步驟
- 安裝 Tasksel 套件:使用 Tasksel 能快速配置 LAMP 環境
$ sudo apt install tasksel
跳出訊息「安裝會佔用 XX 空間,是否繼續安裝?(Y/n)」,輸入 Y。
- 使用 Tasksel 下載 lamp-server
$ sudo tasksel install lamp-server
會進入紫色的下載畫面:
- 接著確認伺服器是否有成功運行,在瀏覽器輸入剛剛記下伺服器的 IPv4 IP 位置,若看到下方預設網頁就代表安裝成功!
- 也可利用
telnet <IP 位置> <port>
指令,檢視這個埠是否可使用,出現 Connected 就代表成功:
設定 phpmyadmin
phpMyAdmin 是以 PHP 為基礎的資料庫管理工具,讓使用者能夠以 Web 介面管理 MySQL 資料庫。
phpmyadmin 設定步驟
- 安裝 phpmyadmin
$ sudo apt install phpmyadmin
跳出訊息「安裝會佔用 XX 空間,是否繼續安裝?(Y/n)」,輸入 Y。
- 進入紫色畫面,選擇連接的網頁伺服器。用空白鍵選 apache2,再按 Enter 確定
- 是否設定 dbconfig-common?選
<Yes>
此處將會建立一個帳號來管理 phpMyAdmin 運行時用到的資料表,使用者名稱預設為 phpmyadmin,接著要設定這個使用者密碼。
- 設定使用者密碼,輸入完成後按向下鍵選
<OK>
- 再確認一次密碼,輸入完選
<OK>
,即完成設置
修改 MySQL 登入設定
設置完 phpMyAdmin 之後,接著要設定 MySQL 的 root 使用者,建立超級使用者(Superuser)以便在 phpMyAdmin 中進行管理。
也就是說,使用者必須登入後,才能夠實際對資料庫進行增刪改查等動作,並且也可透過 phpMyAdmin 圖形化介面直接操作資料庫。
由於 MySQL 預設使用 auth_socket 的驗證 plugin,使用者可以透過 sudo 直接登入 root 帳號。但這樣就無法透過 phpMyAdmin 登入圖形化介面,因為 phpMyAdmin 預設需要密碼登入。
我們可按照下列步驟來設定 root 密碼:
- 修改 MySQL 登入設定,改成使用密碼登入
$ sudo mysql -u root mysql
- 輸入 mysql 指令,啟用設定密碼
- 讓 root 帳號啟用設定密碼的插件
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
- 輸入指令重新載入特權表
mysql> FLUSH PRIVILEGES;
- 退出 mysql 指令
mysql> exit
- 設定 MySQL 的 root password
$ sudo mysql_secure_installation
- 是否設定密碼?輸入
$ y
,開啟 VALIDATE PASSWORD 插件 - 選擇密碼強度,除非需要非常注重安全性,這裡可輸入 0
選 1 以上要中英文大小寫 + 符號混用 + 一定長度,複雜性較高。
- 設置密碼,需注意這裡輸入密碼不會顯示,確定設置這個密碼嗎?輸入
y
- 以下詢問皆輸入
y
- Remove anonymous users?
- Disallow root login remotely?
- Remove test database and access to it?
- Reload privilege tables now?
- 最後出現 All Done! 代表設置完成
- 接著在瀏覽器輸入
<IPv4 地址>/phpmyadmin
,會看到 phpmyadmin 的登入畫面,輸入帳密確認是否能夠登入
- 帳號:root
- 密碼:
<步驟 6 設定的 root 密碼>
修正 MySQL 錯誤
順利以 root 帳密登入 phpmyadmin 後,會發現有個問題,當我們想查看任一個資料庫的資料表,或是想要執行匯入匯出功能時,會跳出下列錯誤訊息:
Warning in ./libraries/plugin_interface.lib.php#551
count(): Parameter must be an array or an object that implements Countable
原因是在 php 7.2 版本後,count()
在沒有添加參數的情形下,會噴出 Warning 警告訊息。這部分需要我們手動解決。其中有兩個部分需利用 vim 編輯器修改:
vim 指令:編輯完成後,按 esc 再輸入
:wq
即可儲存後退出 vim 編輯器。
- 修改 Warning in ./libraries/plugin_interface.lib.php#551:
$ sudo vim /usr/share/phpmyadmin/libraries/plugin_interface.lib.php
將第 551 行的 count($options) > 0
去掉,修改後如下:
小技巧:可使用 PgDn 按鍵快速往下,不用一行一行往下滑XD
if ($options != null ) {
// …
}
- 修改 Warning in ./libraries/sql.lib.php#613:
$ sudo vim /usr/share/phpmyadmin/libraries/sql.lib.php
將第 613 行修改成換成下列判斷式:
|| ((count($analyzed_sql_results['select_expr']) == 1)
完成以上步驟後,就可以正常操作 phpmyadmin 了!
參考資料:
- Day 03 : 環境架設 part II – MySQL & phpMyAdmin
- 如何安裝Ubuntu Server 18.04來架設伺服器?
- 安裝 LAMP Server + phpMyAdmin 在 Linux 系統上輕鬆架設網站
- 使用Ubuntu Server架設MySQL伺服器,並於PHP程式中存取MySQL資料庫
修改 MySQL 帳號設定
此外,若想要使用 phpmyadmin 以外的圖形化界面操作資料庫(例如:Sequel Pro),可能會有無法連線的問題,因為預設只能從本機登入 MySQL,因此我們需要修改一些設定,步驟如下:
到 phpmyadmin 使用者帳號的介面,點選 root 帳號的「編輯權限」後,會進入編輯權限介面:
點選上方的「登入資訊」,在修改登入的主機名稱,改成任意主機,符號會變成
&
- 回到帳號介面,會發現多了一組 root 帳號如下,這樣就完成設定了!可使用 phpmyadmin 以外的軟體來連到遠端組機
設定域名
- 先在 gandi.net 註冊帳號
- 到電子信箱收驗證信
- 進入域名頁面,輸入想要的網域名稱後,再按購買
- 會跳轉到註冊網域名稱的頁面,下面會有搜尋結果能夠選擇加入購物車
- 填寫購買資訊,同意相關合約
- 再結帳前可在步驟 2 最下方填入優惠代碼
- 購買完成!要記得收取確認信
- 到域名頁面,點選剛剛註冊好的域名
- 點選區域檔記錄,將 A 的值修改成 AWS 主機的 IPv4 地址
- 在瀏覽器輸入
<你的域名>
,如果有出現和先前一樣的 Apache2 Ubuntu 預設頁面,就代表部署成功!
部署寫好的程式到 Server
- 首先確定有連線到 Server,也就是前面提到的這段指令:
$ chmod 400 <私鑰檔案路徑>
$ ssh -i "<私鑰檔案路徑>" ubuntu@ec2-< IPv4 位置>.us-east-2.compute.amazonaws.com
- 輸入
cd ..
兩次,回到根目錄底下 - 輸入
ls
找到 var 資料夾
- 輸入
cd var/www/html
,會進到預設的 apache 首頁所在目錄,也就是我們剛才連到的域名頁面 - 這時若想在該目錄新增檔案,會發現權限不夠
- 這時可以輸入
cd ..
回到/var/www
目錄,再輸入ls -al
可知目前只有 root 帳號有編輯權限:
- 因此我們要透過
chown
指令來修改 ubuntu 帳號的檔案權限:
chown(change owner)
:改變檔案擁有者 = 定義誰擁有文件。chmod(change mode)
:改變檔案的權限 = 定義誰可以做什麽。
$ sudo chown ubuntu /var/www/html
- 修改完成後即可在
var/www/html
目錄新增檔案!這時再以la -al
檢視,會發現變成 ubuntu 擁有權限:
利用 git clone 上傳專案
以上傳 GitHub repository 為例:
- 在 CLI 輸入
git clone <GitHub 專案網址>
- 到瀏覽器輸入
域名/對應路徑/檔案名稱
,確認是否有成功把檔案放上去
FileZilla 設定
除了使用 CLI 操作,我們還可以透過設定 FileZilla,以 key-pairs 登入 AWS EC2 來存取檔案,如此一來即可直接在圖形化界面進行操作。
設定步驟如下:
- 在 FileZilla 新增站台
- 選擇 SFTP 協定
- 主機輸入 AWS 的 IP 位置
- 登入型式選擇「金鑰檔案」,也就是設定主機時的那個
.pem
檔案
- 設定完成後點選連線,會進入
/home/ubuntu
目錄 - 回到根目錄,進到
var/www/html
,會看到 apache 的預設首頁 index.html 檔
- 接著就可以放上寫好的程式
- 在瀏覽器輸入
<網域名稱/路徑>
,確認是否有部署成功
修改 conn.php
如果是部署動態網站,需要連線到遠端資料庫,那就需要修改 conn.php
連線資料庫需要的資料,也就是修改成剛剛設定的 root 帳密:
$server_name = 'localhost';
$username = 'root';
$password = '<root 密碼>';
$db_name = '<資料庫名稱>';
部署心得
終於來到一直很期待的網站部署,想起之前隨意聊就有提過,完成十四週能夠架一個自己的網站,擁有屬於自己的網域,可以帥氣的和朋友分享自己做出的網站了!和助教索取折扣碼的當下,竟然莫名有點感動QQ
發現自己終於走到課程的一半,雖然後面還有一段路要走,但也在過程中體會到,自己很喜歡在寫程式這件事中獲得的成就感。好像有點扯遠了,回到這禮拜的部署心得XD
主要是參考幾位同學的筆記,還有一些網路上的資料,跟著步驟一步步進行部署前的設定。其實筆記中步驟都已經整理得很清楚,自己只是跟隨前人的腳步去操作,也因此少繞了很多遠路,很佩服從零開始摸索的學長姐們,感謝萬分。
但過程中也有遇到一些不懂的部分,還是想要去理解每個步驟的意義是什麼,就花了點時間去查找資料,例如:
- 為什麼選擇用 Ubuntu Server?
Ubuntu Server 是為執行伺服端的應用程式而設計的伺服器版本。簡言之,就是專門用來架設伺服器。
- 為什麼要安裝 Tasksel 套件?
能夠使用 Tasksel 安裝 LAMP,快速配置 LAMP 環境。
- 什麼是 LAMP Server?
是 Linux 系統上的開源架站組合,縮寫代表:Linux + Apache + Mysql + PHP。
- 還有在 phpmyadmin 設定 dbconfig-common 時,會建立一個帳號來管理 phpMyAdmin 運行時用到的資料表,使用者名稱預設為 phpmyadmin。
- 這和之後設定 MySQL 的 root(超級使用者)其實對象不同,一開始有困惑說為什麼要設定兩次密碼,root 這組帳號可用來登入 phpMyAdmin,能夠在圖形化界面管理資料庫。
待解決問題
上傳 Markdown 檔案時,發現中文部分會有亂碼問題,有查到幾個解決方法,但覺得好像在這花有點多時間,決定之後再參來考方法三來解決:
- 安裝 apache-mod-markdown 套件
- Serving markdown from Apache 2.4.7 on Ubuntu:安裝完套件後在第二步卡住,不是很明白要怎麼建立模組?
- 把 markdown 檔案轉成 html 檔
- markdown在ubuntu上的使用
- 安裝 hexo 這個框架,能夠支援 Markdown 語法,感覺這比較符合需求
- Ubuntu 16.04下从零起步搭建配置github.io博客——Hexo
- Hexo+GitHub,新手也可以快速建立部落格