

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

# Amazon EC2 上的 AL2 Amazon EC2
<a name="ec2"></a>

**注意**  
 AL2 不再是 Amazon Linux 的目前版本。AL2023 是 AL2 的後續版本。如需詳細資訊，請參閱《[AL2023 使用者指南》中的比較 AL](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)[2 和 AL2023 ](https://docs.aws.amazon.com/linux/al2023/ug/)[中的套件變更AL2023](https://docs.aws.amazon.com/linux/al2023/release-notes/compare-packages.html)清單。

 

**Topics**
+ [使用 AL2 AMI 啟動 Amazon EC2 執行個體 AL2](#launch-ec2-instance)
+ [使用 Systems Manager 尋找最新的 AL2 AMI](#find-latest-al2-using-systems-manager)
+ [連線至 Amazon EC2 執行個體](#connect-to-amazon-linux-limits-ec2)
+ [AL2 AMI 開機模式](#default-boot-mode-al2)
+ [套件儲存庫](#package-repository)
+ [在 AL2 上使用 cloud-init](amazon-linux-cloud-init.md)
+ [設定 AL2 執行個體](configure-ec2-instance.md)
+ [使用者提供的核心](UserProvidedKernels.md)
+ [AL2 AMI 版本通知](linux-ami-notifications.md)
+ [設定 AL2 MATE 桌面連線](amazon-linux-ami-mate.md)
+ [AL2 教學課程](al2-tutorials.md)

## 使用 AL2 AMI 啟動 Amazon EC2 執行個體 AL2
<a name="launch-ec2-instance"></a>

您可以使用 AL2 AMI 啟動 Amazon EC2 執行個體。 AL2 如需詳細資訊，請參閱[步驟 1：啟動執行個體](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)。

## 使用 Systems Manager 尋找最新的 AL2 AMI
<a name="find-latest-al2-using-systems-manager"></a>

Amazon EC2 為 維護的公有 AMIs 提供 AWS Systems Manager 公有參數 AWS ，您可以在啟動執行個體時使用。例如，EC2-provided參數`/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-default-hvm-x86_64-gp2`適用於所有區域，並一律指向指定區域中 AL2 AMI 的最新版本。

若要使用 尋找最新的 AL2023 AMI AWS Systems Manager，請參閱[開始使用 AL2023](https://docs.aws.amazon.com/linux/al2023/ug/get-started.html)。

該 Amazon EC2 AMI 公有參數可從以下路徑取得：

`/aws/service/ami-amazon-linux-latest`

您可以執行下列 AWS CLI 命令，檢視目前 AWS 區域中所有 Amazon Linux AMIs的清單。

```
aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest --query "Parameters[].Name"
```

**使用公有參數啟動執行個體**  
下列範例使用 EC2-provided公有參數，使用最新的 AL2 AMI 啟動`m5.xlarge`執行個體。

若要在命令中指定參數，請使用下列語法：`resolve:ssm:public-parameter`，其中 `resolve:ssm` 是標準前綴，而 `public-parameter` 是公有參數的路徑和名稱。

在此範例中，`--count` 和 `--security-group` 參數不包含在內。對於 `--count`，預設值為 1。如果您有預設 VPC 和預設安全群組，則會使用這些預設項目。

```
aws ec2 run-instances 
    --image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-default-hvm-x86_64-gp2 
    --instance-type m5.xlarge 
    --key-name MyKeyPair
```

如需詳細資訊，請參閱*AWS Systems Manager 《 使用者指南*》中的[使用公有參數](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-public-parameters.html)。

**了解 Amazon Linux 2 AMI 名稱**  
Amazon Linux 2 AMI 名稱使用以下命名機制：

`amzn2-ami-[minimal-][kernel-{5.10,default,4.14}]-hvm-{x86_64,aarch64}-{ebs,gp2}`
+ **最小** AMIs隨附一組最小化的預先安裝套件，以減少映像大小。
+ **kernel-VERSION** 會決定個別 AMI 上預先安裝的核心版本：
  + `kernel-5.10` 選取 Linux 核心 5.10 版。*這是 AL2 的建議核心版本。*
  + `kernel-default` 會選取 AL2 的建議預設核心。這是 kernel-5.10 的別名。
  + `kernel-4.14` 選取 Linux 核心 4.14 版。*這僅適用於與舊版 AMI 的相容性。請勿將此版本用於新的執行個體啟動。預期此 AMI 變成不受支援。*
  + 存在一組特殊的 AMI 名稱，而不參考特定的核心。這些 AMIs 是 kernel-4.14 的別名。*這些 AMIs 僅為與舊版 AMI 的相容性而提供。請勿將此 AMI 名稱用於新的執行個體啟動。預期要更新這些 AMIs的核心。*
+ **x86\$164/aarch64** 決定要在其中執行 AMI 的 CPU 平台。針對 Intel 和 AMD 型 EC2 執行個體選取 x86\$164。選取 EC2 Graviton 執行個體的 aarch64。
+ **ebs/gp2** 會決定用來提供個別 AMI 的 EBS 磁碟區類型。如需參考，請參閱 [EBS 磁碟區類型](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。*一律選取 gp2。*

## 連線至 Amazon EC2 執行個體
<a name="connect-to-amazon-linux-limits-ec2"></a>

有數種方式可以連線至 Amazon Linux 執行個體，包括 SSH AWS Systems Manager Session Manager和 EC2 Instance Connect。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[連線至 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

**SSH 使用者和 **sudo****  
根據預設，Amazon Linux 不允許遠端`root`安全殼層 (SSH)。此外，也會停用密碼身分驗證，以防止暴力破解攻擊。若要允許 SSH 登入 Amazon Linux 執行個體，您必須在啟動時提供執行個體的金鑰對。您也必須設定用於啟動執行個體的安全群組，以允許 SSH 存取。根據預設，唯一可以使用 SSH 遠端登入的帳戶是 `ec2-user`。此帳戶也具有 **sudo** 權限。如果您啟用遠端`root`登入，請注意它比依賴金鑰對和次要使用者更不安全。

## AL2 AMI 開機模式
<a name="default-boot-mode-al2"></a>

AL2 AMIs未設定開機模式參數。從 AL2 AMIs執行個體遵循執行個體類型的預設開機模式值。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[開機模式](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html)。

## 套件儲存庫
<a name="package-repository"></a>

此資訊適用於 AL2。如需有關 AL2023 的資訊，請參閱《Amazon Linux [2023 使用者指南》中的管理 AL2023 中的套件和作業系統更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。 **

AL2 和 AL1 旨在與每個 Amazon EC2 AWS Region 中託管的線上套件儲存庫搭配使用。儲存庫可供所有區域使用，且可用 **yum** 更新工具存取。各區域的託管儲存庫可讓我們快速部署更新，不會產生任何數據傳輸費。

**重要**  
AL1 的最後一個版本已於 2023 年 12 月 31 日達到 EOL，且自 2024 年 1 月 1 日起將不會收到任何安全性更新或錯誤修正。如需詳細資訊，請參閱 [Amazon Linux AMI 生命週期結束](https://aws.amazon.com//blogs/aws/update-on-amazon-linux-ami-end-of-life/)

如果您不需要保留執行個體的資料或自訂，您可以使用目前的 AL2 AMI 啟動新的執行個體。如果您需要保留執行個體的資料或自訂，您可以透過 Amazon Linux 套件儲存庫來維護這些執行個體。這些儲存庫將包含所有已更新的套件。您可選擇將這些更新套用至執行中的執行個體。即使發行了新版本，舊版的 AMI 和更新套件仍可繼續使用。

**注意**  
若要在 Amazon EC2 執行個體上更新和安裝沒有網際網路存取權的套件，請參閱[如何在執行 AL1, AL22 或 AL2023 的 Amazon EC2 執行個體上更新 yum 或安裝沒有網際網路存取權的套件？](https://repost.aws/knowledge-center/ec2-al1-al2-update-yum-without-internet)

若要安裝套件，請使用下列命令：

```
[ec2-user ~]$ sudo yum install package
```

如果您發現 Amazon Linux 未包含所需的應用程式，可以直接將應用程式安裝到 Amazon Linux 執行個體上。Amazon Linux 使用 RPMs和 yum進行套件管理，這可能是安裝新應用程式最直接的方式。您應先檢查我們的集中 Amazon Linux 儲存庫上是否有應用程式可用，因為該儲存庫提供許多應用程式。您可以從該處將這些應用程式新增至 Amazon Linux 執行個體。

若要將應用程式上傳到執行中的 Amazon Linux 執行個體，請用 **scp** 或 **sftp**，然後登入您的執行個體並設定應用程式。也可從內建的 cloud-init 套件使用 **PACKAGE\$1SETUP** 動作，在執行個體啟動期間上傳您的應用程式。如需詳細資訊，請參閱[在 AL2 上使用 cloud-init](amazon-linux-cloud-init.md)。

### 安全性更新
<a name="security-updates"></a>

使用 套件儲存庫提供安全性更新。安全性更新和更新的 AMI 安全性提醒都會發佈在 [Amazon Linux 安全中心](https://alas.aws.amazon.com)。如需 AWS 安全政策的詳細資訊，或需回報安全問題，請參閱 [AWS Cloud Security](https://aws.amazon.com/security/)。

AL1 和 AL2 已設定為在啟動時下載並安裝關鍵或重要的安全性更新。此組態中不包含核心更新。

在 AL2023 中，相較於 AL1 和 AL2，此組態已變更。如需 AL2023 安全性更新的詳細資訊，請參閱《*Amazon Linux 2023 使用者指南*》中的[安全性更新和功能](https://docs.aws.amazon.com/linux/al2023/ug/security-features.html)。

我們建議您在啟動後進行適用於您使用案例的必要更新。例如，您可能想要在啟動時套用所有更新 （不只是安全性更新），或評估每個更新，並僅套用適用於您系統的更新。使用下列 cloud-init 設定進行控制：`repo_upgrade`。以下 cloud-init 組態的程式碼片段顯示如何變更傳送到執行個體初始化之使用者資料文字中的設定：

```
#cloud-config
repo_upgrade: security
```

 `repo_upgrade` 可能的值如下：

`critical`  
套用未完成的重大安全性更新。

`important`  
套用未完成的重要和重要的安全性更新。

`medium`  
套用未完成的重大、重要和中等安全性更新。

`low`  
套用所有未完成的安全性更新，包括低嚴重性安全性更新。

`security`  
套用 Amazon 標示為安全性更新且尚未完成的關鍵或重要更新。

`bugfix`  
套用 Amazon 標示為錯誤修正的更新。錯誤修正為更大的更新集合，其中包含安全更新和各種其他次要錯誤的修正。

`all`  
套用所有適用的可用更新，無論其分類為何。

`none`  
不要在啟動時套用任何更新至執行個體。

**注意**  
Amazon Linux 不會將任何更新標記為 `bugfix`。若要從 Amazon Linux 套用非安全性相關更新，請使用 `repo_upgrade: all`。

`repo_upgrade` 的預設設定為安全。也就是說，如果您未在使用者資料中指定其他值，Amazon Linux 將在啟動時對當時已安裝的任何套件執行安全更新。Amazon Linux 也會通知您已安裝套件的任何更新，方法是在登入時使用 `/etc/motd` 檔案列出可用更新數。若要安裝這些更新，您需要在執行個體上執行 **sudo yum upgrade**。

### 儲存庫組態
<a name="repository-config"></a>

對於 AL1 和 AL2，AMIs 是建立 AMI 時可用套件的快照，但安全性更新除外。任何不在原始 AMI 上，但在執行時間安裝的套件，都將是可用的最新版本。若要取得適用於 AL2 的最新套件，請執行 **yum update -y**。

**疑難排解秘訣**  
如果您在奈米執行個體類型`cannot allocate memory`**yum update**上發生錯誤，例如 `t3.nano`，您可能需要配置交換空間以啟用更新。

對於 AL2023，相較於 AL1 和 AL2，儲存庫組態已變更。如需有關 AL2023 儲存庫的詳細資訊，請參閱[管理套件和作業系統更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

AL2023 之前的版本設定為提供源源不斷的更新，從 Amazon Linux 的次要版本滾動到下一個版本，也稱為*滾動發行版*。最佳實務是，建議您將 AMI 更新為最新的可用 AMI，而不是啟動舊 AMIs並套用更新。

主要 Amazon Linux 版本之間不支援就地升級，例如從 AL1 升級至 AL2，或從 AL2 升級至 AL2023。如需詳細資訊，請參閱[Amazon Linux 可用性](what-is-amazon-linux.md#amazon-linux-availability)。

# 在 AL2 上使用 cloud-init
<a name="amazon-linux-cloud-init"></a>

cloud-init 套件為 Canonical 所建立的開放原始碼應用程式，用於在 Amazon EC2 等雲端運算環境下引導 Linux 映像。Amazon Linux 包含自訂版本的 cloud-init。這可讓您指定執行個體在開機時應該發生的動作。您可在執行個體啟動時透過使用者資料欄位將所需動作傳送至 cloud-init。這表示您可在許多使用案例下用常用 AMI，並在啟動時動態設定它們。Amazon Linux 也使用 cloud-init 執行 ec2-user 帳戶的初始組態。

 如需詳細資訊，請參閱 [cloud-init 文件](http://cloudinit.readthedocs.org/en/latest/)。

Amazon Linux 使用在 `/etc/cloud/cloud.cfg.d` 和 `/etc/cloud/cloud.cfg` 中找到的 cloud-init 動作。您可在 `/etc/cloud/cloud.cfg.d` 中建立自己的 cloud-init 動作檔案。此目錄中的所有檔案將由 cloud-init 讀取。這些檔案將按辭典的順序讀取，且新檔案將覆寫舊檔案中的值。

cloud-init 套件將在開機時對執行個體執行這些 (和之後的) 一般組態任務：
+ 設定預設的地區設定.
+ 設定主機名稱.
+ 剖析及處理使用者資料.
+ 產生主機私有 SSH 金鑰.
+ 將使用者的公有 SSH 金鑰加入至 `.ssh/authorized_keys`，以方便登入和管理.
+ 準備儲存庫以管理套件.
+ 處理使用者資料中定義的套件動作.
+ 執行使用者資料中找到的使用者指令碼。
+ 掛載執行個體存放磁碟區 (如適用)。
  + 根據預設，`ephemeral0` 執行個體存放磁碟區將掛載在 `/media/ephemeral0` (若存在且包含有效的檔案系統的話)；否則將不掛載。
  + 根據預設，將掛載任何與執行個體關聯的置換磁碟區 (僅適用於 `m1.small` 和 `c1.medium` 執行個體類型)。
  + 您可用下列的 cloud-init 指令覆寫預設的執行個體存放磁碟區掛載：

    ```
    #cloud-config
    mounts:
    - [ ephemeral0 ]
    ```

    如需進一步掌控掛載，請參閱 cloud-init 文件中的[掛載](http://cloudinit.readthedocs.io/en/latest/topics/modules.html#mounts)。
  + 執行個體啟動時不會格式化支援 TRIM 的執行個體存放磁碟區，因此您必須先分割及格式化磁碟區，然後再掛載。如需詳細資訊，請參閱[執行個體存放區磁碟區TRIM支援](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ssd-instance-store.html#InstanceStoreTrimSupport)。您可在開機時用 `disk_setup` 模組分割及格式化執行個體存放磁碟區。如需詳細資訊，請參閱 cloud-init 文件中的[磁碟設定](http://cloudinit.readthedocs.io/en/latest/topics/modules.html#disk-setup)。

## 支援的使用者資料格式
<a name="supported-user-data-formats"></a>

cloud-init 套件支援各種格式的使用者資料處理：
+ Gzip
  + 如果使用者資料經過 gzip 壓縮，Cloud-init 會解壓縮資料並適當處理。
+ MIME 分段
  + 您可用 MIME 分段檔案指定一種以上的資料。例如，您可以同時指定使用者資料指令碼和雲端組態類型。分段檔案中的每個部分均可為 cloud-init 處理，前提是需為支援的其中一種格式。
+ Base64 解碼
  +  如果使用者資料是 base64 編碼，Cloud-init 會判斷是否可以將解碼的資料理解為其中一個支援的類型。如果它能了解解碼的資料，它將解碼資料並用正確方式處理資料。否則，將傳回原封不動的 base64 資料。
+ 使用者資料指令碼
  + 開頭為 `#!` 或 `Content-Type: text/x-shellscript`。
  + 指令碼會在第一次開機週期期間由 `/etc/init.d/cloud-init-user-scripts` 執行。發生於開機流程晚期 (執行初始組態動作之後)。
+ 包含檔案
  + 開頭為 `#include` 或 `Content-Type: text/x-include-url`。
  + 此內容為包含檔案。檔案包含 URL 清單，每行一個。將讀取每個 URL，且其內容將通過相同的規則集合。從 URL 讀取的內容可能為 gzip 壓縮、MIME 分段或純文字。
+ 雲端組態資料
  + 開頭為 `#cloud-config` 或 `Content-Type: text/cloud-config`。
  + 此內容是雲端組態資料。
+ 啟動任務 (AL2 不支援）
  + 開頭為 `#upstart-job` 或 `Content-Type: text/upstart-job`。
  + 此內容存放在 的檔案中`/etc/init`，而且 upstart 會像使用其他 upstart 任務一樣使用內容。
+ 雲端 boothook
  + 開頭為 `#cloud-boothook` 或 `Content-Type: text/cloud-boothook`。
  + 此內容為 boothook 資料。其存放在 `/var/lib/cloud` 下的檔案內，且將立即執行。
  +  這是最早可用的*關聯*。未提供只允許其執行一次的機制。boothook 必須自我處理。其將提供含環境變數 `INSTANCE_ID` 的執行個體 ID。請用此變數提供 boothook 資料每執行個體一次的集合。

# 設定 AL2 執行個體
<a name="configure-ec2-instance"></a>

成功啟動並登入 AL2 執行個體後，您可以對其進行變更。您可以透過許多方式設定執行個體以符合特定應用程式的需求。以下是可協助您開始使用的常見任務。

**Topics**
+ [常見組態案例](#instance-configuration-scenarios)
+ [管理 AL2 執行個體上的軟體](managing-software.md)
+ [Amazon EC2 AL2 執行個體的處理器狀態控制](processor_state_control.md)
+ [AL2 的 I/O 排程器](io-scheduler.md)
+ [變更 AL2 執行個體的主機名稱](set-hostname.md)
+ [在 AL2 執行個體上設定動態 DNS](dynamic-dns.md)
+ [使用 ec2-net-utils for AL2 設定您的網路介面](ec2-net-utils.md)

## 常見組態案例
<a name="instance-configuration-scenarios"></a>

Amazon Linux 的基礎分佈包含基本伺服器操作需要的軟體套件和公用程式。但是，您可以從不同軟體儲存庫中取得更多軟體套件。您甚至可以從來源碼建置更多套件。如需從這些位置安裝和建置軟體的詳細資訊，請參閱[管理 AL2 執行個體上的軟體](managing-software.md)。

Amazon Linux 執行個體附帶預先設定的 `ec2-user`，但建議您新增其他不具有超級使用者權限的使用者。如需新增和移除使用者的詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[管理Linux執行個體上的使用者](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/managing-users.html)。

若您有自己的網路，且其具備已註冊的網域名稱，您可以變更執行個體的主機名稱，將其識別為該網域的一部分。您也可以變更系統提示，顯示更有意義的名稱，而無須變更主機名稱設定。如需詳細資訊，請參閱[變更 AL2 執行個體的主機名稱](set-hostname.md)。您可以將執行個體設定為使用動態 DNS 服務提供者。如需詳細資訊，請參閱[在 AL2 執行個體上設定動態 DNS](dynamic-dns.md)。

當您在 Amazon EC2 上啟動執行個體時，您可以選擇將使用者資料傳遞給執行個體，用來執行常見的組態任務，甚至在執行個體啟動之後執行指令碼。您可以將兩種類型的使用者資料傳遞給 Amazon EC2：cloud-init 指示詞和 shell 指令碼。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[啟動時在Linux執行個體上執行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。

# 管理 AL2 執行個體上的軟體
<a name="managing-software"></a>

Amazon Linux 的基礎分佈包含基本伺服器操作需要的軟體套件和公用程式。

此資訊適用於 AL2。如需有關 AL2023 的資訊，請參閱《Amazon Linux [2023 使用者指南》中的管理 AL2023 中的套件和作業系統更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。 **

將軟體維持在最新狀態是非常重要的。Linux 分佈中的許多套件都會頻繁更新以修正錯誤、新增功能和提供保護，以免遭利用安全漏洞。如需詳細資訊，請參閱[更新 AL2 執行個體上的執行個體軟體](install-updates.md)。

根據預設，AL2 執行個體會在啟用下列儲存庫的情況下啟動：
+ `amzn2-core`
+ `amzn2extra-docker`

雖然這些儲存庫中有許多套件可供 更新 AWS，但您可能想要安裝另一個儲存庫中包含的套件。如需詳細資訊，請參閱[在 AL2 執行個體上新增儲存庫](add-repositories.md)。如需在已啟用的儲存庫中尋找並安裝套件的協助，請參閱 [在 AL2 執行個體上尋找並安裝軟體套件](find-install-software.md)。

並非所有軟體都可從存放在儲存庫中的軟體套件取得。有些軟體必須在執行個體上從來源碼編譯取得。如需詳細資訊，請參閱[準備在 AL2 執行個體上編譯軟體](compile-software.md)。

AL2 執行個體使用 yum 套件管理員管理其軟體。yum 套件管理員可安裝、移除和更新軟體，也能管理每個套件的所有依存性。

**Topics**
+ [更新 AL2 執行個體上的執行個體軟體](install-updates.md)
+ [在 AL2 執行個體上新增儲存庫](add-repositories.md)
+ [在 AL2 執行個體上尋找並安裝軟體套件](find-install-software.md)
+ [準備在 AL2 執行個體上編譯軟體](compile-software.md)

# 更新 AL2 執行個體上的執行個體軟體
<a name="install-updates"></a>

將軟體維持在最新狀態是非常重要的。Linux 分佈中的套件都會頻繁更新以修正錯誤、新增功能和提供保護，以免遭利用安全漏洞。當您第一次啟動並連線至 Amazon Linux 執行個體時，您可能會看到一則訊息，提示您更新軟體套件以維護安全。本節說明如何更新整個系統或單一套件。

此資訊適用於 AL2。如需有關 AL2023 的資訊，請參閱《Amazon Linux [2023 使用者指南》中的管理 AL2023 中的套件和作業系統更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。 **

如需有關 AL2 變更和更新的資訊，請參閱 [AL2 版本備註](https://docs.aws.amazon.com/AL2/latest/relnotes/relnotes-al2.html)。

如需有關 AL2023 變更與更新的資訊，請參閱 [AL2023 版本備註](https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes.html)。

**重要**  
如果您將使用 Amazon Linux 2 AMI 的 EC2 執行個體啟動到僅限 IPv6 的子網中，則必須連線到該執行個體並執行 `sudo amazon-linux-https disable`。這可以讓您的 AL2 執行個體使用 http 修補程式服務來透過 IPv6 連接到 S3 中的 yum 儲存庫。

**更新 AL2 執行個體上的所有套件**

1. (選用) 在您的 shell 視窗中啟動 **screen** 工作階段。有時候您可能會遭遇網路中斷，其會中斷您執行個體的 SSH 連線。當在長時間的軟體更新過程中發生這種情況時，可能會使執行個體進入可復原但混淆的狀態。**screen** 工作階段可讓您即使中斷連線，也能繼續執行更新，並可在稍後重新連線到工作階段而不會發生任何問題。

   1. 執行 **screen** 命令以開始工作階段。

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

   1. 若您的工作階段中斷連線，請重新登入您的執行個體並列出可用的螢幕。

      ```
      [ec2-user ~]$ screen -ls
      There is a screen on:
      	17793.pts-0.ip-12-34-56-78	(Detached)
      1 Socket in /var/run/screen/S-ec2-user.
      ```

   1. 使用 **screen -r** 命令和在先前命令中取得的程序 ID 重新連線到螢幕。

      ```
      [ec2-user ~]$ screen -r 17793
      ```

   1. 當您結束使用 **screen** 命令，請使用 **exit** 命令來關閉工作階段。

      ```
      [ec2-user ~]$ exit
      [screen is terminating]
      ```

1. 執行 **yum update** 命令。您可以選擇性新增 `--security` 標記，僅套用安全更新。

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

1. 檢閱列出的套件，輸入 **y**，然後按下 Enter 鍵接受更新。更新系統上的所有套件可能需要幾分鐘的時間。**yum** 輸出會在執行過程中顯示更新的狀態。

1. （選用） [重新啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-reboot.html)，以確保您使用來自更新的最新套件和程式庫；在重新啟動之前不會載入核心更新。任何對 `glibc` 程式庫進行的更新都需要重新啟動。對於控制服務的套件更新，可能只需要重新啟動服務便可套用更新，但系統重新開機可確保所有先前的套件和程式庫更新都已完成。

**更新 AL2 執行個體上的單一套件**

使用此程序更新單一套件 (及其依存性)，而非整個系統。

1. 使用要更新的套件名稱執行 **yum update** 命令。

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

1. 檢閱列出的套件資訊，輸入 **y**，然後按下 Enter 鍵接受更新。有時候若有需要解析的套件依存性，便會列出一個以上的套件。**yum** 輸出會在執行過程中顯示更新的狀態。

1. （選用） [重新啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-reboot.html)，以確保您使用的是更新中的最新套件和程式庫；在重新啟動之前，不會載入核心更新。任何對 `glibc` 程式庫進行的更新都需要重新啟動。對於控制服務的套件更新，可能只需要重新啟動服務便可套用更新，但系統重新開機可確保所有先前的套件和程式庫更新都已完成。

# 在 AL2 執行個體上新增儲存庫
<a name="add-repositories"></a>

此資訊適用於 AL2。如需 AL2023 的相關資訊，請參閱《Amazon Linux 2[023 使用者指南》中的透過 AL2023 上的版本控制儲存庫進行確定性升級](https://docs.aws.amazon.com/linux/al2023/ug/deterministic-upgrades.html)。 **

根據預設，AL2 執行個體會在啟用下列儲存庫的情況下啟動：
+ `amzn2-core`
+ `amzn2extra-docker`

雖然這些儲存庫中有許多可用的套件都會由 Amazon Web Services 更新，但是您希望安裝的套件可能會包含在其他儲存庫中。

若要使用 **yum** 命令從不同的儲存庫安裝套件，您需要為 `/etc/yum.conf` 檔案或其自身位於 `repository.repo` 目錄中的 `/etc/yum.repos.d` 檔案新增儲存庫的資訊。您可以手動執行此作業，但大多數的 yum 儲存庫會在其儲存庫 URL 中提供自身的 `repository.repo` 檔案。

**判斷已安裝哪些 yum 儲存庫**  
請使用以下命令列出已安裝的 yum 儲存庫：

```
[ec2-user ~]$ yum repolist all
```

結果輸出會列出已安裝的儲存庫，並報告每個儲存庫的狀態。已啟用的儲存庫會顯示其包含的套件數目。

**為 /etc/yum.repos.d 新增 yum 儲存庫**

1. 尋找 `.repo` 檔案的位置。這會根據您將新增的儲存庫而有所不同。在此範例中，`.repo` 檔案位於 `https://www.example.com/repository.repo`。

1. 使用 **yum-config-manager** 命令新增儲存庫。

   ```
   [ec2-user ~]$ sudo yum-config-manager --add-repo https://www.example.com/repository.repo
   Loaded plugins: priorities, update-motd, upgrade-helper
   adding repo from: https://www.example.com/repository.repo
   grabbing file https://www.example.com/repository.repo to /etc/yum.repos.d/repository.repo
   repository.repo                                      | 4.0 kB     00:00
   repo saved to /etc/yum.repos.d/repository.repo
   ```

在您安裝儲存庫後，您必須啟用它，如下一個程序中所說明。

**在 /etc/yum.repos.d 中啟用 yum 儲存庫**  
使用 **yum-config-manager** 命令搭配 `--enable repository` 旗標。以下命令會啟用來自 Fedora 專案的 Extra Packages for Enterprise Linux (EPEL) 儲存庫。根據預設，此儲存庫位在 Amazon Linux AMI 執行個體上的 `/etc/yum.repos.d` 中，但並未啟用。

```
[ec2-user ~]$ sudo yum-config-manager --enable epel
```

如需詳細資訊，以及下載此套件的最新版本，請參閱 https：//[https://fedoraproject.org/wiki/EPEL](https://fedoraproject.org/wiki/EPEL)。

# 在 AL2 執行個體上尋找並安裝軟體套件
<a name="find-install-software"></a>

您可以使用套件管理工具來尋找並安裝軟體套件。在 Amazon Linux 2 中，預設軟體套件管理工具為 YUM。在 AL2023 中，預設軟體套件管理工具為 DNF。如需詳細資訊，請參閱《*Amazon Linux 2023 使用者指南*》中的[套件管理工具](https://docs.aws.amazon.com/linux/al2023/ug/package-management.html)。

## 尋找 AL2 執行個體上的軟體套件
<a name="find-software"></a>

您可以使用 **yum search** 命令搜尋在您設定的儲存庫中可用套件的描述。這在您不知道希望安裝之套件的精確名稱時非常有用。您只需要將關鍵字搜尋附加到命令即可；針對多個關鍵字搜尋，請使用引號包圍搜尋查詢。

```
[ec2-user ~]$ yum search "find"
```

以下為範例輸出。

```
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
============================== N/S matched: find ===============================
findutils.x86_64 : The GNU versions of find utilities (find and xargs)
gedit-plugin-findinfiles.x86_64 : gedit findinfiles plugin
ocaml-findlib-devel.x86_64 : Development files for ocaml-findlib
perl-File-Find-Rule.noarch : Perl module implementing an alternative interface to File::Find
robotfindskitten.x86_64 : A game/zen simulation. You are robot. Your job is to find kitten.
mlocate.x86_64 : An utility for finding files by name
ocaml-findlib.x86_64 : Objective CAML package manager and build helper
perl-Devel-Cycle.noarch : Find memory cycles in objects
perl-Devel-EnforceEncapsulation.noarch : Find access violations to blessed objects
perl-File-Find-Rule-Perl.noarch : Common rules for searching for Perl things
perl-File-HomeDir.noarch : Find your home and other directories on any platform
perl-IPC-Cmd.noarch : Finding and running system commands made easy
perl-Perl-MinimumVersion.noarch : Find a minimum required version of perl for Perl code
texlive-xesearch.noarch : A string finder for XeTeX
valgrind.x86_64 : Tool for finding memory management bugs in programs
valgrind.i686 : Tool for finding memory management bugs in programs
```

引號中的多個關鍵字搜尋查詢只會傳回與查詢完全相符的結果。若您沒有看到預期的套件，請將您的搜尋簡化至一個關鍵字，然後掃描結果。您也可以嘗試關鍵字同義詞來擴大您的搜尋。

如需 AL2 套件的詳細資訊，請參閱下列內容：
+ [AL2 Extras 程式庫](al2-extras.md)
+ [套件儲存庫](ec2.md#package-repository)

## 在 AL2 執行個體上安裝軟體套件
<a name="install-software"></a>

在 AL2 中，yum 套件管理工具會搜尋所有已啟用的儲存庫，尋找不同的軟體套件，並處理軟體安裝程序中的任何相依性。如需在 AL2023 中安裝軟體套件的詳細資訊，請參閱《*Amazon Linux 2023 使用者指南*》中的[管理套件和作業系統更新](https://docs.aws.amazon.com/linux/al2023/ug/managing-repos-os-updates.html)。

**若要從儲存庫中安裝套件**  
請使用 **yum install *package*** 命令，並使用要安裝之軟體的名稱來取代*套件*。例如，若要安裝 **links** 文字型 Web 瀏覽器，請輸入以下命令。

```
[ec2-user ~]$ sudo yum install links
```

**安裝您已下載的 RPM 套件檔案**  
您也可以使用 **yum install** 安裝已從網際網路下載的 RPM 套件檔案。若要執行此操作，請將 RPM 檔案的路徑名稱附加到安裝命令 (而非儲存庫套件名稱)。

```
[ec2-user ~]$ sudo yum install my-package.rpm
```

**列出已安裝的套件**  
若要檢視執行個體上已安裝的套件清單，請使用下列命令。

```
[ec2-user ~]$ yum list installed
```

# 準備在 AL2 執行個體上編譯軟體
<a name="compile-software"></a>

網際網路上可用的開放原始碼軟體並未預先編譯並不能從套件儲存庫中下載。您最終可能會面臨需要自行從來源碼編譯的軟體套件。若要讓您的系統能夠在 AL2 和 Amazon Linux 中編譯軟體，您需要安裝數種開發工具，例如 **make**、 **gcc**和 **autoconf**。

因為軟體編譯並非每個 Amazon EC2 執行個體需要的任務，根據預設不會安裝這些工具，但仍可以在稱為 "Development Tools" 的套件群組中取得。您可以使用 **yum groupinstall** 命令輕鬆為執行個體新增該群組。

```
[ec2-user ~]$ sudo yum groupinstall "Development Tools"
```

軟體來源碼套件通常可做為壓縮封存檔案 (稱為 tarball) 進行下載 (例如 [https://github.com/](https://github.com/) 和 [http://sourceforge.net/](https://sourceforge.net/) 等網站)。這些 tarball 通常會具有 `.tar.gz` 檔案副檔名。您可以使用 **tar** 命令解壓縮這些封存檔。

```
[ec2-user ~]$ tar -xzf software.tar.gz
```

在您解壓縮及解除封存來源碼套件後，建議您在來源碼目錄中尋找 `README` 或 `INSTALL` 檔案。這些檔案可針對編譯和安裝來源碼提供您進一步的說明。

**擷取 Amazon Linux 套件的原始程式碼**  
Amazon Web Services 提供維護套件的來源碼。您可以使用 **yumdownloader --source** 命令下載任何已安裝套件的來源碼。

執行 **yumdownloader --source *package*** 命令來下載 *package* 的來源碼。例如，若要下載 `htop` 套件的來源碼，請輸入以下命令。

```
[ec2-user ~]$ yumdownloader --source htop

Loaded plugins: priorities, update-motd, upgrade-helper
Enabling amzn-updates-source repository
Enabling amzn-main-source repository
amzn-main-source                                                                                              | 1.9 kB  00:00:00     
amzn-updates-source                                                                                           | 1.9 kB  00:00:00     
(1/2): amzn-updates-source/latest/primary_db                                                                  |  52 kB  00:00:00     
(2/2): amzn-main-source/latest/primary_db                                                                     | 734 kB  00:00:00     
htop-1.0.1-2.3.amzn1.src.rpm
```

來源 RPM 的位置位於您執行命令的目錄中。

# Amazon EC2 AL2 執行個體的處理器狀態控制
<a name="processor_state_control"></a>

C-state 可控制核心在閒置狀態要進入的休眠等級。C-state 從 C0 (最淺閒置狀態，此時核心處於喚醒狀態並執行指令) 開始編號，最高可到 C6 (最深閒置狀態，此時核心會關閉)。

P-states 則可控制所需的核心效能 (CPU 頻率)。P-state 從 P0 (最高效能設定，此時核心可視需要使用 Intel Turbo Boost 技術來提高頻率) 開始編號，之後則從 P1 (請求最大基準頻率的 P-state) 到 P15 (最低適用頻率)。

建議您變更 C-state 或 P-state 設定來提高處理器效能穩定性、減少延遲或針對特定工作負載微調執行個體。預設 C-state 和 P-state 設定提供最大效能，適合多數工作負載使用。然而，若您的應用程式更適合犧牲較高的單核心或雙核心頻率以降低延遲，或在較低頻率更能展現穩定效能 (而不適合使用突增 Turbo Boost 頻率)，請考慮嘗試調整這些執行個體的 C-state 或 P-state 設定。

如需可讓作業系統控制處理器 C-state 和 P-state 的 Amazon EC2 執行個體類型相關資訊，請參閱《[Amazon EC2 使用者指南》中的 Amazon EC2 執行個體的處理器狀態控制](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/processor_state_control.html)。 *Amazon EC2 *

下列各節會說明處理器狀態的不同組態，以及如何監控組態的效果。這些程序是針對 Amazon Linux 撰寫並套用；不過，它們也可能適用於 Linux 核心版本為 3.9 或更新版本的其他 Linux 發行版本。

**注意**  
此頁面上的範例使用以下項目：  
**turbostat** 公用程式，用於顯示處理器頻率和 C-state 資訊。根據預設，**turbostat** 執行個體在 Amazon Linux 上可用。
**stress** 命令，用於模擬工作負載。若要安裝 **stress**，首先透過執行 **sudo amazon-linux-extras install epel** 啟用 EPEL 儲存庫，然後執行 **sudo yum install -y stress**。
若輸出未顯示 C-state 資訊，請將 **--debug** 選項併入命令 (**sudo turbostat --debug stress *<options>***) 中。

**Topics**
+ [具備最高 Turbo Boost 頻率的最佳效能](#turbo-perf)
+ [限制深層的 C-state 達到高效能與低延遲](#c-states)
+ [以最低變異取得基準效能](#baseline-perf)

## 具備最高 Turbo Boost 頻率的最佳效能
<a name="turbo-perf"></a>

此為 Amazon Linux AMI 的預設處理器狀態控制組態，建議多數工作負載使用。此組態提供最佳效能，而且變異較低。允許未使用的核心進入更深的休眠狀態，可提供單核心或雙核心處理器達到最大 Turbo Boost 潛力所需的散熱餘裕。

下列範例以 `c4.8xlarge` 執行個體為例，其中具備兩個執行工作並達到最大處理器 Turbo Boost 頻率的運作中核心。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [30680] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [30680] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.54 3.44 2.90   0   9.18   0.00  85.28   0.00   0.00   0.00   0.00   0.00  94.04 32.70 54.18  0.00
 0   0   0   0.12 3.26 2.90   0   3.61   0.00  96.27   0.00   0.00   0.00   0.00   0.00  48.12 18.88 26.02  0.00
 0   0  18   0.12 3.26 2.90   0   3.61
 0   1   1   0.12 3.26 2.90   0   4.11   0.00  95.77   0.00
 0   1  19   0.13 3.27 2.90   0   4.11
 0   2   2   0.13 3.28 2.90   0   4.45   0.00  95.42   0.00
 0   2  20   0.11 3.27 2.90   0   4.47
 0   3   3   0.05 3.42 2.90   0  99.91   0.00   0.05   0.00
 0   3  21  97.84 3.45 2.90   0   2.11
...
 1   1  10   0.06 3.33 2.90   0  99.88   0.01   0.06   0.00
 1   1  28  97.61 3.44 2.90   0   2.32
...
10.002556 sec
```

在此範例中，vCPU 21 和 28 均以最大 Turbo Boost 頻率運作，因為其他核心已進入 `C6` 休眠狀態以節省功耗，並讓工作中核心取得能力與散熱餘裕。vCPU 3 和 10 (個別與 vCPU 21 和 28 共享處理器核心) 處於等待指令的 `C1` 狀態。

在下列範例中，所有 18 個核心均運作中執行工作，因此沒有達到最大 Turbo Boost 的餘裕，但它們均以「All Core Turbo Boost」運作，速度達到 3.2 GHz。

```
[ec2-user ~]$ sudo turbostat stress -c 36 -t 10
stress: info: [30685] dispatching hogs: 36 cpu, 0 io, 0 vm, 0 hdd
stress: info: [30685] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
            99.27 3.20 2.90   0   0.26   0.00   0.47   0.00   0.00   0.00   0.00   0.00 228.59 31.33 199.26  0.00
 0   0   0  99.08 3.20 2.90   0   0.27   0.01   0.64   0.00   0.00   0.00   0.00   0.00 114.69 18.55 99.32  0.00
 0   0  18  98.74 3.20 2.90   0   0.62
 0   1   1  99.14 3.20 2.90   0   0.09   0.00   0.76   0.00
 0   1  19  98.75 3.20 2.90   0   0.49
 0   2   2  99.07 3.20 2.90   0   0.10   0.02   0.81   0.00
 0   2  20  98.73 3.20 2.90   0   0.44
 0   3   3  99.02 3.20 2.90   0   0.24   0.00   0.74   0.00
 0   3  21  99.13 3.20 2.90   0   0.13
 0   4   4  99.26 3.20 2.90   0   0.09   0.00   0.65   0.00
 0   4  22  98.68 3.20 2.90   0   0.67
 0   5   5  99.19 3.20 2.90   0   0.08   0.00   0.73   0.00
 0   5  23  98.58 3.20 2.90   0   0.69
 0   6   6  99.01 3.20 2.90   0   0.11   0.00   0.89   0.00
 0   6  24  98.72 3.20 2.90   0   0.39
...
```

## 限制深層的 C-state 達到高效能與低延遲
<a name="c-states"></a>

C-state 可控制核心在未使用時要進入的休眠等級。建議您控制 C-state 來微調系統的延遲與效能。核心進入休眠狀態需要時間，而且雖然休眠核心讓其他核心更有餘裕加速至更高頻率，但是欲喚醒該休眠核心並開始執行工作也需要時間。例如，若負責處理網路封包中斷的核心處於休眠狀態，則處理此類中斷的服務就可能受到延遲。您可將系統設定為不使用深層 C-state，藉此減少處理器反應延遲，但同時也會壓縮其他核心進行 Turbo Boost 的餘裕。

停用深層休眠狀態常見於 Redis 資料庫應用程式，該應用程式將資料庫存放於系統記憶體中，以實現最快速的查詢回應時間。

**在 AL2 上限制更深層的睡眠狀態**

1. 使用您選取的編輯器開啟 `/etc/default/grub` 檔案。

   ```
   [ec2-user ~]$ sudo vim /etc/default/grub
   ```

1. 編輯 `GRUB_CMDLINE_LINUX_DEFAULT` 行，並新增 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1"
   GRUB_TIMEOUT=0
   ```

   `intel_idle.max_cstate=1` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

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

1.  執行下列命令來重建開機組態。

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. 重新啟動執行個體以啟用新的核心選項。

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

**限制 Amazon Linux AMI 上的深層休眠狀態**

1. 使用您選取的編輯器開啟 `/boot/grub/grub.conf` 檔案。

   ```
   [ec2-user ~]$ sudo vim /boot/grub/grub.conf
   ```

1. 編輯第一個項目的 `kernel` 行，並新增 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   # created by imagebuilder
   default=0
   timeout=1
   hiddenmenu
   
   title Amazon Linux 2014.09 (3.14.26-24.46.amzn1.x86_64)
   root (hd0,0)
   kernel /boot/vmlinuz-3.14.26-24.46.amzn1.x86_64 root=LABEL=/ console=ttyS0 intel_idle.max_cstate=1  processor.max_cstate=1
   initrd /boot/initramfs-3.14.26-24.46.amzn1.x86_64.img
   ```

   `intel_idle.max_cstate=1` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

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

1. 重新啟動執行個體以啟用新的核心選項。

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

下列範例以 `c4.8xlarge` 執行個體為例，其中具備兩個執行工作並以「All Core Turbo Boost」核心頻率運作的運作中核心。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [5322] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [5322] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.56 3.20 2.90   0  94.44   0.00   0.00   0.00   0.00   0.00   0.00   0.00 131.90 31.11 199.47  0.00
 0   0   0   0.03 2.08 2.90   0  99.97   0.00   0.00   0.00   0.00   0.00   0.00   0.00  67.23 17.11 99.76  0.00
 0   0  18   0.01 1.93 2.90   0  99.99
 0   1   1   0.02 1.96 2.90   0  99.98   0.00   0.00   0.00
 0   1  19  99.70 3.20 2.90   0   0.30
...
 1   1  10   0.02 1.97 2.90   0  99.98   0.00   0.00   0.00
 1   1  28  99.67 3.20 2.90   0   0.33
 1   2  11   0.04 2.63 2.90   0  99.96   0.00   0.00   0.00
 1   2  29   0.02 2.11 2.90   0  99.98
...
```

在此範例中，vCPU 19 和 28 的核心以 3.2 GHz 運作，其他核心則處於等待指令的 `C1` C-state。雖然運作中核心並未達到最大 Turbo Boost 頻率，但是未使用的核心將比處於深層 `C6` C-state 更能夠快速回應新的請求。

## 以最低變異取得基準效能
<a name="baseline-perf"></a>

您可使用 P-state 來減少處理器頻率的變異。P-state 則可控制所需的核心效能 (CPU 頻率)。多數工作負載以 P0 運作的效能較佳，此時會要求使用 Turbo Boost。然而，若要取得穩定效能，而非 Turbo Boost 啟用才出現的突增效能，建議您微調系統。

Intel Advanced Vector Extensions (AVX 或 AVX2) 工作負載能夠以較低頻率展現優異效能，而 AVX 指令也得以使用更多電力。停用 Turbo Boost 讓處理器以較低頻率運作，能夠減少功耗並保持速度穩定。如需有關最佳化 AVX 的執行個體組態與工作負載的詳細資訊，請參閱 [Intel 網站](https://www.intel.com/content/www/us/en/developer/articles/technical/the-intel-advanced-vector-extensions-512-feature-on-intel-xeon-scalable.html?wapkw=advanced%20vector%20extensions)。

CPU 閒置驅動程式控制 P-state。較新世代 CPU 需要較新的 CPU 閒置驅動程式 (對應於核心層級)，如下所示：
+ Linux 核心 6.1 版和更新版本 – 支援 Intel Granite Rapids （例如 R8i)
+ Linux 核心 5.10 版及更新版本 – 支援 AMD Milan （例如 M6a)
+ Linux 核心 5.6 版和更新版本 – 支援 Intel Icelake （例如 M6i)

若要偵測執行中的系統核心是否能辨識 CPU，請執行以下命令。

```
if [ -d /sys/devices/system/cpu/cpu0/cpuidle ]; then echo "C-state control enabled"; else echo "Kernel cpuidle driver does not recognize this CPU generation"; fi
```

如果此命令的輸出表示缺乏支援，我們建議您將核心升級。

本節將說明如何限制深層休眠狀態並停用 Turbo Boost (透過請求 `P1` P-state)，為這些類型的工作負載提供低延遲及最小的處理器速度變異。

**限制更深層的睡眠狀態，並在 AL2 上停用 Turbo Boost**

1. 使用您選取的編輯器開啟 `/etc/default/grub` 檔案。

   ```
   [ec2-user ~]$ sudo vim /etc/default/grub
   ```

1. 編輯 `GRUB_CMDLINE_LINUX_DEFAULT` 行，並新增 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 intel_idle.max_cstate=1 processor.max_cstate=1"
   GRUB_TIMEOUT=0
   ```

   `intel_idle.max_cstate=1` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

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

1.  執行下列命令來重建開機組態。

   ```
   [ec2-user ~]$ grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

1. 重新啟動執行個體以啟用新的核心選項。

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

1. 當您需要 `P1` P-state 提供的低處理器速度變異，請執行下列命令以停用 Turbo Boost。

   ```
   [ec2-user ~]$ sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

1. 工作負載完成時，您可使用下列命令重新啟用 Turbo Boost。

   ```
   [ec2-user ~]$ sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

**限制 Amazon Linux AMI 上的深層休眠狀態並停用 Turbo Boost**

1. 使用您選取的編輯器開啟 `/boot/grub/grub.conf` 檔案。

   ```
   [ec2-user ~]$ sudo vim /boot/grub/grub.conf
   ```

1. 編輯第一個項目的 `kernel` 行，並新增 `intel_idle.max_cstate=1` 和 `processor.max_cstate=1` 選項將 `C1` 設定為閒置核心的最深 C-state。

   ```
   # created by imagebuilder
   default=0
   timeout=1
   hiddenmenu
   
   title Amazon Linux 2014.09 (3.14.26-24.46.amzn1.x86_64)
   root (hd0,0)
   kernel /boot/vmlinuz-3.14.26-24.46.amzn1.x86_64 root=LABEL=/ console=ttyS0 intel_idle.max_cstate=1 processor.max_cstate=1
   initrd /boot/initramfs-3.14.26-24.46.amzn1.x86_64.img
   ```

   `intel_idle.max_cstate=1` 選項為 Intel 型執行個體設定 C-state 限制，而 `processor.max_cstate=1` 選項則為 AMD 型執行個體設定 C-state 限制。將這兩個選項加入您的組態中是安全的做法。這允許單一組態在 Intel 和 AMD 上設定所需的行為。

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

1. 重新啟動執行個體以啟用新的核心選項。

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

1. 當您需要 `P1` P-state 提供的低處理器速度變異，請執行下列命令以停用 Turbo Boost。

   ```
   [ec2-user ~]$ sudo sh -c "echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

1. 工作負載完成時，您可使用下列命令重新啟用 Turbo Boost。

   ```
   [ec2-user ~]$ sudo sh -c "echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo"
   ```

下列範例以 `c4.8xlarge` 執行個體為例，其中具備兩個執行工作並以基準核心頻率 (無 Turbo Boost) 運作的 vCPU。

```
[ec2-user ~]$ sudo turbostat stress -c 2 -t 10
stress: info: [5389] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: info: [5389] successful run completed in 10s
pk cor CPU    %c0  GHz  TSC SMI    %c1    %c3    %c6    %c7   %pc2   %pc3   %pc6   %pc7  Pkg_W RAM_W PKG_% RAM_%
             5.59 2.90 2.90   0  94.41   0.00   0.00   0.00   0.00   0.00   0.00   0.00 128.48 33.54 200.00  0.00
 0   0   0   0.04 2.90 2.90   0  99.96   0.00   0.00   0.00   0.00   0.00   0.00   0.00  65.33 19.02 100.00  0.00
 0   0  18   0.04 2.90 2.90   0  99.96
 0   1   1   0.05 2.90 2.90   0  99.95   0.00   0.00   0.00
 0   1  19   0.04 2.90 2.90   0  99.96
 0   2   2   0.04 2.90 2.90   0  99.96   0.00   0.00   0.00
 0   2  20   0.04 2.90 2.90   0  99.96
 0   3   3   0.05 2.90 2.90   0  99.95   0.00   0.00   0.00
 0   3  21  99.95 2.90 2.90   0   0.05
...
 1   1  28  99.92 2.90 2.90   0   0.08
 1   2  11   0.06 2.90 2.90   0  99.94   0.00   0.00   0.00
 1   2  29   0.05 2.90 2.90   0  99.95
```

vCPU 21 和 28 的核心均以基準處理器速度 2.9 GHz 運作中執行工作，而且所有未使用的核心也在 `C1` C-state 下同時以基準速度運作並準備好接受指令。

# AL2 的 I/O 排程器
<a name="io-scheduler"></a>

I/O 排程器是 Linux 作業系統的一部分，可排序和合併 I/O 請求，並決定它們的處理順序。

I/O 排程器是特別有益於磁性硬碟機這類的設備，其中搜尋時間可能很昂貴，而且最適合於合併主機代管請求。I/O 排程器對固態設備和虛擬化環境的影響較少。這是因為對於固態設備，循序和隨機存取沒有差異，而對於虛擬化環境，主機會提供自己的排程層。

本主題討論 Amazon Linux I/O 排程器。如需其他 Linux 發行版所使用之 I/O 排程器的詳細資訊，請參閱其各自的文件。

**Topics**
+ [支援的排程器](#supported-schedulers)
+ [預設排程器](#default-schedulers)
+ [變更排程器](#change-scheduler)

## 支援的排程器
<a name="supported-schedulers"></a>

Amazon Linux 支援以下 I/O 排程器：
+ `deadline` —「截止日期」**I/O 排程器會排序 I/O 請求，並以最有效率的順序處理它們。它保證每個 I/O 請求的開始時間。它還給與已擱置太久的 I/O 請求更高的優先順序。
+ `cfq` —「完全公平佇列」**(CFQ) I/O 排程器會嘗試在程序之間公平地分配 I/O 資源。它會排序 I/O 請求並將其插入至根據程序的佇列中。
+ `noop` —「無操作」**(noop) I/O 排程器會將所有 I/O 請求插入至 FIFO 佇列，然後將它們合併成單一請求。此排程器不會執行任何請求排序。

## 預設排程器
<a name="default-schedulers"></a>

無操作 (noop) 是 Amazon Linux 的預設 I/O 排程器。使用此排程器的原因如下：
+ 許多執行個體類型使用虛擬化設備，其中基礎主機為執行個體執行排程。
+ 固態設備用於許多執行個體類型中，其中 I/O 排程器的優勢較沒有效果。
+ 它是最少侵入性的 I/O 排程器，可視需要進行自訂。

## 變更排程器
<a name="change-scheduler"></a>

變更 I/O 排程器可以根據排程器導致更多還是更少的 I/O 請求在指定時間內完成，來增加或降低效能。這主要取決於您的工作負載、正在使用的執行個體類型世代，以及所存取的設備類型。若您變更所使用的 I/O 排程器，我們建議您使用工具 (例如 **iotop**)，來測量 I/O 效能並判斷變更是否對您的使用案例有益。

您可以使用下列命令來檢視設備的 I/O 排程器，此命令會使用 `nvme0n1` 做為範例。將以下命令中的 `nvme0n1` 替換為執行個體上 `/sys/block` 中所列出的裝置。

```
$  cat /sys/block/nvme0n1/queue/scheduler
```

若要設定設備的 I/O 排程器，請使用下列命令。

```
$  echo cfq|deadline|noop > /sys/block/nvme0n1/queue/scheduler
```

例如，若要將 *xvda* 裝置的輸入/輸出排程器從 `noop` 設定為 `cfq`，請使用下列命令。

```
$  echo cfq > /sys/block/xvda/queue/scheduler
```

# 變更 AL2 執行個體的主機名稱
<a name="set-hostname"></a>

當您在私有 VPC 中啟動執行個體時，Amazon EC2 會指派客體作業系統主機名稱。Amazon EC2 指派的主機名稱類型取決於您的子網路設定。如需 EC2 主機名稱的詳細資訊，請參閱《[Amazon EC2 使用者指南》中的 Amazon EC2 執行個體主機名稱類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html)。 *Amazon EC2 *

設定為搭配使用 IP 型命名與 IPv4 地址之 EC2 執行個體的典型 Amazon EC2 私有 DNS 名稱，看起來會如同這樣：`ip-12-34-56-78.us-west-2.compute.internal`，其中名稱由內部網域、服務 (在此案例中為 `compute`)、區域，以及私有 IPv4 地址形式所組成。當您登入執行個體時，shell 提示中會顯示此主機名稱的一部分 (例如，`ip-12-34-56-78`)。每一次當您停止並重新啟動 Amazon EC2 執行個體時 (除非您使用彈性 IP 地址)，公有 IPv4 地址便會變更，您的公有 DNS 名稱、系統主機名稱和 shell 提示也都會變更。

**重要**  
此資訊適用於 Amazon Linux。如需其他分發的詳細資訊，請參閱其特定文件。

## 變更系統主機名稱
<a name="set-hostname-system"></a>

若您已為您執行個體的 IP 地址註冊公有 DNS 名稱 (例如 `webserver.mydomain.com`)，您可以設定系統主機名稱，使您的執行個體將其自身識別為該網域的一部分。這也會變更 shell 提示，使其顯示此名稱的第一個部分，而不是由 提供的主機名稱 AWS （例如，`ip-12-34-56-78`)。若您沒有已註冊的公有 DNS 名稱，您仍然可以變更主機名稱，只是程序會有些不同。

為了讓您的主機名稱更新持續，必須確認 `preserve_hostname` 雲端初始化設定已設定為 `true`。您可以執行下列命令來編輯或新增此設定：

```
sudo vi /etc/cloud/cloud.cfg
```

如果未列出 `preserve_hostname` 設定，請將下列文字行新增至檔案結尾：

```
preserve_hostname: true
```

**將系統主機名稱變更為公有 DNS 名稱**

若您有已註冊的公有 DNS 名稱，請遵循此程序。

1. 
   + 對於 AL2：使用 **hostnamectl**命令來設定主機名稱，以反映完整網域名稱 （例如 **webserver.mydomain.com**)。

     ```
     [ec2-user ~]$ sudo hostnamectl set-hostname webserver.mydomain.com
     ```
   + 若為 Amazon Linux AMI：在您的執行個體上，在您喜愛的文字編輯器中開啟 `/etc/sysconfig/network` 組態檔案，然後變更 `HOSTNAME` 項目，使其反映完整的網域名稱 (例如 **webserver.mydomain.com**)。

     ```
     HOSTNAME=webserver.mydomain.com
     ```

1. 重新開機執行個體來套用新的主機名稱。

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

   或者，您可以使用 Amazon EC2 主控台 (在 **Instances (執行個體)** 頁面上，選取執行個體，並選取 **Instance state (執行個體狀態)**、**Reboot instance (重新啟動執行個體)**)，以重新開機。

1. 登入您的執行個體，確認主機名稱已更新。您的提示現在應該會顯示新的主機名稱 (最多顯示到第一個 ".")，而 **hostname** 命令應該會顯示完整的網域名稱。

   ```
   [ec2-user@webserver ~]$ hostname
   webserver.mydomain.com
   ```

**不使用公有 DNS 名稱變更系統主機名稱**

1. 
   + 對於 AL2：使用 **hostnamectl**命令來設定主機名稱，以反映所需的系統主機名稱 （例如 **webserver**)。

     ```
     [ec2-user ~]$ sudo hostnamectl set-hostname webserver.localdomain
     ```
   + 如為 Amazon Linux AMI：在您的執行個體上，使用您偏好的文字編輯器開啟 `/etc/sysconfig/network` 組態檔案，然後變更 `HOSTNAME` 項目，使其反映所需系統主機名稱 (例如 **webserver**)。

     ```
     HOSTNAME=webserver.localdomain
     ```

1. 在您喜愛的文字編輯器中開啟 `/etc/hosts` 檔案，然後變更開頭為 **127.0.0.1** 的項目，使其反映以下的範例，並使用您自己的主機名稱取代。

   ```
   127.0.0.1 webserver.localdomain webserver localhost4 localhost4.localdomain4
   ```

1. 重新開機執行個體來套用新的主機名稱。

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

   或者，您可以使用 Amazon EC2 主控台 (在 **Instances (執行個體)** 頁面上，選取執行個體，並選取 **Instance state (執行個體狀態)**、**Reboot instance (重新啟動執行個體)**)，以重新開機。

1. 登入您的執行個體，確認主機名稱已更新。您的提示現在應該會顯示新的主機名稱 (最多顯示到第一個 ".")，而 **hostname** 命令應該會顯示完整的網域名稱。

   ```
   [ec2-user@webserver ~]$ hostname
   webserver.localdomain
   ```

您也可以實作更多程式設計解決方案，例如指定使用者資料來設定執行個體。如果您的執行個體是 Auto Scaling 群組的一部分，您可以使用 lifecycle hook 來定義使用者資料。如需詳細資訊，請參閱《AWS CloudFormation 使用者指南》中的[啟動時在 Linux 執行個體上執行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)和[執行個體啟動時的 lifecycle hook](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#aws-resource-autoscaling-lifecyclehook--examples--Lifecycle_hook_for_instance_launch)。

## 變更 Shell 提示而不影響主機名稱
<a name="set-hostname-shell"></a>

如果您不想修改執行個體的主機名稱，但想要顯示比 提供的私有名稱更有用的系統名稱 （例如 **webserver**) AWS （例如 `ip-12-34-56-78`)，您可以編輯 shell 提示組態檔案以顯示您的系統別名，而不是主機名稱。

**將 shell 提示變更為主機別名**

1. 在 `/etc/profile.d` 中建立一個檔案，並將稱為 `NICKNAME` 的環境變數設為您希望在 shell 提示中顯示的值。例如，若要將系統別名設為 **webserver**，請執行以下命令。

   ```
   [ec2-user ~]$ sudo sh -c 'echo "export NICKNAME=webserver" > /etc/profile.d/prompt.sh'
   ```

1. 在您慣用的文字編輯器中 (例如 `/etc/bashrc` 或 `/etc/bash.bashrc`) 開啟 **vim** (Red Hat) 或 **nano** (Debian/Ubuntu) 檔案。因為 **sudo** 和 `/etc/bashrc` 的擁有者是 `/etc/bash.bashrc`，所以您需要搭配編輯器命令使用 `root`。

1. 編輯檔案，將 shell 提示變數 (`PS1`) 變更為顯示您的別名，而非主機名稱。尋找以下在 `/etc/bashrc` 或 `/etc/bash.bashrc` 中設定 shell 提示的文字 (以下也會顯示上下幾行文字以供了解上下內容；請尋找開頭為 `[ "$PS1"` 的文字)：

   ```
     # Turn on checkwinsize
     shopt -s checkwinsize
     [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
     # You might want to have e.g. tty in prompt (e.g. more virtual machines)
     # and console windows
   ```

   將該行中的 `\h` (`hostname` 的符號) 變更為 `NICKNAME` 變數的值。

   ```
     # Turn on checkwinsize
     shopt -s checkwinsize
     [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@$NICKNAME \W]\\$ "
     # You might want to have e.g. tty in prompt (e.g. more virtual machines)
     # and console windows
   ```

1. (選用) 若要將 shell 視窗的標題設為新的別名，請完成以下步驟。

   1. 建立名為 `/etc/sysconfig/bash-prompt-xterm` 的檔案。

      ```
      [ec2-user ~]$ sudo touch /etc/sysconfig/bash-prompt-xterm
      ```

   1. 使用以下命令將檔案轉換成可執行檔。

      ```
      [ec2-user ~]$ sudo chmod +x /etc/sysconfig/bash-prompt-xterm
      ```

   1. 在您喜愛的文字編輯器 (例如 `/etc/sysconfig/bash-prompt-xterm` 或 **vim**) 中開啟 **nano** 檔案。您需要使用 **sudo** 搭配編輯器命令，因為 `/etc/sysconfig/bash-prompt-xterm` 的擁有者是 `root`。

   1. 為檔案新增下行。

      ```
      echo -ne "\033]0;${USER}@${NICKNAME}:${PWD/#$HOME/~}\007"
      ```

1. 登出然後重新登入，以取得新的別名值。

## 在其他 Linux 發行版本上變更主機名稱
<a name="set-hostname-other-linux"></a>

本頁面的程序僅適用於 Amazon Linux。如需其他 Linux 分佈的詳細資訊，請參閱其特定文件和以下文章：
+ [如何將靜態主機名稱指派給執行 RHEL 7 或 Centos 7 的私有 Amazon EC2 執行個體？](https://aws.amazon.com/premiumsupport/knowledge-center/linux-static-hostname-rhel7-centos7/)

# 在 AL2 執行個體上設定動態 DNS
<a name="dynamic-dns"></a>

當您啟動 EC2 執行個體時，它會獲得指派一個公有 IP 地址和公有網域名稱系統 (DNS) 名稱，讓您可以用來在網際網路上存取它。因為 Amazon Web Services 網域中有許多主機，為保持其唯一性，這些公有名稱可能會變得相當長。典型的 Amazon EC2 公有 DNS 名稱看起來像這樣：`ec2-12-34-56-78.us-west-2.compute.amazonaws.com`，其中名稱由 Amazon Web Services 網域、服務 （在此案例中為 `compute`) AWS 區域、 和公有 IP 地址的形式組成。

動態 DNS 服務可在其網域區域內提供自訂 DNS 主機名稱，不但易記，也能和您的主機使用案例更為相關。其中有些服務也是免費的。您可以搭配 Amazon EC2 使用動態 DNS 提供者，設定執行個體在每次執行個體啟動時更新與公有 DNS 名稱相關聯的 IP 地址。您有許多可以選擇的不同提供者，至於選擇提供者和使用提供者來註冊名稱的特定詳細資訊，則在此指南的範圍之外。<a name="procedure-dynamic-dns"></a>

**搭配 Amazon EC2 使用動態 DNS**

1. 註冊動態 DNS 服務提供者，並使用其服務註冊一個公有 DNS 名稱。這項程序使用來自 [noip.com/free](https://www.noip.com/free) 的免費服務做為範例。

1. 設定動態 DNS 更新用戶端。在您具備動態 DNS 服務提供者和使用其服務註冊的公有 DNS 名稱後，請將 DNS 名稱指向您執行個體的 IP 地址。許多提供者 (包括 [noip.com](https://noip.com)) 允許您在其網站上的帳戶頁面手動執行此作業，但許多提供者也支援軟體更新用戶端。若更新用戶端正在您的 EC2 執行個體上執行，則您的動態 DNS 記錄便會在每一次 IP 地址變更時更新 (發生在關機並重新啟動之後)。在此範例中，您安裝 noip2 用戶端，該用戶端可和 [noip.com](https://noip.com) 提供的服務搭配使用。

   1. 啟用適用於 Enterprise Linux (EPEL) 的額外套件儲存庫，以取得`noip2`用戶端的存取權。
**注意**  
AL2 執行個體預設會安裝 EPEL 儲存庫的 GPG 金鑰和儲存庫資訊。如需詳細資訊，以及下載此套件的最新版本，請參閱 https：//[https://fedoraproject.org/wiki/EPEL](https://fedoraproject.org/wiki/EPEL)。

      ```
      [ec2-user ~]$ sudo amazon-linux-extras install epel -y
      ```

   1. 安裝 `noip` 套裝服務。

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

   1. 建立組態檔案。在收到提示時，輸入登入及密碼資訊，並回答後續的問題以設定用戶端。

      ```
      [ec2-user ~]$ sudo noip2 -C
      ```

1. 啟用 noip 服務。

   ```
   [ec2-user ~]$ sudo systemctl enable noip.service
   ```

1. 啟動 noip 服務。

   ```
   [ec2-user ~]$ sudo systemctl start noip.service
   ```

   此命令會啟動用戶端，接著用戶端便會讀取您先前建立的組態檔案 (`/etc/no-ip2.conf`)，更新您選擇之公有 DNS 名稱的 IP 地址。

1. 確認更新用戶端已為您的動態 DNS 名稱設定正確的 IP 地址。DNS 記錄更新需要數分鐘的時間，接著您便可以嘗試搭配您在此程序中設定的公有 DNS 名稱，使用 SSH 連線到您的執行個體。

# 使用 ec2-net-utils for AL2 設定您的網路介面
<a name="ec2-net-utils"></a>

Amazon Linux 2 AMIs 可能包含由 安裝的其他指令碼 AWS，稱為 ec2-net-utils。這些指令碼會選擇性自動化您網路介面的組態。這些指令碼僅適用於 AL2。

**注意**  
對於 Amazon Linux 2023，`amazon-ec2-net-utils`套件會在 `/run/systemd/network`目錄中產生介面特定的組態。如需詳細資訊，請參閱 * Amazon Linux 2023 使用者指南*中的[聯網服務](https://docs.aws.amazon.com/linux/al2023/ug/networking-service.html)。

如果尚未安裝套件，請使用下列命令在 AL2 上安裝套件，或者如果已安裝套件且有其他更新可用，請使用它進行更新：

```
$ yum install ec2-net-utils
```

下列元件屬於 ec2-net-utils：

udev 規則 (`/etc/udev/rules.d`)  
當網路介面連接、分離或重新連接到執行中的執行個體時識別它們，確保 hotplug 指令碼執行 (`53-ec2-network-interfaces.rules`)。將 MAC 地址映射到裝置名稱 (`75-persistent-net-generator.rules`，這會產生 `70-persistent-net.rules`)。

hotplug 指令碼  
產生適合搭配 DHCP 使用的介面組態檔 (`/etc/sysconfig/network-scripts/ifcfg-eth`*N*)。也產生路由組態檔案 (`/etc/sysconfig/network-scripts/route-eth`*N*)。

DHCP 指令碼  
每當網路介面收到新的 DHCP 租賃，此指令碼就會查詢彈性 IP 地址的執行個體中繼資料。它會為每一個彈性 IP 地址在路由政策資料庫中新增規則，以確保該地址使用正確的網路介面外送流量。它還會將每個私有 IP 地址新增至網路介面做為輔助地址。

**ec2ifup** eth*N* (`/usr/sbin/`)  
擴充標準 **ifup** 的功能。在此指令碼重新撰寫組態檔 `ifcfg-eth`*N* 和 `route-eth`*N* 之後，它會執行 **ifup**。

**ec2ifdown** eth*N* (`/usr/sbin/`)  
擴充標準 **ifdown** 的功能。在此指令碼從路由政策資料庫中移除網路介面的所有規則後，它會執行 **ifdown**。

**ec2ifscan** (`/usr/sbin/`)  
檢查是否有尚未設定的網路介面並加以設定。  
ec2-net-utils 初始版本不提供此指令碼。

使用下列命令列出 ec2-net-utils 產生的所有組態檔：

```
$ ls -l /etc/sysconfig/network-scripts/*-eth?
```

若要停用自動化，您可將 `EC2SYNC=no` 新增至對應的 `ifcfg-eth`*N* 檔案。例如，使用以下命令停用 eth1 執行個體的自動化：

```
$ sed -i -e 's/^EC2SYNC=yes/EC2SYNC=no/' /etc/sysconfig/network-scripts/ifcfg-eth1
```

若要完全停用自動化，您可使用以下命令移除套件：

```
$ yum remove ec2-net-utils
```

# 使用者提供的核心
<a name="UserProvidedKernels"></a>

如果您的 Amazon EC2 執行個體需要使用自訂核心，您可從近似所需的 AMI 開始，在您的執行個體上編譯自訂核心，然後更新開機載入程式以指向新核心。此程序會隨您 AMI 使用的虛擬化類型而異。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Linux AMI 虛擬化類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html)。

**Topics**
+ [HVM AMIs (GRUB)](#HVM_instances)
+ [全虛擬化 AMIs (PV-GRUB)](#Paravirtual_instances)

## HVM AMIs (GRUB)
<a name="HVM_instances"></a>

HVM 執行個體磁碟區視為真正的實體磁碟。此開機載入程式與有已分割磁碟和開機載入程式的裸機作業系統類似，可與目前支援的所有 Linux 發行版本一起工作。最常見的開機載入程式是 GRUB 或 GRUB2。

根據預設，GRUB 不會將其輸出傳送至執行個體主控台，因為它會造成額外的開機延遲。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[執行個體主控台輸出](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshoot-unreachable-instance.html#instance-console-console-output)。如果您要安裝自訂核心，請考慮啟用 GRUB 輸出。

您不需要指定備用核心，但我們建議您在測試新核心時備妥備用核心。當新的核心失敗時，GRUB 可備援其他核心。擁有備用核心，即使找不到新核心，執行個體也能開機。

舊版 GRUB for Amazon Linux 會使用 `/boot/grub/menu.lst`。適用於 AL2 的 GRUB2 使用 `/etc/default/grub`。 AL2 如需更新開機載入程式中預設核心的詳細資訊，請參閱 Linux 發行版的說明文件。

## 全虛擬化 AMIs (PV-GRUB)
<a name="Paravirtual_instances"></a>

使用全虛擬化 (PV) 虛擬化AMIs 在開機過程中使用稱為 *PV-GRUB* 的系統。PV-GRUB 是全虛擬化的開機載入器，執行修補過的 GNU GRUB 0.97 版本。當您啟動執行個體時，PV-GRUB 會啟動開機程序，然後鏈會載入您影像之 `menu.lst` 檔案指定的核心。

PV-GRUB 了解標準的 `grub.conf` 或 `menu.lst` 命令，能與目前支援的所有 Linux 發行版本一起工作。Ubuntu 10.04 LTS、Oracle Enterprise Linux 或 CentOS 5.x 等舊版的發行版本需要特殊的「ec2」或「xen」核心套件，而較新的發行版本則會在預設核心套件中包含所需之驅動程式。

大部分的現代全虛擬化 AMI 預設使用 PV-GRUB AKI (包括 Amazon EC2 Launch Wizard Quick Start 選單中所有可用的全虛擬化 Linux AMI)，所以您不需要採取額外步驟即可在您的執行個體上使用不同的核心，假設您要使用的核心與您的發行版本相容。在您的執行個體上執行自訂核心的最佳方式，是從近似您所需的 AMI 開始，然後在您的執行個體上編譯自訂核心並修改 `menu.lst` 檔案，以該核心開機。

您可以驗證 AMI 的核心映像是否為 PV-GRUB AKI。執行以下 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令 (替換您的內核映像 ID) 並檢查該 `Name` 欄位是否以 `pv-grub` 開頭：

```
aws ec2 describe-images --filters Name=image-id,Values=aki-880531cd
```

**Topics**
+ [PV-GRUB 的限制](#pv-grub-limitations)
+ [Configuring GRUB](#configuringGRUB)
+ [Amazon PV-GRUB 核心影像 ID](#AmazonKernelImageIDs)
+ [更新 PV-GRUB](#UpdatingPV-GRUB)

### PV-GRUB 的限制
<a name="pv-grub-limitations"></a>

PV-GRUB 具有下列限制：
+ 您不能使用 64 位元版的 PV-GRUB 啟動 32 位元的核心，反之亦然。
+ 使用 PV-GRUB AKI 時，您不能指定 Amazon ramdisk image (ARI)。
+ AWS 已測試並確認 PV-GRUB 可搭配下列檔案系統格式使用：EXT2, EXT3, EXT4、JFS、XFS 和 ReiserFS。其他檔案系統格式可能不行。
+ PV-GRUB 可以啟動使用 gzip、bzip2、lzo 和 xz 壓縮格式壓縮的核心。
+ 叢集 AMI 不支援或需要 PV-GRUB，因為它們使用全硬體虛擬化 (HVM)。雖然全虛擬化執行個體使用 PV-GRUB 開機，但 HVM 執行個體磁碟區視為真正的磁碟，而開機程序類似有已分割磁碟和開機載入器之裸機作業系統的開機程序。
+ PV-GRUB 1.03 版和舊版不支援 GPT 分割；它們只支援 MBR 分割。
+ 您若打算對 Amazon Elastic Block Store (Amazon EBS) 磁碟區使用邏輯磁碟區管理工具 (LVM)，您需要在 LVM 之外另有開機分割。然後才能利用 LVM 建立邏輯磁碟區。

### 設定虛擬虛擬的 GRUB AMIs
<a name="configuringGRUB"></a>

若要開機 PV-GRUB，GRUB `menu.lst` 檔案必須存在於影像中，此檔案最常見的位置為 `/boot/grub/menu.lst`。

下列是使用 PV-GRUB AKI 啟動 AMI 的 `menu.lst` 組態檔範例。在本例中，有兩個核心項目可供選擇：Amazon Linux 2018.03 (此 AMI 的原始核心) 和 Vanilla Linux 4.16.4 (新版的 Vanilla Linux 核心，來自 [https://www.kernel.org/](https://www.kernel.org/))。Vanilla 項目是由此 AMI 的原始項目複製而來，而 `kernel` 和 `initrd` 路徑已更新至新位置。`default 0` 參數會將開機載入器指向它發現的第一個項目 (本例中為 Vanilla 項目)，如果第一個項目開機發生問題，`fallback 1` 參數會將開機載入器指向下一個項目。

```
default 0
fallback 1
timeout 0
hiddenmenu

title Vanilla Linux 4.16.4
root (hd0)
kernel /boot/vmlinuz-4.16.4 root=LABEL=/ console=hvc0
initrd /boot/initrd.img-4.16.4

title Amazon Linux 2018.03 (4.14.26-46.32.amzn1.x86_64)
root (hd0)
kernel /boot/vmlinuz-4.14.26-46.32.amzn1.x86_64 root=LABEL=/ console=hvc0
initrd /boot/initramfs-4.14.26-46.32.amzn1.x86_64.img
```

您不需要在 `menu.lst` 檔案中指定備用核心，但我們建議您在測試新核心時備妥備用核心。當新的核心失敗時，PV-GRUB 可備援其他核心。擁有備用核心，即使找不到新核心，執行個體也能開機。

PV-GRUB 會使用它找到的第一個核心來檢查下列 `menu.lst` 的位置：
+  `(hd0)/boot/grub` 
+  `(hd0,0)/boot/grub` 
+  `(hd0,0)/grub` 
+  `(hd0,1)/boot/grub` 
+  `(hd0,1)/grub` 
+  `(hd0,2)/boot/grub` 
+  `(hd0,2)/grub` 
+  `(hd0,3)/boot/grub` 
+  `(hd0,3)/grub` 

請注意，PV-GRUB 1.03 及舊版只檢查本清單前兩個位置的其中之一。

### Amazon PV-GRUB 核心影像 ID
<a name="AmazonKernelImageIDs"></a>

所有 Amazon EC2 區域皆提供 PV-GRUB AKI，亞太區域 (大阪) 除外。32 位元和 64 位元架構類型都有 AKI。大部分的現代 AMI 都預設使用 PV-GRUB AKI。

建議您一律使用最新版的 PV-GRUB AKI，因為不是所有的 PV-GRUB AKI 版本都與所有執行個體類型相容。使用下列 [describe-images](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令取得目前區域的 PV-GRUB AKI 清單：

```
aws ec2 describe-images --owners amazon --filters Name=name,Values=pv-grub-*.gz
```

請注意，PV-GRUB 是 `ap-southeast-2` 區域唯一提供的 AKI。您應該確認您想要複製到此區域的任何 AMI 是否使用此區域提供的 PV-GRUB 版本。

下列各區域目前的 AKI ID：使用 hd0 AKI 註冊新的 AMI。

**注意**  
我們在過去提供 hd00 AKI 的區域仍繼續提供此 AKI 以保證回溯相容性。


**ap-northeast-1，亞太區域 (東京)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-f975a998  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-7077ab11  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**ap-southeast-1，亞太區域 (新加坡) 區域**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-17a40074  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-73a50110  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**ap-southeast-2，亞太區域 (雪梨)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-ba5665d9  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-66506305  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**eu-central-1，歐洲 (法蘭克福)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-1419e57b  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-931fe3fc  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**eu-west-1，歐洲 (愛爾蘭)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-1c9fd86f  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-dc9ed9af  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**sa-east-1，南美洲 (聖保羅)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-7cd34110  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-912fbcfd  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-east-1，US East (N. Virginia)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-04206613  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-5c21674b  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-gov-west-1， AWS GovCloud （美國西部）**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-5ee9573f  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-9ee55bff  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-west-1，美國西部 (加州北部)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-43cf8123  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-59cc8239  |  pv-grub-hd0\$11.05-x86\$164.gz  | 


**us-west-2，美國西部 (奧勒岡)**  

| 映像 ID | 映像名稱 | 
| --- | --- | 
|  aki-7a69931a  |  pv-grub-hd0\$11.05-i386.gz  | 
|  aki-70cb0e10  |  pv-grub-hd0\$11.05-x86\$164.gz  | 

### 更新 PV-GRUB
<a name="UpdatingPV-GRUB"></a>

建議您一律使用最新版的 PV-GRUB AKI，因為不是所有的 PV-GRUB AKI 版本都與所有執行個體類型相容。而且，並非所有區域都提供較舊的 PV-GRUB 版本；所以，如果您將使用較舊版本的 AMI 複製到不支援該版本的區域，在您更新核心映像前，都將無法開機從該 AMI 啟動的執行個體。使用下列程序檢查您執行個體的 PV-GRUB 版本，並在有需要時更新它。

**檢查您的 PV-GRUB 版本**

1. 尋找您執行個體的核心 ID。

   ```
   aws ec2 describe-instance-attribute --instance-id instance_id --attribute kernel --region region
   
   {
       "InstanceId": "instance_id", 
       "KernelId": "aki-70cb0e10"
   }
   ```

   此執行個體的核心 ID 是 `aki-70cb0e10`。

1. 檢視該核心 ID 的版本資訊。

   ```
   aws ec2 describe-images --image-ids aki-70cb0e10 --region region
   
   {
       "Images": [
           {
               "VirtualizationType": "paravirtual", 
               "Name": "pv-grub-hd0_1.05-x86_64.gz", 
               ...
               "Description": "PV-GRUB release 1.05, 64-bit"
           }
       ]
   }
   ```

   此核心影像是 PV-GRUB 1.05。如果您的 PV-GRUB 版本不是最新版 (如 [Amazon PV-GRUB 核心影像 ID](#AmazonKernelImageIDs) 中所示)，您應該使用下列程序更新它。

**更新您的 PV-GRUB 版本**

如果您的執行個體使用較舊的 PV-GRUB 版本，您應該將它更新至最新版本。

1. 從 [Amazon PV-GRUB 核心影像 ID](#AmazonKernelImageIDs) 中找出適用於您區域和處理器架構的最新 PV-GRUB AKI。

1. 停止您的執行個體。您的執行個體必須停止才能修改所用的核心影像。

   ```
   aws ec2 stop-instances --instance-ids instance_id --region region
   ```

1. 修改用於您執行個體的核心影像。

   ```
   aws ec2 modify-instance-attribute --instance-id instance_id --kernel kernel_id --region region
   ```

1. 重新啟動您的執行個體。

   ```
   aws ec2 start-instances --instance-ids instance_id --region region 
   ```

# AL2 AMI 版本通知
<a name="linux-ami-notifications"></a>

若要在有新的 Amazon Linux AMI 發佈時收到通知，您可以使用 Amazon SNS 訂閱。

如需訂閱 AL2023 通知的相關資訊，請參閱《*Amazon Linux 2023 使用者指南*》中的[接收新更新的通知](https://docs.aws.amazon.com/linux/al2023/ug/receive-update-notification.html)。

**注意**  
AL1 的標準支援已於 2020 年 12 月 31 日結束。AL1 維護支援階段已於 2023 年 12 月 31 日結束。如需 AL1 EOL 和維護支援的詳細資訊，請參閱部落格文章[更新 Amazon Linux AMI end-of-life](https://aws.amazon.com/blogs/aws/update-on-amazon-linux-ami-end-of-life/)。

**訂閱 Amazon Linux 通知**

1. 在 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 開啟 Amazon SNS 主控台。

1. 如有必要，請在導覽列中將「區域」變更為**美國東部 (維吉尼亞北部)**。您必須選取區域，您要訂閱的 SNS 通知已在該區域中建立完成。

1. 在導覽面板中依序選擇 **Subscriptions** (訂閱) 與 **Create subscription** (建立訂閱)。

1. 針對 **Create subscription (建立訂閱)** 對話方塊，執行下列作業：

   1. 【AL2】 對於**主題 ARN**，請複製並貼上下列 Amazon Resource Name (ARN)：**arn:aws:sns:us-east-1:137112412989:amazon-linux-2-ami-updates**。

   1. [Amazon Linux] 對於 **Topic ARN (主題 ARN)**，請複製下列 Amazon Resource Name (ARN)：**arn:aws:sns:us-east-1:137112412989:amazon-linux-ami-updates**。

   1. 對於 ** 通訊協定 **，選擇 ** 電子郵件 **。

   1. 針對 **Endpoint (端點)**，請輸入可用於接收通知的電子郵件地址。

   1. 選擇 **Create subscription** (建立訂閱)。

1. 您會收到確認電子郵件，主旨行為「AWS 通知 - 訂閱確認」。開啟電子郵件並選擇 **Confirm subscription (確認訂閱)** 完成訂閱。

只要有 AMI 發行，我們就會向對應主題的訂閱者傳送通知。若要停止接收這些通知，請使用下列程序取消訂閱。

**取消訂閱 Amazon Linux 通知**

1. 在 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 開啟 Amazon SNS 主控台。

1. 如有必要，請在導覽列中將「區域」變更為**美國東部 (維吉尼亞北部)**。您必須使用區域，SNS 通知已在該區域中建立完成。

1. 在導覽窗格中選取 **Subscriptions (訂閱)**，選取訂閱然後選取 **Actions (動作)**，**Delete subscriptions (刪除訂閱)**。

1. 出現確認提示時，請選擇 **Delete (刪除)**。

**Amazon Linux AMI SNS 訊息格式**  
SNS 訊息的結構描述如下所示。

```
{
    "description": "Validates output from AMI Release SNS message",
    "type": "object",
    "properties": {
        "v1": {
            "type": "object",
            "properties": {
                "ReleaseVersion": {
                    "description": "Major release (ex. 2018.03)",
                    "type": "string"
                },
                "ImageVersion": {
                    "description": "Full release (ex. 2018.03.0.20180412)",
                    "type": "string"
                },
                "ReleaseNotes": {
                    "description": "Human-readable string with extra information",
                    "type": "string"
                },
                "Regions": {
                    "type": "object",
                    "description": "Each key will be a region name (ex. us-east-1)",
                    "additionalProperties": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "Name": {
                                    "description": "AMI Name (ex. amzn-ami-hvm-2018.03.0.20180412-x86_64-gp2)",
                                    "type": "string"
                                },
                                "ImageId": {
                                    "description": "AMI Name (ex.ami-467ca739)",
                                    "type": "string"
                                }
                            },
                            "required": [
                                "Name",
                                "ImageId"
                            ]
                        }
                    }
                }
            },
            "required": [
                "ReleaseVersion",
                "ImageVersion",
                "ReleaseNotes",
                "Regions"
            ]
        }
    },
    "required": [
        "v1"
    ]
}
```

# 設定 AL2 MATE 桌面連線
<a name="amazon-linux-ami-mate"></a>

[MATE 桌面環境](https://mate-desktop.org/)已在 AMI 中預先安裝並預先設定，並具有下列說明：

"`.NET Core x.x, Mono x.xx, PowerShell x.x, and MATE DE pre-installed to run your .NET applications on Amazon Linux 2 with Long Term Support (LTS).`"

環境提供直覺式圖形使用者介面，以最少使用命令列的方式管理 AL2 執行個體。該介面使用圖形表示，例如圖示、視窗、工具列、資料夾、桌布和桌面小工具。內建的 GUI 式工具可用來執行一般工作。例如，有一些工具可用來新增和移除軟體、套用更新、組織檔案、啟動程式，以及監視系統運作狀態。

**重要**  
`xrdp` 是 AMI 中搭售的遠程桌面軟體。根據預設，`xrdp` 會使用自我簽署的 TLS 憑證來加密遠端桌面工作階段。`xrdp` 維護者 AWS 和 都不建議在生產環境中使用自我簽署憑證。而是從適當的憑證授權機構 (CA) 取得憑證，並將其安裝在您的執行個體上。如需有關 TLS 組態的詳細資訊，請參閱 `xrdp` wiki 上的 [TLS 安全層次](https://github.com/neutrinolabs/xrdp/wiki/TLS-security-layer)。

**注意**  
如果您偏好使用虛擬網路運算 (VNC) 服務而非 xrdp，請參閱[如何在執行 AL2Knowledge Center 的 Amazon EC2 執行個體上安裝 GUI](https://repost.aws/knowledge-center/ec2-linux-2-install-gui) AWS 文章。

## 先決條件
<a name="al2-mate-configure-prerequisite"></a>

若要執行本主題中顯示的命令，您必須安裝 AWS Command Line Interface (AWS CLI) 或 AWS Tools for Windows PowerShell，並設定您的 AWS 設定檔。

**選項**

1. 安裝 AWS CLI – 如需詳細資訊，請參閱*AWS Command Line Interface 《 使用者指南*》中的[安裝 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html) [和組態基本](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)概念。

1. 安裝 Tools for Windows PowerShell – 如需詳細資訊，請參閱 *AWS Tools for PowerShell 使用者指南*中的[安裝 AWS Tools for Windows PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html) 和[共用憑證](https://docs.aws.amazon.com/powershell/latest/userguide/shared-credentials-in-aws-powershell.html)。

**提示**  
除了完整安裝 之外 AWS CLI，您也可以[AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)針對直接從 啟動的瀏覽器型預先驗證 Shell，使用 AWS 管理主控台。檢查[支援的 AWS 區域](https://docs.aws.amazon.com/cloudshell/latest/userguide/supported-aws-regions.html)，以確保它在您工作的區域中可用。

## 設定 RDP 連線
<a name="al2-mate-configure-connection"></a>

請依照下列步驟，設定從本機電腦到執行 MATE 桌面環境之 AL2 執行個體的遠端桌面通訊協定 (RDP) 連線。

1. 若要取得 AMI 名稱中包含 MATE 之 AL2 的 AMI ID，您可以從本機命令列工具使用 [describe-images](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-images.html) 命令。如果您尚未安裝命令列工具，您可以直接從 AWS CloudShell 工作階段執行下列查詢。如需如何從 CloudShell 啟動 Shell 工作階段的詳細資訊，請參閱 [AWS CloudShell 入門](https://docs.aws.amazon.com/cloudshell/latest/userguide/getting-started.html)。從 Amazon EC2 主控台，您可以透過啟動執行個體，然後在 AMI 搜尋列中輸入 `MATE`，來尋找包含 MATE 的 AMI。預先安裝 MATE 的 AL2 Quick Start 會出現在搜尋結果中。

   ```
   aws ec2 describe-images --filters "Name=name,Values=amzn2*MATE*" --query "Images[*].[ImageId,Name,Description]"
   [
       [
           "ami-0123example0abc12",
           "amzn2-x86_64-MATEDE_DOTNET-2020.12.04",
           ".NET Core 5.0, Mono 6.12, PowerShell 7.1, and MATE DE pre-installed to run your .NET applications on Amazon Linux 2 with Long Term Support (LTS)."
       ],
       [
           "ami-0456example0def34",
           "amzn2-x86_64-MATEDE_DOTNET-2020.04.14",
           "Amazon Linux 2 with .Net Core, PowerShell, Mono, and MATE Desktop Environment"
       ]
   ]
   ```

   選擇適合您使用的 AMI。

1. 使用您在上一個步驟中找到的 AMI 來啟動 EC2 執行個體。設定安全群組以允許將 TCP 流量傳入到連接埠 3389。如需安全群組的詳細資訊，請參閱 [VPC 的安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。此組態可讓您使用 RDP 用戶端來連線至執行個體。

1. 使用 [SSH](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-linux-inst-ssh.html) 連線至執行個體。

1. 更新執行個體上的軟體和核心。

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

   更新完成後，將執行個體重新啟動，確認您使用的是更新中最新的套件和程式庫；在重新啟動之前，不會載入核心更新。

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

1. 重新連接至執行個體，並在 Linux 執行個體上執行下列命令，以設定 `ec2-user` 的密碼。

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

1. 安裝憑證和金鑰。

   如果您已經擁有憑證和金鑰，請將它們複製到 `/etc/xrdp/` 目錄，如下所示：
   + 憑證 – `/etc/xrdp/cert.pem`
   + 金鑰 — `/etc/xrdp/key.pem`

   如果您沒有憑證和金鑰，請使用下列命令在 `/etc/xrdp` 目錄中產生。

   ```
   $ sudo openssl req -x509 -sha384 -newkey rsa:3072 -nodes -keyout /etc/xrdp/key.pem -out /etc/xrdp/cert.pem -days 365
   ```
**注意**  
此命令會產生有效時間為 365 天的憑證。

1. 在您要連線到執行個體的電腦上開啟 RDP 用戶端 (例如，執行 Microsoft Windows 的電腦上的遠端桌面連線)。輸入 `ec2-user` 做為使用者名稱，然後輸入您在上一個步驟中設定的密碼。

**在 Amazon EC2 執行個體上停用 `xrdp`**  
您可以在 Linux 執行個體上執行下列其中一個命令，以隨時停用 `xrdp`。下列命令不會影響您透過 X11 伺服器使用 MATE 的能力。

```
[ec2-user ~]$ sudo systemctl disable xrdp
```

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

**在 Amazon EC2 執行個體上啟用 `xrdp`**  
若要重新啟用 ，`xrdp`以便您可以連線至執行 MATE 桌面環境的 AL2 執行個體，請在 Linux 執行個體上執行下列其中一個命令。

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

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

# 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)以取得詳細資訊。