

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AL2 教學課程
<a name="al2-tutorials"></a>

 下列教學課程說明如何使用執行 AL2 的 Amazon EC2 執行個體執行常見任務。如需影片教學課程，請參閱[AWS 教學影片和實驗室](https://www.aws.training/)。

如需 AL2023 說明，請參閱《*Amazon Linux 2023 使用者指南*[》中的教學](https://docs.aws.amazon.com/linux/al2023/ug/tutorials-al2023.html)課程。

**Topics**
+ [教學課程：在 AL2 上安裝 LAMP 伺服器](ec2-lamp-amazon-linux-2.md)
+ [教學課程：在 AL2 上設定 SSL/TLS](SSL-on-amazon-linux-2.md)
+ [教學課程：在 AL2 上託管 WordPress 部落格](hosting-wordpress.md)

# 教學課程：在 AL2 上安裝 LAMP 伺服器
<a name="ec2-lamp-amazon-linux-2"></a>

下列程序可協助您在 AL2 執行個體 （有時稱為 LAMP Web 伺服器或 LAMP 堆疊） 上安裝支援 PHP 和 [MariaDB](https://mariadb.org/about/) （社群開發的 MySQL 分支） 的 Apache Web 伺服器。您可以使用此伺服器託管一個靜態網站或部署一個將資訊讀取和寫入資料庫的動態 PHP 應用程式。

**重要**  
如果您要在不同的發行版 (例如 Ubuntu 或 Red Hat Enterprise Linux) 上設定 LAMP Web 伺服器，本教學不適用於您。對於 AL2023，請參閱[在 AL2023 上安裝 LAMP 伺服器](https://docs.aws.amazon.com//linux/al2023/ug/ec2-lamp-amazon-linux-2023.html)。若為 Ubuntu，請參閱以下 Ubuntu 社群文件：[ApacheMySQLPHP](https://help.ubuntu.com/community/ApacheMySQLPHP)。若是其他發行版，請參閱其特定文件。

**選項：使用自動化完成此教學課程**  
若要使用 AWS Systems Manager 自動化而非下列任務完成本教學課程，請執行 [AWS Docs-InstallALAMPServer-AL2](https://console.aws.amazon.com/systems-manager/automation/execute/AWSDocs-InstallALAMPServer-AL2) Automation 文件。

**Topics**
+ [步驟 1：準備 LAMP 伺服器](#prepare-lamp-server)
+ [步驟 2：測試您的 LAMP 伺服器](#test-lamp-server)
+ [步驟 3：保護資料庫伺服器](#secure-mariadb-lamp-server)
+ [步驟 4：(選用) 安裝 phpMyAdmin](#install-phpmyadmin-lamp-server)
+ [疑難排解](#lamp-troubleshooting)
+ [相關主題](#lamp-more-info)

## 步驟 1：準備 LAMP 伺服器
<a name="prepare-lamp-server"></a>

**先決條件**
+ 本教學課程假設您已使用 AL2 啟動新的執行個體，其公有 DNS 名稱可從網際網路存取。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。您也必須先設定您的安全群組，允許 SSH (連接埠 22)、HTTP (連接埠 80) 和 HTTPS (連接埠 443) 連線。如需這些先決條件的詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[安全群組規則](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)。
+ 下列程序會安裝 AL2 上可用的最新 PHP 版本，目前為 `php8.2`。若您預計不使用此教學所提及的 PHP 應用程式，改使用其他 PHP 應用程式，您應檢查其與 `php8.2` 的相容性。<a name="install_apache-2"></a>

**準備 LAMP 伺服器**

1. [連線到您的執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

1. 為確保所有軟體套件皆為最新版本，請對您的執行個體執行快速軟體更新。本程序可能需費時幾分鐘，但確定您擁有最新的安全更新和錯誤修正至關重要。

   `-y` 選項不要求確認就會安裝更新。如果您要先檢查更新再安裝，則可以略過此選項。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. 安裝 `mariadb10.5` Amazon Linux Extras 儲存庫，以取得 MariaDB 套件的最新版本。

   ```
   [ec2-user ~]$ sudo amazon-linux-extras install mariadb10.5
   ```

   如果出現錯誤，顯示 `sudo: amazon-linux-extras: command not found`，則代表執行個體不是以 Amazon Linux 2 AMI 啟動 (您可能是使用 Amazon Linux AMI)。您可以使用下列命令來檢視您的 Amazon Linux 版本。

   ```
   cat /etc/system-release
   ```

1. 安裝 `php8.2` Amazon Linux Extras 儲存庫，以取得 AL2 的最新版本PHP套件。

   ```
   [ec2-user ~]$ sudo amazon-linux-extras install php8.2
   ```

1. 現在您的執行個體是最新版本，可安裝 Apache Web 伺服器、PHP 和 MariaDB 軟體套件。使用 yum install 命令可以同時安裝多個軟體套件和所有相關的依存項。

   ```
   [ec2-user ~]$ sudo yum install -y httpd
   ```

   您可以使用下列命令來檢視這些套件的目前版本：

   ```
   yum info package_name
   ```

1. 啟動 Apache Web 伺服器。

   ```
   [ec2-user ~]$ sudo systemctl start httpd
   ```

1.  使用 **systemctl** 命令來設定 Apache Web 伺服器在每次系統開機時啟動。

   ```
   [ec2-user ~]$ sudo systemctl enable httpd
   ```

   要確認 **httpd** 已啟用，您可以執行以下命令：

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

1. 如果您尚未這樣做，請新增安全規則以允許對內 HTTP (連接埠 80) 連線到您的執行個體。根據預設，**launch-wizard-*N*** 安全群組在初始化期間已針對您的執行個體設定完畢。該群組包含允許 SSH 連線的規則。

   1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 選取 **Instances (執行個體)** 然後選取您的執行個體。

   1. 在 **Security ( 安全性)** 標籤上，檢視對內規則。您應該會看到下列規則：

      ```
      Port range   Protocol     Source
      22           tcp          0.0.0.0/0
      ```
**警告**  
使用 `0.0.0.0/0` 可讓所有 IPv4 地址使用 SSH 存取您的執行個體。通常在測試環境中短暫進行此作業是沒有問題的，但用在生產環境則不安全。在生產環境中，您應只授權特定 IP 地址或特定範圍的地址存取您的執行個體。

   1. 選擇安全群組的連結。使用[新增規則至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)中的程序，新增具有下列值的新傳入安全規則：
      + **類型**：HTTP
      + **Protocol (通訊協定)**：TCP
      + **Port Range (連接埠範圍)**：80
      + **Source (來源)**：自訂

1. 測試您的 Web 伺服器。在 Web 瀏覽器中，輸入執行個體的公有 DNS 地址 (或公有 IP 地址)。如果 `/var/www/html` 中沒有內容，您應該會看到 Apache 測試頁。您可以使用 Amazon EC2 主控台取得執行個體的公有 DNS (查看 **Public DNS (公有 DNS)** 欄；如果此欄為隱藏，請選擇 **Show/Hide Columns (顯示/隱藏欄)** (齒輪狀圖示) 並選擇 **Public DNS (公有 DNS)**)。

   確認執行個體的安全性群組包含允許連接埠 80 上的 HTTP 流量的規則。如需詳細資訊，請參閱[新增規則至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。
**重要**  
如果您未使用 Amazon Linux，則可能也需要在您的執行個體上設定防火牆以允許這些連線。如需如何設定防火牆的詳細資訊，請參閱針對您特定散發的文件。  
![\[伺服器的測試會顯示 Apache 測試頁面。\]](http://docs.aws.amazon.com/zh_tw/linux/al2/ug/images/apache_test_page_al2_2.4.png)

Apache **httpd** 提供保存在稱為 Apache 文件根目錄中的檔案。Amazon Linux Apache 文件根目錄是 `/var/www/html`，預設情況下由根擁有。

若要允許 `ec2-user` 帳戶操作此目錄中的檔案，您必須修改目錄的所有權和許可。有多種方法可以達成這件任務。在本教學中，您會將 `ec2-user` 新增至 `apache` 群組，以向 `apache` 群組授予 `/var/www` 目錄的所有權，並指派寫入許可。<a name="setting-file-permissions-2"></a>

**設定檔案許可**

1. 將您的使用者 (在此案例中為 `ec2-user`) 新增至 `apache` 群組。

   ```
   [ec2-user ~]$ sudo usermod -a -G apache ec2-user
   ```

1. 登出並重新登入，以取得新的群組並驗證您的成員資格。

   1. 登出 (使用 **exit** 命令或關閉終端機視窗)：

      ```
      [ec2-user ~]$ exit
      ```

   1. 若要在 `apache` 群組中驗證您的會員資格，請重新連線至您的執行個體，然後執行下列命令：

      ```
      [ec2-user ~]$ groups
      ec2-user adm wheel apache systemd-journal
      ```

1. 將 `/var/www` 的群組所有權及其內容變更為 `apache` 群組。

   ```
   [ec2-user ~]$ sudo chown -R ec2-user:apache /var/www
   ```

1. 若要新增群組寫入許可並在將來的子目錄上設定群組 ID，請變更 `/var/www` 及其子目錄的目錄許可。

   ```
   [ec2-user ~]$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. 若要新增群組寫入許可，請以遞迴方式變更 `/var/www` 及其子目錄的檔案許可：

   ```
   [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} \;
   ```

現在，`ec2-user` (以及 `apache` 群組未來的任何成員) 可以新增、刪除和編輯 Apache 文件根目錄中的檔案，所以您可以新增內容 (例如靜態網站或 PHP 應用程式)。

**保護您的 Web 伺服器 (選擇性)**  
執行 HTTP 通訊協定的 Web 伺服器不會為其傳送或接收的資料提供傳輸安全性。當您使用 Web 瀏覽器連線到 HTTP 伺服器時，您前往的 URL、您收到的網頁內容以及您提交的任何 HTML 表單內容 (包括密碼)，網路路徑的任何一處的竊聽者都可以看到。保護您的 Web 伺服器的最佳實務是安裝對 HTTPS (HTTP Secure) 的支援，HTTPS 使用 SSL/TLS 加密保護您的資料。

如需在伺服器上啟用 HTTPS 的相關資訊，請參閱 [教學課程：在 AL2 上設定 SSL/TLS](SSL-on-amazon-linux-2.md)。

## 步驟 2：測試您的 LAMP 伺服器
<a name="test-lamp-server"></a>

如果伺服器已安裝且正在執行，且檔案許可設定正確，則您的 `ec2-user` 帳戶應該能夠在可透過網際網路使用的 `/var/www/html` 目錄中建立 PHP 檔案。

**測試您的 LAMP 伺服器**

1. 在 Apache 文件根資料夾中建立 PHP 檔案。

   ```
   [ec2-user ~]$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
   ```

   如果您嘗試執行此命令時出現拒絕許可錯誤，請嘗試登出並重新登入，以取得您在 [設定檔案許可](#setting-file-permissions-2) 設定的適當群組許可。

1. 在 Web 瀏覽器中，輸入您剛才建立的檔案 URL。此 URL 為您執行個體的公有 DNS 地址，其後跟隨斜線和檔案名稱。例如：

   ```
   http://my.public.dns.amazonaws.com/phpinfo.php
   ```

   您現在應該會看見 PHP 資訊頁面：  
![\[LAMP 伺服器的測試會顯示 PHP 資訊頁面。\]](http://docs.aws.amazon.com/zh_tw/linux/al2/ug/images/phpinfo7.2.10.png)

   如果你未看見此頁面，請確認 `/var/www/html/phpinfo.php` 檔案在前述步驟中正確建立。您也可以使用下列命令來確認已安裝所有必要的套件。

   ```
   [ec2-user ~]$ sudo yum list installed httpd mariadb-server php-mysqlnd
   ```

   如果您的輸出未列出所需之任何套件，請使用 **sudo yum install *package*** 命令來安裝。另請確認在 **amazon-linux-extras** 命令的輸出中已啟用 `php7.2` 和 `lamp-mariadb10.2-php7.2` extras。

1. 刪除 `phpinfo.php` 檔案。雖然這可能是有用的資訊，但基於安全因素，您不應將其廣播至網際網路。

   ```
   [ec2-user ~]$ rm /var/www/html/phpinfo.php
   ```

現在您應擁有功能齊全的 LAMP Web 伺服器。如果您將內容新增至 `/var/www/html` 的文件根目錄，則應該可以在執行個體的公有 DNS 地址檢視該內容。

## 步驟 3：保護資料庫伺服器
<a name="secure-mariadb-lamp-server"></a>

MariaDB 伺服器的預設安裝有幾項非常適合測試和開發的功能，但針對生產伺服器應將其停用或移除。**mysql\$1secure\$1installation** 命令將引導您完成設定根目錄密碼並從安裝中移除不安全功能的程序。即使您不打算使用 MariaDB 伺服器，我們也建議您執行此程序。<a name="securing-maria-db"></a>

**保護 MariaDB 伺服器**

1. 啟動 MariaDB 伺服器。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. 執行 **mysql\$1secure\$1installation**。

   ```
   [ec2-user ~]$ sudo mysql_secure_installation
   ```

   1. 請在系統提示時，輸入根帳戶的密碼。

      1. 輸入目前的根密碼。根據預設，根帳戶並未設定密碼。按 Enter。

      1. 輸入 **Y** 來設定密碼，然後輸入兩次安全密碼。如需建立安全密碼的詳細資訊，請參閱 [https://identitysafe.norton.com/password-generator/](https://identitysafe.norton.com/password-generator/)。請確保此密碼存放於安全處。

         為 MariaDB 設定根密碼僅是確保資料庫安全的最基本措施。在建置或安裝資料庫驅動的應用程式時，通常會為該應用程式建立資料庫服務使用者，並避免使用根帳戶進行資料庫管理以外的任何作業。

   1. 輸入 **Y** 來移除匿名使用者帳戶。

   1. 輸入 **Y** 來停用遠端根登入。

   1. 輸入 **Y** 來移除測試資料庫。

   1. 輸入 **Y** 來載入使用者權限資料表並儲存您的變更。

1. (選用) 如果您不打算立即使用 MariaDB 伺服器，請將其停止。再次需要時，您可以將其重啟。

   ```
   [ec2-user ~]$ sudo systemctl stop mariadb
   ```

1. (選用) 如果您希望 MariaDB 伺服器在每次系統開機時啟動，請輸入下列命令。

   ```
   [ec2-user ~]$ sudo systemctl enable mariadb
   ```

## 步驟 4：(選用) 安裝 phpMyAdmin
<a name="install-phpmyadmin-lamp-server"></a>

[phpMyAdmin](https://www.phpmyadmin.net/) 是一個 Web 型的資料庫管理工具，可用於檢視和編輯 EC2 執行個體上的 MySQL 資料庫。請遵循下列步驟在您的 Amazon Linux 執行個體上安裝並設定 `phpMyAdmin`。

**重要**  
我們不建議使用 `phpMyAdmin` 來存取 LAMP 伺服器，除非您在 Apache 中啟用了 SSL/TLS；否則，您的資料庫管理員密碼和其他資料將透過網際網路不安全傳輸。如需開發人員的安全性建議，請參閱[保護您的 phpMyAdmin 安裝](https://docs.phpmyadmin.net/en/latest/setup.html#securing-your-phpmyadmin-installation)。如需有關在 EC2 執行個體上保護 Web 伺服器的一般資訊，請參閱[教學課程：在 AL2 上設定 SSL/TLS](SSL-on-amazon-linux-2.md)。

**安裝 phpMyAdmin**

1. 安裝所需的依存項目。

   ```
   [ec2-user ~]$ sudo yum install php-mbstring php-xml -y
   ```

1. 重新啟動 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```

1. 重新啟動 `php-fpm`。

   ```
   [ec2-user ~]$ sudo systemctl restart php-fpm
   ```

1. 在 `/var/www/html` 中導覽至 Apache 文件根。

   ```
   [ec2-user ~]$ cd /var/www/html
   ```

1. 從 [https://www.phpmyadmin.net/downloads](https://www.phpmyadmin.net/downloads) 選取最新 phpMyAdmin 版本的來源套件。若要直接將檔案下載到您的執行個體，請複製連結並將其貼入 **wget** 命令，如下所示：

   ```
   [ec2-user html]$ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz
   ```

1. 以下列命令建立 `phpMyAdmin` 資料夾，並將套件擷取至該資料夾中。

   ```
   [ec2-user html]$ mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1
   ```

1. 刪除 *phpMyAdmin-latest-all-languages.tar.gz* tarball。

   ```
   [ec2-user html]$ rm phpMyAdmin-latest-all-languages.tar.gz
   ```

1.  (選用) 如果 MySQL 伺服器未執行，請現在將其啟動。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. 在 Web 瀏覽器中，輸入 phpMyAdmin 安裝的 URL。此 URL 為您執行個體的公有 DNS 地址 (或公有 IP 地址)，其後跟隨斜線和您安裝目錄的檔案名稱。例如：

   ```
   http://my.public.dns.amazonaws.com/phpMyAdmin
   ```

   您現在應該會看見 phpMyAdmin 登入頁面：  
![\[輸入 phpMyAdmin 安裝 URL 的結果是 phpMyAdmin 登入畫面。\]](http://docs.aws.amazon.com/zh_tw/linux/al2/ug/images/phpmyadmin_login.png)

1. 使用您之前建立的 `root` 使用者名稱和 MySQL 根密碼登入至您的 phpMyAdmin 安裝。

   必須先設定您的安裝，才能將其投入使用。我們建議您從手動建立組態檔案開始，如下所示：

   1. 若要從最小的組態檔開始，請使用您最愛的文字編輯器建立新檔案，然後將 `config.sample.inc.php` 的內容複製到其中。

   1. 將該檔案儲存為包含 `config.inc.php` 的 phpMyAdmin 目錄中的 `index.php`。

   1. 如需任何其他設定，請參閱 phpMyAdmin 安裝說明的 [使用安裝指令碼](https://docs.phpmyadmin.net/en/latest/setup.html#using-the-setup-script)一節中有關檔案建立後的說明。

    如需 phpMyAdmin 的資訊，請參閱 [phpMyAdmin User Guide](http://docs.phpmyadmin.net/en/latest/user.html)。

## 疑難排解
<a name="lamp-troubleshooting"></a>

本節提供解決設定新 LAMP 伺服器時可能遇到之常見問題的建議。

### 我無法使用 Web 瀏覽器連線至我的伺服器
<a name="is_apache_on"></a>

請執行下列檢查以查看您的 Apache Web 伺服器是否正在執行且可存取。
+ **Web 伺服器是否正在執行？**

  要確認 **httpd** 已啟用，您可以執行以下命令：

  ```
  [ec2-user ~]$ sudo systemctl is-enabled httpd
  ```

  如果 **httpd** 程序未執行，請重複 [準備 LAMP 伺服器](#install_apache-2)所述的步驟。
+ **防火牆是否設定正確？**

  確認執行個體的安全性群組包含允許連接埠 80 上的 HTTP 流量的規則。如需詳細資訊，請參閱[新增規則至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。

### 我無法使用 HTTPS 連線至我的伺服器
<a name="is-https-enabled"></a>

請執行下列檢查以查看您的 Apache Web 伺服器是否設為支援 HTTPS。
+ **Web 伺服器是否正確設定？**

  安裝 Apache 後，伺服器即針對 HTTP 流量進行設定。若要支援 HTTPS，請在伺服器上啟用 TLS 並安裝 SSL 憑證。如需相關資訊，請參閱[教學課程：在 AL2 上設定 SSL/TLS](SSL-on-amazon-linux-2.md)。
+ **防火牆是否設定正確？**

  確認執行個體的安全性群組包含允許連接埠 443 上的 HTTPS 流量的規則。如需詳細資訊，請參閱[將規則新增至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。

## 相關主題
<a name="lamp-more-info"></a>

如需將檔案傳輸到執行個體或在 Web 伺服器上安裝 WordPress 部落格的詳細資訊，請參閱下列文件：
+ [使用 將檔案傳輸到您的 Linux 執行個體WinSCP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html#Transfer_WinSCP)。
+ [使用 SCP用戶端將檔案傳輸至 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html#linux-file-transfer-scp)。
+ [教學課程：在 AL2 上託管 WordPress 部落格](hosting-wordpress.md)

如需本教學所使用的命令和軟體之詳細資訊，請參閱下列網頁：
+ Apache Web 伺服器：[http://httpd.apache.org/](http://httpd.apache.org/)
+ MariaDB 資料庫伺服器：[https://mariadb.org/](https://mariadb.org/)
+ PHP 程式設計語言：[http://php.net/](http://php.net/)
+ `chmod` 命令：[https://en.wikipedia.org/wiki/Chmod](https://en.wikipedia.org/wiki/Chmod)
+ `chown` 命令：[https://en.wikipedia.org/wiki/Chown](https://en.wikipedia.org/wiki/Chown)

如需為您的 Web 伺服器註冊網域名稱或將現有網域名稱轉移至此主機的詳細資訊，請參閱*Amazon Route 53 開發人員指南*中的[建立和遷移網域和子網域至 Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/creating-migrating.html)。

# 教學課程：在 AL2 上設定 SSL/TLS
<a name="SSL-on-amazon-linux-2"></a>

Secure Sockets Layer/Transport Layer Security (SSL/TLS) 會在 Web 伺服器與 Web 用戶端之間建立加密通路，保護傳輸中的資料以防遭到竊聽。本教學課程說明如何在具有 AL2 和 Apache Web 伺服器的 EC2 執行個體上手動新增 SSL/TLS 支援。本教學假設您未使用負載平衡器。如果您正在使用 Elastic Load Balancing，您可以選擇使用來自 [AWS Certificate Manager](https://aws.amazon.com/certificate-manager/) 的憑證設定負載平衡器上的 SSL 卸載。

基於歷史因素，Web 加密通常僅簡單以 SSL 指稱。雖然 Web 瀏覽器仍然支援 SSL，但其後來的通訊協定 TLS 較不易受攻擊。AL2 預設會停用所有 SSL 版本的伺服器端支援。[安全標準機構](https://www.ssl.com/article/deprecating-early-tls/)認為 TLS 1.0 不安全。TLS 1.0 和 TLS 1.1 已在 2021 年 3 月正式[棄用](https://datatracker.ietf.org/doc/rfc8996/)。本教學課程包含完全基於啟用 TLS 1.2 的指導 TLS 1.3 已於 2018 年完成，只要基礎 TLS 程式庫 （本教學課程中的 OpenSSL) 受到支援並啟用，即可在 AL2 中使用。[用戶端必須在 2023 年 6 月 28 日之前支援 TLS 1.2 或更新版本](https://aws.amazon.com/blogs/security/tls-1-2-required-for-aws-endpoints/)。如需更新之加密標準的詳細資訊，請參閱 [RFC 7568](https://tools.ietf.org/html/rfc7568) 和 [RFC 8446](https://tools.ietf.org/html/rfc8446)。

本教學課程會將現代 Web 加密簡稱為 TLS。

**重要**  
這些程序旨在與 AL2 搭配使用。我們也假設您使用的是全新 Amazon EC2 執行個體。如果您嘗試設定執行不同分佈的 EC2 執行個體，或執行舊版 AL2 的執行個體，本教學中的某些程序可能無法運作。若為 Ubuntu，請參閱以下社群文件：[Open SSL on Ubuntu](https://help.ubuntu.com/community/OpenSSL)。對於 Red Hat Enterprise Linux，請參閱以下：[設定 Apache HTTP Web 伺服器](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/setting-apache-http-server_deploying-different-types-of-servers)。若是其他發行版，請參閱其特定文件。

**注意**  
或者，您可以針對 AWS Nitro enclaves 使用 AWS Certificate Manager (ACM)，這是一個 enclave 應用程式，可讓您將公有和私有 SSL/TLS 憑證與在具有 AWS Nitro Enclaves 的 Amazon EC2 執行個體上執行的 Web 應用程式和伺服器搭配使用。Nitro Enclaves 是 Amazon EC2 功能，可建立隔離運算環境，保護並安全處理高度敏感資料，例如 SSL/TLS 憑證和私有金鑰。  
ACM for Nitro Enclaves 可搭配在您 Amazon EC2 Linux 執行個體上執行的 **nginx**，建立私有金鑰、分配憑證和私有金鑰，以及管理憑證續約。  
若要使用 ACM for Nitro Enclaves，您必須使用啟用飛地的 Linux 執行個體。  
如需詳細資訊，請參閱[什麼是 AWS Nitro Enclaves？](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html) 《[AWS Certificate Manager Nitro Enclaves 使用者指南》中的 和 for](https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html) *AWS Nitro Enclaves*。

**Topics**
+ [先決條件](#ssl_prereq)
+ [步驟 1：在伺服器上啟用 TLS](#ssl_enable)
+ [步驟 2：取得 CA 簽署的憑證](#ssl_certificate)
+ [步驟 3：測試和強化安全組態](#ssl_test)
+ [疑難排解](#troubleshooting)

## 先決條件
<a name="ssl_prereq"></a>

開始本教學之前，請先完成下列步驟：
+ 啟動 Amazon EBS 支援的 AL2 執行個體。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)。
+ 設定安全群組允許執行個體接受下列 TCP 連接埠上的連線：
  + SSH (連接埠 22)
  + HTTP (連接埠 80)
  + HTTPS (連接埠 443)

  如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[安全群組規則](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules.html)。
+ 安裝 Apache Web 伺服器。如需step-by-step說明，請參閱[教學課程：在 AL2 上安裝 LAMP Web 伺服器](ec2-lamp-amazon-linux-2.md)。只需要 httpd 套件和其相依性，因此您可以忽略包含 PHP 和 MariaDB 的說明。
+ 若要識別和驗證網站，TLS 公有金鑰基礎設施 (PKI) 依賴網域名稱系統 (DNS)。若要使用 EC2 執行個體來託管公有網站，您需要註冊 Web 伺服器的網域名稱，或將現有網域名稱傳輸至 Amazon EC2 主機。現有多個第三方網域註冊和 DNS 託管服務可用，或者您可以使用 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)。

## 步驟 1：在伺服器上啟用 TLS
<a name="ssl_enable"></a>

**選項：使用自動化完成此教學課程**  
若要使用 AWS Systems Manager 自動化而非下列任務來完成本教學課程，請執行[自動化文件](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-Configure-SSL-TLS-AL2/)。

此程序會引導您完成使用自我簽署數位憑證在 AL2 上設定 TLS 的程序。

**注意**  
自簽憑證可用於測試環境，而非生產環境。如果您在網際網路公開自簽憑證，來您網站光顧的訪客將會收到安全警告。

**在伺服器上啟用 TLS**

1. [連線至執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)，並確認 Apache 正在執行。

   ```
   [ec2-user ~]$ sudo systemctl is-enabled httpd
   ```

   如果傳回的值不是 "enabled"，請啟動 Apache，並設定為每次系統開機時都啟動。

   ```
   [ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd
   ```

1. 為確保所有軟體套件皆為最新版本，請對您的執行個體執行快速軟體更新。本程序可能需費時幾分鐘，但確定您擁有最新的安全更新和錯誤修正至關重要。
**注意**  
`-y` 選項不要求確認就會安裝更新。如果您要先檢查更新再安裝，則可以省略此選項。

   ```
   [ec2-user ~]$ sudo yum update -y
   ```

1. 現在您的執行個體為最新，請安裝 Apache 模組 `mod_ssl` 來新增 TLS 支援。

   ```
   [ec2-user ~]$ sudo yum install -y mod_ssl
   ```

   您的執行個體現在有下列檔案，供您用來設定安全伺服器和建立用於測試的憑證：
   +  `/etc/httpd/conf.d/ssl.conf` 

     mod\$1ssl 的組態檔案。檔案中包含的*指示詞*會告知 Apache 可在何處找到加密金鑰和憑證、要允許的 TLS 通訊協定版本，以及要接受的加密密碼。
   + `/etc/pki/tls/certs/make-dummy-cert`

     用來為伺服器主機產生自我簽署 X.509 憑證和私有金鑰的指令碼。對於測試 Apache 是否已妥善設定以使用 TLS，本憑證可派上用場。因為不提供身分證明，請勿用在生產環境中。如果用在生產環境中，則會在 Web 瀏覽器中觸發警告。

1. 執行下列指令碼，以產生用於測試的自我簽署虛擬憑證和金鑰。

   ```
   [ec2-user ~]$ cd /etc/pki/tls/certs
   sudo ./make-dummy-cert localhost.crt
   ```

   這會在 `localhost.crt` 目錄中產生新檔案 `/etc/pki/tls/certs/`。指定的檔案名稱符合 **SSLCertificateFile** 中的 `/etc/httpd/conf.d/ssl.conf` 指示詞所指派的預設值。

   此檔案包含自我簽署憑證和憑證的私有金鑰。Apache 規定憑證和金鑰必須是 PEM 格式，此格式由 "BEGIN" 和 "END" 行所框住的 Base64 編碼 ASCII 字元構成，如下方的憑證縮寫範例所示。

   ```
   -----BEGIN PRIVATE KEY-----
   MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD2KKx/8Zk94m1q
   3gQMZF9ZN66Ls19+3tHAgQ5Fpo9KJDhzLjOOCI8u1PTcGmAah5kEitCEc0wzmNeo
   BCl0wYR6G0rGaKtK9Dn7CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vr
   GvwnKoMh3DlK44D9dX7IDua2PlYx5+eroA+1Lqf32ZSaAO0bBIMIYTHigwbHMZoT
   ...
   56tE7THvH7vOEf4/iUOsIrEzaMaJ0mqkmY1A70qQGQKBgBF3H1qNRNHuyMcPODFs
   27hDzPDinrquSEvoZIggkDMlh2irTiipJ/GhkvTpoQlv0fK/VXw8vSgeaBuhwJvS
   LXU9HvYq0U6O4FgD3nAyB9hI0BE13r1HjUvbjT7moH+RhnNz6eqqdscCS09VtRAo
   4QQvAqOa8UheYeoXLdWcHaLP
   -----END PRIVATE KEY-----                    
   
   -----BEGIN CERTIFICATE-----
   MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t
   MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK
   DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV
   bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy
   ...
   z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0
   CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vrGvwnKoMh3DlK44D9dlU3
   WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak
   3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg==
   -----END CERTIFICATE-----
   ```

   檔案名稱和副檔名僅為使用上的方便，不會影響功能。例如，只要 `cert.crt` 檔案中的相關指示詞使用相同的名稱，您就可以呼叫憑證 `cert.pem`、`ssl.conf` 或其他檔案名稱。
**注意**  
當您將預設 TLS 檔案取代為自己的自訂檔案時，請確認自訂檔案為 PEM 格式。

1. 使用偏好的文字編輯器 (例如 **vim** 或 **nano**)，以根使用者身分開啟 `/etc/httpd/conf.d/ssl.conf` 檔案並加入下列註解，因為自我簽署的虛擬憑證也包含此金鑰。如果您沒有加入此列註解就完成下列步驟，Apache 服務會無法開始。

   ```
   SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
   ```

1. 重新啟動 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```
**注意**  
請確定可以在 EC2 執行個體上存取 TCP 連接埠 443，如先前所述。

1. Apache Web 伺服器現在應該支援透過連接埠 443 的 HTTPS (安全 HTTP)。測試方式是將 EC2 執行個體的 IP 地址或完整網域名稱加上字首 **https://** 後，一起輸入到瀏覽器 URL 列。

   因為您要使用自簽的不受信任主機憑證連線至網站，所以瀏覽器可能會顯示一系列的安全警告。請覆寫警告，並繼續前往網站。

   如果預設 Apache 測試頁面開啟，即表示您已於伺服器順利設定 TLS。現在所有在瀏覽器與伺服器之間傳遞的資料皆會加密。
**注意**  
為了避免網站訪客碰到警告畫面，您必須取得 CA 簽署的受信任憑證，其不僅會加密也可將您公開驗證為網站擁有者。

## 步驟 2：取得 CA 簽署的憑證
<a name="ssl_certificate"></a>

您可以使用下列程序取得 CA 簽署的憑證：
+ 從私有金鑰產生憑證簽署請求 (CSR)
+ 將 CSR 提交至憑證授權機構 (CA)
+ 取得簽署的主機憑證
+ 設定 Apache 來使用憑證

在密碼編譯方面，自簽的 TLS X.509 主機憑證與 CA 簽署的憑證完全相同。兩者的差異在於往來的形式，無關數學性質。CA 允諾會至少先驗證網域的所有權，再將憑證發給申請人。每個 Web 瀏覽器皆含有受瀏覽器廠商信任能執行這項操作的 CA 名單。X.509 憑證主要包含對應至私有伺服器金鑰的公有金鑰，以及以密碼編譯方式繫結至公有金鑰的 CA 簽章。瀏覽器透過 HTTPS 連接至 Web 伺服器時，伺服器會呈現憑證給瀏覽器，讓瀏覽器檢查其信任的 CA 名單。如果簽署者位於名單上，或可透過包含其他受信任簽署者的「信任鏈」**存取，瀏覽器會與伺服器協議一快速加密資料通路，並載入頁面。

憑證通常因包含驗證請求的勞力而需耗費成本，因此請貨比三家。一些 CA 免費提供基本層級憑證。這些 CA 當中最值得注意的是 [Let's Encrypt](https://letsencrypt.org/) 專案，此專案也支援自動化憑證建立和續約程序。如需使用 Let's Encrypt 憑證的詳細資訊，請參閱[取得 Certbot](https://eff-certbot.readthedocs.io/en/stable/install.html)。

如果您打算提供商業級服務，[AWS Certificate Manager](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) 會是不錯的選擇。

主機憑證的基礎就是金鑰。自 2019 年起，[政府](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)和[產業](https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.6.5.pdf)團體建議採用最小金鑰 (模數) 大小為 2048 位元的 RSA 金鑰，用以保護文件至 2030 年。AL2 中 OpenSSL 產生的預設模數大小為 2048 位元，適用於 CA 簽署的憑證。對於需要自訂金鑰的人員，例如具有較大模數或使用不同加密演算法的金鑰，以下程序提供選用的步驟。

**重要**  
除非您擁有已註冊和託管的 DNS 網域，否則有關取得 CA 簽署的主機憑證的這些指示將不適用。

**取得 CA 簽署的憑證**

1.  [連線至執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)，並導覽至 /etc/pki/tls/private/。這是存放伺服器的 TLS 私有金鑰的目錄。如果您偏好使用現有主機金鑰來產生 CSR，請跳到步驟 3。

1. (選用) 產生新私有金鑰。以下是金鑰組態的一些範例。任何產生的金鑰皆可用於您的 Web 伺服器，但金鑰所實作的安全程度和類型會不同。
   + **範例 1：**建立預設 RSA 主機金鑰。產生的檔案 **custom.key** 是 2048 位元 RSA 私有金鑰。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key
     ```
   + **範例 2：**建立具有較大模數的較嚴格 RSA 金鑰。產生的檔案 **custom.key** 是 4096 位元 RSA 私有金鑰。

     ```
     [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096
     ```
   + **範例 3：**建立具有密碼保護的 4096 位元加密 RSA 金鑰。產生的檔案 **custom.key** 是以 AES-128 密碼加密的 4096 位元 RSA 私有金鑰。
**重要**  
加密金鑰可提供更好的安全，但因為加密的金鑰需要密碼，所以無法自動啟動與其相依的服務。每次使用此金鑰時，您都必須透過 SSH 連線提供密碼 (在前述範例中為 "abcde12345")。

     ```
     [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096
     ```
   + **範例 4：**使用非 RSA 密碼來加密金鑰。RSA 密碼編譯因為其公有金鑰的大小 (取決於兩個大質數的乘積)，可能相當慢。不過，為 TLS 建立使用非 RSA 密碼的金鑰是有可能的。傳送對等安全層級時，以橢圓曲線數學原理為基礎的金鑰會較小，且運算速度較快。

     ```
     [ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey
     ```

     結果是使用 prime256v1 (OpenSSL 支援的一種「具名曲線」) 的 256 位元橢圓曲線私有金鑰。[根據 NIST](http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf)，其密碼編譯強度略大於 2048 位元 RSA 金鑰。
**注意**  
有別於 RSA 金鑰，並非所有 CA 都能為橢圓曲線型金鑰提供相同層級的支援。

   請確定新的私有金鑰具有高限制的所有權和許可 (擁有者=root、群組=root、僅限擁有者的讀寫權)。命令如下範例所示。

   ```
   [ec2-user ~]$ sudo chown root:root custom.key
   [ec2-user ~]$ sudo chmod 600 custom.key
   [ec2-user ~]$ ls -al custom.key
   ```

   上述命令會產生下列結果。

   ```
   -rw------- root root custom.key
   ```

    在您建立和設定滿意的金鑰之後，即可建立 CSR。

1. 使用偏好的金鑰建立 CSR。以下範例使用 **custom.key**。

   ```
   [ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem
   ```

   OpenSSL 會開啟對話方塊，並提示您輸入下表中顯示的資訊。對於基本的已驗證網域之主機憑證，**Common Name (通用名稱)** 以外的所有欄位皆為選用欄位。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/linux/al2/ug/SSL-on-amazon-linux-2.html)

   最後，OpenSSL 會提示您輸入選用的挑戰密碼。此密碼只會套用至 CSR 以及您與 CA 之間的交易，因此請遵循 CA 對於這個和另一個選用欄位 (選用公司名稱) 的建議。CSR 挑戰密碼不會影響伺服器操作。

   產生的檔案 **csr.pem** 會包含您的公有金鑰、您公有金鑰的數位簽章，以及您輸入的中繼資料。

1. 將 CSR 提交給 CA。這通常包含在文字編輯器開啟 CSR 檔案，以及將內容複製至 Web 表單。此時，系統可能會要求您提供要放在憑證上的一或多個主體別名 (SAN)。如果 **www.example.com** 是通用名稱，則 **example.com** 會是不錯的 SAN，反之亦然。輸入其中任一名稱的網站訪客會看到無錯誤連線。如果您的 CA Web 表單允許這項操作，請在 SAN 清單中包含通用名稱。部分 CA 會自動予以包含。

   在核准您的請求之後，您會收到 CA 所簽署的新主機憑證。系統也可能會指示您下載「中繼憑證」**檔案，其中包含完成 CA 信任鏈所需的其他憑證。
**注意**  
您的 CA 可能會傳送多種格式的檔案給您，以供不同用途所需。在本教學中，您只應該使用 PEM 格式的憑證檔案，而憑證檔案通常 (但不一定) 會標上 `.pem` 或 `.crt` 副檔名。如果您不確定要使用的檔案，請使用文字編輯器開啟檔案，並尋找包含一或多個以下列這一行開頭之區塊的檔案。  

   ```
   - - - - -BEGIN CERTIFICATE - - - - - 
   ```
此檔案的結尾也應該是下列這一行。  

   ```
   - - - -END CERTIFICATE - - - - -
   ```
您也可以在命令列測試檔案，如下所示。  

   ```
   [ec2-user certs]$ openssl x509 -in certificate.crt -text
   ```
確認檔案中出現這幾行。請不要使用結尾為 `.p7b`、`.p7c` 或類似副檔名的檔案。

1. 將新的 CA 簽署憑證和任何中繼憑證放在 `/etc/pki/tls/certs` 目錄中。
**注意**  
有數種方式可以將新的憑證上傳至 EC2 執行個體，但最直接且有益的方式是在本機電腦和執行個體上開啟文字編輯器 (例如，vi、nano 或記事本)，然後在其間複製和貼上檔案內容。對 EC2 執行個體執行這些操作時，您需要有 root [sudo] 許可。因此，您可以立即看到是否有任何許可或路徑問題。不過，請注意不要在複製內容時新增其他行，或以任何方式變更它們。

   從 `/etc/pki/tls/certs`目錄中，檢查檔案擁有權、群組和許可設定是否符合高限制的 AL2 預設值 （擁有者=根、群組=根、僅供擁有者讀取/寫入）。以下範例顯示要使用的命令。

   ```
   [ec2-user certs]$ sudo chown root:root custom.crt
   [ec2-user certs]$ sudo chmod 600 custom.crt
   [ec2-user certs]$ ls -al custom.crt
   ```

   這些命令應該會產生下列結果。

   ```
   -rw------- root root custom.crt
   ```

   中繼憑證檔案的許可較不嚴格 (擁有者=root、群組=root、擁有者可以寫入、群組可以讀取、世界可以讀取)。以下範例顯示要使用的命令。

   ```
   [ec2-user certs]$ sudo chown root:root intermediate.crt
   [ec2-user certs]$ sudo chmod 644 intermediate.crt
   [ec2-user certs]$ ls -al intermediate.crt
   ```

   這些命令應該會產生下列結果。

   ```
   -rw-r--r-- root root intermediate.crt
   ```

1. 將您用來建立 CSR 的私有金鑰放在 `/etc/pki/tls/private/` 目錄中。
**注意**  
有數種方式可以將自訂金鑰上傳至 EC2 執行個體，但最直接且有益的方式是在本機電腦和執行個體上開啟文字編輯器 (例如，vi、nano 或記事本)，然後在其間複製和貼上檔案內容。對 EC2 執行個體執行這些操作時，您需要有 root [sudo] 許可。因此，您可以立即看到是否有任何許可或路徑問題。不過，請注意不要在複製內容時新增其他行，或以任何方式變更它們。

   從 `/etc/pki/tls/private`目錄中，使用下列命令來驗證檔案擁有權、群組和許可設定是否符合高限制的 AL2 預設值 （擁有者=根、群組=根、僅供擁有者讀取/寫入）。

   ```
   [ec2-user private]$ sudo chown root:root custom.key
   [ec2-user private]$ sudo chmod 600 custom.key
   [ec2-user private]$ ls -al custom.key
   ```

   這些命令應該會產生下列結果。

   ```
   -rw------- root root custom.key
   ```

1. 編輯 `/etc/httpd/conf.d/ssl.conf` 以反映新的憑證和金鑰檔案。

   1. 在 Apache 的 `SSLCertificateFile` 指示詞中，提供 CA 簽署主機憑證的路徑和檔案名稱：

      ```
      SSLCertificateFile /etc/pki/tls/certs/custom.crt
      ```

   1. 如果您收到中繼憑證檔案 (在此範例中為 `intermediate.crt`)，請使用 Apache 的 `SSLCACertificateFile` 指示詞提供其路徑和檔案名稱：

      ```
      SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt
      ```
**注意**  
部分 CA 會將主機憑證和中繼憑證結合至單一檔案，讓 `SSLCACertificateFile` 指示詞變得不必要。請參閱 CA 所提供的說明。

   1. 在 Apache 的 `custom.key` 指示詞中，提供私有金鑰 (在此範例中為 `SSLCertificateKeyFile`) 的路徑和檔案名稱：

      ```
      SSLCertificateKeyFile /etc/pki/tls/private/custom.key
      ```

1. 儲存 `/etc/httpd/conf.d/ssl.conf`，並重新啟動 Apache。

   ```
   [ec2-user ~]$ sudo systemctl restart httpd
   ```

1. 在瀏覽器 URL 列輸入網域名稱 (字首為 `https://`)，以測試伺服器。瀏覽器應該會透過 HTTPS 載入測試頁面，而不會產生錯誤。

## 步驟 3：測試和強化安全組態
<a name="ssl_test"></a>

在您的 TLS 運作並向大眾公開之後，您應測試其實際安全程度。這項操作能夠利用線上服務輕鬆完成，例如 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 可免費為您的安全設定執行透徹的分析。根據結果，您可以決定透過控制所接受的通訊協定、偏好的密碼，以及排除的項目，來強化預設安全組態。如需詳細資訊，請參閱 [how Qualys formulates its scores](https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide)。

**重要**  
實際測試對於伺服器安全而言十分重要。微小的組態錯誤可能會導致嚴重安全漏洞和資料遺失。由於建議的安全實務為因應研究與浮現的威脅而持續地變動，所以定期安全稽核是良好伺服器管理的必要項目。

在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 網站上，輸入伺服器的完整網域名稱，格式為 **www.example.com**。約兩分鐘之後，您會收到網站的評等 (從 A 到 F)，以及發現之項目的詳細分析。下表摘要說明網域的報告，其設定與 AL2 上的預設 Apache 組態相同，且具有預設 Certbot 憑證。


|  |  | 
| --- |--- |
| 整體評分 | B | 
| 憑證 | 100% | 
| 通訊協定支援 | 95% | 
| 金鑰交換 | 70% | 
| 密碼強度 | 90% | 

雖然概觀顯示組態大致上很正確，但詳細報告指出幾個潛在問題，這裡依嚴重程度列出：

✗ **支援某些較舊的瀏覽器使用 RC4 加密。**加密是加密演算法的數學核心。用來加密 TLS 資料串流的快速加密 RC4 已知有數個[嚴重缺點](http://www.imperva.com/docs/hii_attacking_ssl_when_using_rc4.pdf)。除非您有絕佳理由來支援舊版瀏覽器，否則應該停用此功能。

✗ **支援舊版 TLS。**此組態支援 TLS 1.0 (已廢除) 和 TLS 1.1 (即將廢除)。自 2018 年起，只建議使用 TLS 1.2。

✗ **不完全支援前向保密。**[前向保密](https://en.wikipedia.org/wiki/Forward_secrecy)是使用衍生自私有金鑰之暫時 (短暫) 工作階段金鑰來加密的演算法的一項功能。這表示攻擊者實際上無法解密 HTTPS 資料，即使他們擁有 Web 伺服器的長期私有金鑰也是一樣。

**更正和打造前瞻性的 TLS 組態**

1. 在文字編輯器中開啟組態檔案 `/etc/httpd/conf.d/ssl.conf`，在下一行的開頭輸入 "\$1"，以變更為註解。

   ```
   #SSLProtocol all -SSLv3
   ```

1. 新增下列指示詞：

   ```
   #SSLProtocol all -SSLv3
   SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
   ```

   此指示詞明確停用 SSL 版本 2 和 3，以及 TLS 版本 1.0 和 1.1。對於完全只使用 TLS 1.2 的用戶端，伺服器現在拒絕接受其加密連線。指示詞中的冗長言詞更清楚向讀者表達伺服器的設定用途。
**注意**  
以此種方式停用 TLS 1.0 和 1.1 版，可封鎖小部分的過期 Web 瀏覽器存取您的網站。

**修改允許的加密清單**

1. 在組態檔案 `/etc/httpd/conf.d/ssl.conf` 中，找出含有 **SSLCipherSuite** 指示詞的區段，在現有一行的開頭輸入 "\$1"，以變更為註解。

   ```
   #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
   ```

1. 指定明確的加密套件，並指定加密順序將前向保密列為優先，避免不安全的加密。這裡使用的 `SSLCipherSuite` 指示詞是根據 [Mozilla SSL Configuration Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) 的輸出，此工具可針對您伺服器上執行的特定軟體來量身打造 TLS 組態。首先，根據下列命令的輸出來確定您的 Apache 和 OpenSSL 版本。

   ```
   [ec2-user ~]$ yum list installed | grep httpd
   
   [ec2-user ~]$ yum list installed | grep openssl
   ```

   例如，如果傳回的資訊是 Apache 2.4.34 和 OpenSSL 1.0.2，我們會在產生器中輸入此資訊。如果您選擇 "modern" 相容性模型，則會建立 `SSLCipherSuite` 指示詞來強制實施安全性，但仍適用於大多數瀏覽器。如果您的軟體不支援新式組態，您可以更新軟體或改為選擇 "intermediate" 組態。

   ```
   SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:
   ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
   ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
   ```

   挑選的加密在名稱中包含 *ECDHE* (*Elliptic Curve Diffie-Hellman Ephemeral* 的縮寫)。*ephemeral* 這個字表示前向保密。附帶效果是這些加密不支援 RC4。

   建議您使用明確密碼清單，而不是依賴預設值或是內容不可見的簡潔指示詞。

   將產生的指示詞複製到 `/etc/httpd/conf.d/ssl.conf` 中。
**注意**  
指示詞複製到 `/etc/httpd/conf.d/ssl.conf` 時必須是單行，而且加密名稱之間只有冒號 (沒有空格)，這裡顯示成多行是為了方便閱讀。

1. 最後，移除下列這一行開頭的 "\$1"，以取消註解。

   ```
   #SSLHonorCipherOrder on
   ```

   此指示詞會強制伺服器優先選擇排名較高的加密，包括 (在此案例中) 支援前向保密的加密。開啟此指示詞時，伺服器會先嘗試建立嚴密的安全連線，再備援至具有較低安全的允許密碼。

完成這兩道程序後，請儲存 `/etc/httpd/conf.d/ssl.conf` 的變更，並重新啟動 Apache。

如果您在 [Qualys SSL Labs](https://www.ssllabs.com/ssltest/analyze.html) 上重新測試網域，應該會發現 RC4 漏洞和其他警告已消失，而摘要如下所示。


|  |  | 
| --- |--- |
| 整體評分 | A | 
| 憑證 | 100% | 
| 通訊協定支援 | 100% | 
| 金鑰交換 | 90% | 
| 密碼強度 | 90% | 

每個 OpenSSL 更新都會產生新密碼，並移除舊密碼的支援。將您的 EC2 AL2 執行個體保持在up-to-date、留意來自 [OpenSSL](https://www.openssl.org/) 的安全公告，並留意技術媒體中新安全性漏洞的報告。

## 疑難排解
<a name="troubleshooting"></a>
+ **除非我輸入密碼，否則我的 Apache Web 伺服器不會啟動。**

  如果您已安裝一個加密、密碼受保護的私有伺服器金鑰，這會是預期行為。

  您可以移除金鑰的加密和密碼需求。假設您在預設目錄中有稱為 `custom.key` 的私有加密 RSA 金鑰，且其上的密碼為 **abcde12345**，請於 EC2 執行個體上執行下列命令，以產生此金鑰的未加密版本。

  ```
  [ec2-user ~]$ cd /etc/pki/tls/private/
  [ec2-user private]$ sudo cp custom.key custom.key.bak
  [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt 
  [ec2-user private]$ sudo mv custom.key.nocrypt custom.key
  [ec2-user private]$ sudo chown root:root custom.key
  [ec2-user private]$ sudo chmod 600 custom.key
  [ec2-user private]$ sudo systemctl restart httpd
  ```

  Apache 現在應該會啟動，而且系統不會提示您輸入密碼。
+  **我在執行 sudo yum install -y mod\$1ssl 時收到錯誤。**

  在您安裝 SSL 的必要套件時，可能會看到與下列類似的錯誤。

  ```
  Error: httpd24-tools conflicts with httpd-tools-2.2.34-1.16.amzn1.x86_64
  Error: httpd24 conflicts with httpd-2.2.34-1.16.amzn1.x86_64
  ```

  這通常表示您的 EC2 執行個體未執行 AL2。本教學課程僅支援從官方 AL2 AMI 新建立的執行個體。

# 教學課程：在 AL2 上託管 WordPress 部落格
<a name="hosting-wordpress"></a>

下列程序可協助您在 AL2 執行個體上安裝、設定和保護 WordPress 部落格。本教學課程正確提供 Amazon EC2 的使用簡介，您可在該執行個體上完全掌控託管 WordPress 部落格的 web 伺服器，其並非一般傳統型的託管服務。

您需負責為伺服器更新軟體套件及維護安全性修補程式。對於不需要與 Web 伺服器組態直接互動的更自動化 WordPress 安裝， CloudFormation 服務提供 WordPress 範本，讓您快速入門。如需詳細資訊，請參閱 *AWS CloudFormation 使用者指南*中的[入門](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)。若您需要具備解偶資料庫的高可用性解決方案，請參閱 *AWS Elastic Beanstalk 開發人員指南*中的[部署高可用性 WordPress 網站](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/php-hawordpress-tutorial.html)。

**重要**  
這些程序旨在與 AL2 搭配使用。如需其他分發的詳細資訊，請參閱其特定文件。本教學課程中的許多步驟不適用於 Ubuntu 執行個體。如需在 Ubuntu 執行個體上安裝 WordPress 的協助，請參閱 Ubuntu 文件中的 [WordPress](https://help.ubuntu.com/community/WordPress)。您也可以使用 [CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-wordpress-launch-instance.html)，在 Amazon Linux、macOS 或 Unix 系統上完成此任務。

**Topics**
+ [先決條件](#hosting-wordpress-prereqs)
+ [安裝 WordPress](#install-wordpress)
+ [後續步驟](#wordpress-next-steps)
+ [說明\$1 我的公有 DNS 名稱曾經變更且現在部落格無法使用](#wordpress-troubleshooting)

## 先決條件
<a name="hosting-wordpress-prereqs"></a>

本教學課程假設您已依照 中的所有步驟，以 PHP 和資料庫 (MySQL 或 MariaDB) 支援的功能性 Web 伺服器啟動 AL2 執行個體[教學課程：在 AL2 上安裝 LAMP 伺服器](ec2-lamp-amazon-linux-2.md)。本教學課程亦提供設定安全群組以允許 `HTTP` 和 `HTTPS` 流量的步驟，還有多個步驟可確保您的 web 伺服器已設定正確的檔案權限。如需將規則新增至安全群組的詳細資訊，請參閱[將規則新增至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule)。

我們強烈建議您將彈性 IP 地址 (EIP) 與您用來託管 WordPress 部落格的執行個體建立關聯。如此可避免您執行個體的公有 DNS 地址變更及損害安裝。如果您擁有網域名稱，而且您想將該網域名稱用於部落格，您可更新網域名稱的 DNS 記錄，使其指向您的 EIP 地址 (如需這類的協助，請聯絡您的網域名稱註冊商)。您可免費將一個 EIP 地址與執行中的執行個體建立關聯。如需詳細資訊，請參閱*《Amazon EC2 使用者指南》*中的[彈性 IP 位址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)。

如果您沒有網域名稱可用於部落格，您可向 Route 53 註冊網域名稱，並將執行個體的 EIP 地址與網域名稱建立關聯。如需詳細資訊，請參閱 *Amazon Route 53 開發人員指南*中的[使用 Amazon Route 53 註冊網域名稱](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html)。

## 安裝 WordPress
<a name="install-wordpress"></a>

**選項：使用自動化完成此教學課程**  
若要使用 AWS Systems Manager 自動化而非下列任務來完成本教學課程，請執行[自動化文件](https://console.aws.amazon.com/systems-manager/documents/AWSDocs-HostingAWordPressBlog/)。

連接至您的執行個體，然後下載 WordPress 安裝套件。

**下載並解壓縮 WordPress 安裝套件**

1. 請用 **wget** 命令下載最新的 WordPress 安裝套件。以下命令將一律下載最新版本。

   ```
   [ec2-user ~]$ wget https://wordpress.org/latest.tar.gz
   ```

1. 解壓縮並解除封存安裝套件。安裝資料夾將解壓縮到名為 `wordpress` 的資料夾。

   ```
   [ec2-user ~]$ tar -xzf latest.tar.gz
   ```<a name="create_user_and_database"></a>

**建立 WordPress 安裝的資料庫使用者和資料庫**

您的 WordPress 安裝需要將資訊存放在資料庫，例如部落格文章和使用者評論。此程序協助您建立部落格的資料庫，以及有權在該資料庫中讀取和儲存資訊的使用者。

1. 啟動資料庫伺服器。
   + 

     ```
     [ec2-user ~]$ sudo systemctl start mariadb
     ```

1. 以 `root` 使用者的身分登入資料庫伺服器。出現提示時，輸入您資料庫的 `root` 密碼；此密碼可能不同於您的 `root` 系統密碼，假如您尚未設定資料庫伺服器的密碼，此密碼可能為空白。

   如果您尚未建立資料庫伺服器的保護機制，請務必這麼做。如需詳細資訊，請參閱 [保護 MariaDB 伺服器](ec2-lamp-amazon-linux-2.md#securing-maria-db)(AL2)。

   ```
   [ec2-user ~]$ mysql -u root -p
   ```

1. <a name="create_database_user"></a>為您的 MySQL 資料庫建立使用者和密碼。您的 WordPress 安裝使用這些值與 MySQL 資料庫通訊。

   務必為使用者建立高強度密碼。請勿在密碼中使用單引號字元 ( ' )，因為這會使上述命令中斷。請勿重複使用現有密碼，並將此密碼存放在安全的地方。

   請輸入下列命令，並換成唯一的使用者名稱與密碼。

   ```
   CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'your_strong_password';
   ```

1. <a name="create_database"></a>建立資料庫。為資料庫提供一個描述性有意義的名稱，例如 `wordpress-db`。
**注意**  
以下命令中資料庫名稱前後的標點符號稱為反引號。標準鍵盤上的反引號 (```) 鍵通常位在 `Tab` 鍵上方。反引號不一定為必要，但反引號可讓您在資料庫名稱中使用其他的非法字元，例如連字號。

   ```
   CREATE DATABASE `wordpress-db`;
   ```

1. 將資料庫完整權限授予先前建立的 WordPress 使用者。

   ```
   GRANT ALL PRIVILEGES ON `wordpress-db`.* TO "wordpress-user"@"localhost";
   ```

1. 排清資料庫權限，以套用所有變更。

   ```
   FLUSH PRIVILEGES;
   ```

1. 離開 `mysql` 用戶端。

   ```
   exit
   ```

**建立及編輯 wp-config.php 檔案**

WordPress 安裝資料夾包含組態檔案範例，其名稱為 `wp-config-sample.php`。在此程序中您將複製該檔案，並依照您的特定組態編輯檔案。

1. 將 `wp-config-sample.php` 檔案複製到稱為 `wp-config.php` 的檔案。此動作將建立一個新的組態檔案，並保留原本的範例檔案做為備份。

   ```
   [ec2-user ~]$ cp wordpress/wp-config-sample.php wordpress/wp-config.php
   ```

1. 用您喜愛的文字編輯器 (例如 `wp-config.php` 或 **nano**) 編輯 **vim** 檔案，並輸入您的安裝值。如果您沒有喜愛的文字編輯器，`nano` 很適合入門者。

   ```
   [ec2-user ~]$ nano wordpress/wp-config.php
   ```

   1. 找出定義 `DB_NAME` 的行，並將 `database_name_here` 變更為您在[Step 4](#create_database)的[建立 WordPress 安裝的資料庫使用者和資料庫](#create_user_and_database)中建立的資料庫名稱。

      ```
      define('DB_NAME', 'wordpress-db');
      ```

   1. 找出定義 `DB_USER` 的行，並將 `username_here` 變更為您在[Step 3](#create_database_user)的[建立 WordPress 安裝的資料庫使用者和資料庫](#create_user_and_database)中建立的資料庫使用者。

      ```
      define('DB_USER', 'wordpress-user');
      ```

   1. 找出定義 `DB_PASSWORD` 的行，並將 `password_here` 變更為您在[Step 3](#create_database_user)的[建立 WordPress 安裝的資料庫使用者和資料庫](#create_user_and_database)中建立的高強度密碼。

      ```
      define('DB_PASSWORD', 'your_strong_password');
      ```

   1. 找出稱為 `Authentication Unique Keys and Salts` 的區段。這些 `KEY` 和 `SALT` 的值會將一層加密提供給 WordPress 使用者存放於本機機器的瀏覽器 Cookie。基本上，於此新增長的隨機值將使您的網站更安全。請前往 [https://api.wordpress.org/secret-key/1.1/salt/](https://api.wordpress.org/secret-key/1.1/salt/) 隨機產生一組金鑰值，您可將其複製並貼入到 `wp-config.php` 檔案內。若要將文字貼入到 PuTTY 終端，請將游標移至想要貼入文字的位置，然後在 PuTTY 終端內按一下滑鼠右鍵。

      如需安全金鑰的詳細資訊，請參閱 [https://wordpress.org/support/article/editing-wp-config-php/\$1security-keys](https://wordpress.org/support/article/editing-wp-config-php/#security-keys)。
**注意**  
下列值僅供範例使用；請勿使用這些值進行安裝。

      ```
      define('AUTH_KEY',         ' #U$$+[RXN8:b^-L 0(WU_+ c+WFkI~c]o]-bHw+)/Aj[wTwSiZ<Qb[mghEXcRh-');
      define('SECURE_AUTH_KEY',  'Zsz._P=l/|y.Lq)XjlkwS1y5NJ76E6EJ.AV0pCKZZB,*~*r ?6OP$eJT@;+(ndLg');
      define('LOGGED_IN_KEY',    'ju}qwre3V*+8f_zOWf?{LlGsQ]Ye@2Jh^,8x>)Y |;(^[Iw]Pi+LG#A4R?7N`YB3');
      define('NONCE_KEY',        'P(g62HeZxEes|LnI^i=H,[XwK9I&[2s|:?0N}VJM%?;v2v]v+;+^9eXUahg@::Cj');
      define('AUTH_SALT',        'C$DpB4Hj[JK:?{ql`sRVa:{:7yShy(9A@5wg+`JJVb1fk%_-Bx*M4(qc[Qg%JT!h');
      define('SECURE_AUTH_SALT', 'd!uRu#}+q#{f$Z?Z9uFPG.${+S{n~1M&%@~gL>U>NV<zpD-@2-Es7Q1O-bp28EKv');
      define('LOGGED_IN_SALT',   ';j{00P*owZf)kVD+FVLn-~ >.|Y%Ug4#I^*LVd9QeZ^&XmK|e(76miC+&W&+^0P/');
      define('NONCE_SALT',       '-97r*V/cgxLmp?Zy4zUU4r99QQ_rGs2LTd%P;|_e1tS)8_B/,.6[=UK<J_y9?JWG');
      ```

   1. 儲存檔案並結束您的文字編輯器。

**將 WordPress 檔案安裝至 Apache 文件根底下**
+ 現在您已解壓縮安裝資料夾、建立 MySQL 資料庫和使用者，並自訂 WordPress 組態檔案，接著您可將安裝檔案複製到 web 伺服器文件根，並執行安裝指令碼以完成安裝。這些檔案的位置取決於您想要在 web 伺服器的實際根 (例如，`my.public.dns.amazonaws.com`) 或根底下之子目錄或資料夾 (例如，`my.public.dns.amazonaws.com/blog`) 下使用 WordPress 部落格。
  + 如果您想讓 WordPress 在文件根下執行，請複製 wordpress 安裝目錄的內容 (非目錄本身)，如下所示：

    ```
    [ec2-user ~]$ cp -r wordpress/* /var/www/html/
    ```
  + 如果您想讓 WordPress 在文件根下的其他目錄下執行，請先建立目錄，然後將檔案複製到目錄中。在此範例中，WordPress 將在 `blog` 目錄中執行：

    ```
    [ec2-user ~]$ mkdir /var/www/html/blog
    [ec2-user ~]$ cp -r wordpress/* /var/www/html/blog/
    ```

**重要**  
基於安全起見，如果您不是要立即移至下一個步驟，現在請先停止 Apache web 伺服器 (`httpd`)。將安裝移到 Apache 文件根底下後，WordPress 安裝指令碼未受保護，攻擊者可能在 Apache web 伺服器執行時存取您的部落格。若要停止 Apache Web 伺服器，輸入命令 **sudo systemctl stop httpd**。如果您要移至下一個步驟，則不需要停止 Apache web 伺服器。

**允許 WordPress 使用永久連結**

WordPress 永久連結需要使用 Apache `.htaccess` 檔案才能正常運作，但此檔案在 Amazon Linux 上並非預設啟用。請使用此程序允許 Apache 文件根下的所有覆寫。

1. 使用您喜愛的文字編輯器 (例如 `httpd.conf` 或 **nano**) 開啟 **vim** 檔案。如果您沒有喜愛的文字編輯器，`nano` 很適合入門者。

   ```
   [ec2-user ~]$ sudo vim /etc/httpd/conf/httpd.conf
   ```

1. 找出開頭為 `<Directory "/var/www/html">` 的區段。

   ```
   <Directory "/var/www/html">
       #
       # Possible values for the Options directive are "None", "All",
       # or any combination of:
       #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
       #
       # Note that "MultiViews" must be named *explicitly* --- "Options All"
       # doesn't give it to you.
       #
       # The Options directive is both complicated and important.  Please see
       # http://httpd.apache.org/docs/2.4/mod/core.html#options
       # for more information.
       #
       Options Indexes FollowSymLinks
   
       #
       # AllowOverride controls what directives may be placed in .htaccess files.
       # It can be "All", "None", or any combination of the keywords:
       #   Options FileInfo AuthConfig Limit
       #
       AllowOverride None
   
       #
       # Controls who can get stuff from this server.
       #
       Require all granted
   </Directory>
   ```

1. 變更上述區段中的 `AllowOverride None` 行，以讀取 `AllowOverride All`。
**注意**  
此檔案中有多個 `AllowOverride` 行；請確定您變更的是 `<Directory "/var/www/html">` 區段中的行。

   ```
   AllowOverride All
   ```

1. 儲存檔案並結束您的文字編輯器。

**在 AL2 上安裝 PHP 圖形繪製程式庫**  
適用於 PHP 的 GD 程式庫可讓您修改影像。如果您需要裁剪部落格的標題映像，請安裝此程式庫。您安裝的 phpMyAdmin 版本可能需要此程式庫的特定最低版本 (例如 7.2 版)。

使用下列命令在 AL2 上安裝 PHP 圖形繪製程式庫。例如，如果您從 amazon-linux-extras 安裝 php7.2 作為安裝 LAMP 堆疊的一部分，則此命令會安裝 PHP 圖形繪製庫的 7.2 版。

```
[ec2-user ~]$ sudo yum install php-gd
```

若要確認已安裝的版本，請使用下列命令：

```
[ec2-user ~]$ sudo yum list installed php-gd
```

下列為範例輸出：

```
php-gd.x86_64                     7.2.30-1.amzn2             @amzn2extra-php7.2
```

**修正 Apache web 伺服器的檔案權限**

WordPress 中可用的部分功能需要 Apache 文件根的寫入存取 (例如透過管理畫面上傳媒體)。如果您尚未這麼做，請套用下列群組成員資格和許可 （如 中所述）[教學課程：在 AL2 上安裝 LAMP 伺服器](ec2-lamp-amazon-linux-2.md)。

1. 將 `/var/www` 及其內容的檔案所有權授予 `apache` 使用者。

   ```
   [ec2-user ~]$ sudo chown -R apache /var/www
   ```

1. 將 `/var/www` 及其內容的群組所有權授予 `apache` 群組。

   ```
   [ec2-user ~]$ sudo chgrp -R apache /var/www
   ```

1. 變更 `/var/www` 及其子目錄的目錄許可，以新增群組寫入許可並設定日後子目錄的群組 ID。

   ```
   [ec2-user ~]$ sudo chmod 2775 /var/www
   [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. 請以遞迴方式變更 `/var/www` 及其子目錄的檔案許可。

   ```
   [ec2-user ~]$ find /var/www -type f -exec sudo chmod 0644 {} \;
   ```
**注意**  
 如果您也想要使用 WordPress 做為 FTP 伺服器，此處您需要更寬鬆的群組設定。請檢視推薦的 [WordPress 中的步驟和安全設定](https://wordpress.org/support/article/changing-file-permissions/)以完成此操作。

1. 重新啟動 Apache web 伺服器，以套用新的群組與許可。
   + 

     ```
     [ec2-user ~]$ sudo systemctl restart httpd
     ```

**使用 AL2 執行 WordPress 安裝指令碼**

現在已就緒可安裝 WordPress。使用的指令取決於作業系統。此程序中的命令適用於 AL2。

1. 使用 **systemctl** 命令，確定每次系統開機時 `httpd` 和資料庫服務都會啟動。

   ```
   [ec2-user ~]$ sudo systemctl enable httpd && sudo systemctl enable mariadb
   ```

1. 確認資料庫伺服器正在執行。

   ```
   [ec2-user ~]$ sudo systemctl status mariadb
   ```

   如果資料庫服務未執行，請啟動服務。

   ```
   [ec2-user ~]$ sudo systemctl start mariadb
   ```

1. 確認 Apache web 伺服器 (`httpd`) 正在執行。

   ```
   [ec2-user ~]$ sudo systemctl status httpd
   ```

   如果 `httpd` 服務未執行，請啟動服務。

   ```
   [ec2-user ~]$ sudo systemctl start httpd
   ```

1. 在網頁瀏覽器中，輸入您 WordPress 部落格的 URL (可能是執行個體的公有 DNS 地址，或是該地址後面加上 `blog` 資料夾)。接著應該會出現 WordPress 安裝指令碼。提供 WordPress 安裝所需的資訊。選擇**安裝 WordPress** 來完成安裝。如需詳細資訊，請參閱 WordPress 網站上的 [Step 5: Run the Install Script (步驟 5：執行安裝指令碼)](https://wordpress.org/support/article/how-to-install-wordpress/#step-5-run-the-install-script)。

## 後續步驟
<a name="wordpress-next-steps"></a>

在完成 WordPress 部落格的測試之後，您可以考慮更新其組態。

**使用自訂的網域名稱**  
如果您有網域名稱與 EC2 執行個體的 EIP 地址相關聯，您可設定部落格使用該名稱，而不是使用 EC2 公有 DNS 地址。如需詳細資訊，請參閱 WordPress 網站上的 [Changing The Site URL (變更網站 URL)](https://wordpress.org/support/article/changing-the-site-url/)。

**設定部落格**  
您可設定部落格使用不同的[主題](https://wordpress.org/themes/)和[外掛程式](https://wordpress.org/plugins/)，為讀者提供更為個人化的使用體驗。但安裝程序有時會出錯，使您失去整個部落格。因此我們強烈建議您為執行個體建立備份的 Amazon Machine Image (AMI)，然後再嘗試安裝任何主題或外掛程式，如此安裝期間發生任何錯誤時便能還原部落格。如需詳細資訊，請參閱[建立您自己的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html#creating-an-ami)。

**增加容量**  
若您的 WordPress 部落格變得十分熱門而需要更多運算能力或儲存空間，請參考下列步驟：
+ 擴展執行個體的儲存空間。如需詳細資訊，請參閱「Amazon EBS 使用者指南」**中的 [Amazon EBS 彈性磁碟區](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modify-volume.html)。
+ 將 MySQL 資料庫移往 [Amazon RDS](https://aws.amazon.com/rds)，善加運用該服務可輕鬆擴展的能力。

**改善網際網路流量的網路效能**  
如果您希望您的部落格能夠提高來自世界各地使用者的流量，請考慮 [AWS Global Accelerator](https://aws.amazon.com/global-accelerator)。Global Accelerator 可改善使用者用戶端裝置與 AWS上執行的 WordPress 應用程式之間的網際網路流量效能，協助您實現較低的延遲。Global Accelerator 使用[AWS 全球網路](https://aws.amazon.com/about-aws/global-infrastructure/global_network/)，將流量導向最接近用戶端的 AWS 區域中運作狀態良好的應用程式端點。

**進一步了解 WordPress**  
如需安裝 WordPress 的詳細資訊，請參閱 [http://codex.wordpress.org/](http://codex.wordpress.org/) 上的 WordPress Codex help documentation。

如需對安裝進行故障診斷的詳細資訊，請參閱[常見安裝問題](https://wordpress.org/support/article/how-to-install-wordpress/#common-installation-problems)。

如需讓 WordPress 部落格更安全的資訊，請參閱[強化 WordPress](https://wordpress.org/support/article/hardening-wordpress/)。

如需有關將 WordPress 部落格保持在up-to-date的資訊，請參閱[更新 WordPress](https://wordpress.org/support/article/updating-wordpress/)。

## 說明\$1 我的公有 DNS 名稱曾經變更且現在部落格無法使用
<a name="wordpress-troubleshooting"></a>

您的 WordPress 安裝會自動設定為使用 EC2 執行個體的公有 DNS 地址。如果您停止並重新啟動執行個體，公有 DNS 地址便會變更 (除非與彈性 IP 地址建立關聯)，而且部落格將無法再使用，因為其參考資源的地址已不存在 (或已指派至其他的 EC2 執行個體)。有關問題和幾個可能解決方案的更詳細描述，請參閱[變更網站 URL](https://wordpress.org/support/article/changing-the-site-url/)。

如果您的 WordPress 安裝發生這種情況，您可以使用以下程序來復原您的部落格，該程序使用 WordPress 的**wp-cli**命令列界面。

**使用 **wp-cli** 變更 WordPress 網站 URL**

1. 使用 SSH 連結至您的 EC2 執行個體。

1. 記下執行個體的舊網站 URL 和新網站 URL。舊網站 URL 可能是安裝 WordPress 時 EC2 執行個體的公有 DNS 名稱。新網站 URL 為 EC2 執行個體目前的公有 DNS 名稱。如果您不確定舊網站的 URL，請用 **curl** 使用下列命令來尋找 URL。

   ```
   [ec2-user ~]$ curl localhost | grep wp-content
   ```

   輸出應該會顯示舊公有 DNS 名稱的參考，其看起來類似 (舊網站的 URL 為紅色)：

   ```
   <script type='text/javascript' src='http://ec2-52-8-139-223.us-west-1.compute.amazonaws.com/wp-content/themes/twentyfifteen/js/functions.js?ver=20150330'></script>
   ```

1. 使用下列命令下載 **wp-cli**。

   ```
   [ec2-user ~]$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
   ```

1. 使用下列命令搜尋並取代 WordPress 安裝中的舊網站 URL。取代 EC2 執行個體的舊網站和新網站 URL，以及 WordPress 安裝的路徑 (通常為 `/var/www/html` 或 `/var/www/html/blog`)。

   ```
   [ec2-user ~]$ php wp-cli.phar search-replace 'old_site_url' 'new_site_url' --path=/path/to/wordpress/installation --skip-columns=guid
   ```

1. 在 web 瀏覽器中輸入 WordPress 部落格的新網站 URL，再次確認網站是否正常運作。如果不是，請參閱[變更網站 URL](https://wordpress.org/support/article/changing-the-site-url/) 和[常見安裝問題](https://wordpress.org/support/article/how-to-install-wordpress/#common-installation-problems)以取得詳細資訊。