LAMP 的教學課程 AWS Cloud9 - AWS Cloud9

AWS Cloud9 不再提供給新客戶。的現有客戶 AWS Cloud9 可以繼續正常使用服務。進一步了解

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

LAMP 的教學課程 AWS Cloud9

本教學課程可讓您設定和執行 LAMP (Linux, Apache HTTP 伺服器、MySQL 和 PHP) AWS Cloud9 。

遵循本教學課程並建立此範例可能會導致 收費 AWS 帳戶。這包括 Amazon Elastic Compute Cloud (Amazon EC2) AWS 服務 等的可能費用。如需詳細資訊,請參閱 Amazon EC2 Pricing

必要條件

在您使用此範例前,請務必確認您的設定符合下列要求:

  • 您必須具有現有的 AWS Cloud9 EC2開發環境。此範例假設您已擁有連線至執行 Amazon Linux 或 的 Amazon EC2執行個體EC2的環境 Ubuntu 伺服器。如果您有不同類型的環境或作業系統,您可能需要依照此範例的說明來設定相關工具。如需詳細資訊,請參閱在 中建立環境 AWS Cloud9

  • 您已經開啟現有環境的 AWS Cloud9 IDE。當您開啟環境時,請在 Web 瀏覽器中 AWS Cloud9 開啟該環境IDE的 。如需詳細資訊,請參閱在 AWS Cloud9 中開啟環境

步驟 1:安裝工具

在此步驟中,您將安裝下列工具:

  • Apache HTTP 伺服器,Web 伺服器主機。

  • PHP,一種特別適合 Web 開發的指令碼語言,可以內嵌到 中HTML。

  • MySQL,這是一種關聯式資料庫管理系統。

然後,您可以開始完成此步驟 Apache HTTP 伺服器,然後 MySQL.

  1. 確保已在執行個體上安裝最新安全性更新和錯誤修正。若要這麼做,請在 的終端機工作階段中 AWS Cloud9 IDE,針對 yum update (Amazon Linux) 或apt update針對 (Ubuntu 伺服器) 命令。(若要啟動新終端機工作階段,請在選單列上,選擇 Window (視窗)、New Terminal (新增終端機)。

    針對 Amazon Linux:

    sudo yum -y update

    用於 Ubuntu 伺服器:

    sudo apt -y update
  2. 檢查 是否 Apache HTTP 伺服器已安裝。若要這麼做,請執行 httpd -v(適用於 Amazon Linux) 或 apache2 -v(適用於 Ubuntu 伺服器) 命令。

    如果成功,輸出會包含 Apache HTTP 伺服器版本號碼。

    如果您看到錯誤,請安裝 Apache HTTP 透過執行 install命令來存取伺服器。

    針對 Amazon Linux:

    sudo yum install -y httpd24

    用於 Ubuntu 伺服器:

    sudo apt install -y apache2
  3. 確認是否 PHP 已透過執行 php -v命令安裝 。

    如果成功,輸出會包含PHP版本號碼。

    如果您看到錯誤,請PHP執行 install命令來安裝 。

    針對 Amazon Linux:

    sudo yum install -y php56

    用於 Ubuntu 伺服器:

    sudo apt install -y php libapache2-mod-php php-xml
  4. 確認是否 MySQL 已透過執行 mysql --version命令安裝 。

    如果成功,輸出會包含 MySQL 版本編號。

    如果您看到錯誤,請安裝 MySQL 執行 install命令。

    針對 Amazon Linux:

    sudo yum install -y mysql-server

    用於 Ubuntu 伺服器:

    sudo apt install -y mysql-server
  5. 安裝 之後 Apache HTTP 伺服器、PHP 和 MySQL,啟動 Apache HTTP 伺服器,然後執行下列命令來確認已啟動。

    若為 Amazon Linux (您可能需要執行此命令兩次):

    sudo service httpd start && sudo service httpd status

    用於 Ubuntu 伺服器 (若要返回命令提示字元,請按 q):

    sudo service apache2 start && sudo service apache2 status
  6. Start MySQL,然後執行下列命令來確認已啟動。

    針對 Amazon Linux:

    sudo service mysqld start && sudo service mysqld status

    用於 Ubuntu 伺服器 (若要返回命令提示字元,請按 q):

    sudo service mysql start && sudo service mysql status

步驟 2:設定 MySQL

在此步驟中,您會設定 MySQL 要遵循 MySQL 安全最佳實務。這些安全最佳實務包括為根帳戶設定密碼,以及移除可從本機主機外部存取的根帳戶。要注意的其他最佳實務是移除匿名使用者、移除測試資料庫,以及移除允許任何人存取名稱開頭為 test_ 之資料庫的權限。

然後,練習開始和結束 MySQL 命令列用戶端。

  1. 實作 MySQL 的安全最佳實務 MySQL 在 的終端機工作階段中執行下列命令進行安裝 AWS Cloud9 IDE。

    sudo mysql_secure_installation
  2. 出現提示時,回答下列指定的問題。

    針對 Amazon Linux:

    1. 輸入根目錄目前使用的密碼 (若無密碼,請按 Enter) – 按 Enter (若沒有密碼)。

    2. 設定根密碼 - 輸入 Y,然後按 Enter

    3. 新密碼 - 輸入密碼,然後按 Enter

    4. 重新輸入新密碼 - 重新輸入密碼,然後按 Enter。(請務必將密碼存放在安全位置,以供日後使用。)

    5. 移除匿名使用者 - 輸入 Y,然後按 Enter

    6. 不允許從遠端進行根登入 - 輸入 Y,然後按 Enter

    7. 移除測試資料庫和其存取權 - 輸入 Y,然後按 Enter

    8. 立即重新載入權限表格 - 輸入 Y,然後按 Enter

    用於 Ubuntu 伺服器:

    1. 是否要設定VALIDATEPASSWORD外掛程式 – 輸入 y,然後按 Enter

    2. 有三種層級的密碼驗證政策 - 輸入 012,然後按 Enter

    3. 新密碼 - 輸入密碼,然後按 Enter

    4. 重新輸入新密碼 - 重新輸入密碼,然後按 Enter。請務必將密碼存放在安全位置,以供日後使用。

    5. 是否要繼續使用已提供的密碼 - 輸入 y,然後按 Enter

    6. 移除匿名使用者 - 輸入 y,然後按 Enter

    7. 不允許從遠端進行根登入 - 輸入 y,然後按 Enter

    8. 移除測試資料庫和其存取權 - 輸入 y,然後按 Enter

    9. 立即重新載入權限表格 - 輸入 y,然後按 Enter

  3. 若要直接與 互動 MySQL,啟動 MySQL 命令列用戶端作為根使用者,執行下列命令。出現提示時,輸入您先前設定的根使用者密碼,然後按 Enter。當您在 中mysql>時,提示會變更為 MySQL 命令列用戶端。

    sudo mysql -uroot -p
  4. 若要結束 MySQL 命令列用戶端,請執行下列命令。提示會變回 $

    exit;

步驟 3:設定網站

在此步驟中,您會為 設定預設網站根目錄 Apache HTTP 具有建議擁有者和存取許可的伺服器。然後建立 PHP該預設網站根內以 為基礎的網頁。

然後,您可以在 Amazon 中設定安全群組,EC2並在與此EC2環境相關聯的 Amazon Virtual Private Cloud (Amazon ACL) 中設定網路存取控制清單 (網路 VPC),以啟用傳入 Web 流量來檢視該網頁。每個EC2環境都必須與 Amazon 中的安全群組EC2和 Amazon ACL中的網路建立關聯VPC。不過,即使 ACL中的預設網路 AWS 帳戶 允許環境的所有傳入和傳出流量,預設安全群組仍僅允許SSH使用連接埠 22 的傳入流量。如需詳細資訊,請參閱VPC AWS Cloud9 開發環境的設定

然後,您可以透過成功從 外部檢視網頁來完成此步驟 AWS Cloud9 IDE。

  1. 設定 的預設網站根目錄 Apache HTTP 具有建議擁有者和存取許可的伺服器 (/var/www/html)。若要執行此作業,請在 中的終端機工作階段中執行下列六個命令,一次一個命令,順序如下 AWS Cloud9 IDE。若要了解每個命令的作用,請閱讀每個命令的 # 字元後面的資訊。

    針對 Amazon Linux:

    sudo groupadd web-content # Create a group named web-content. sudo usermod -G web-content -a ec2-user # Add the user ec2-user (your default user for this environment) to the group web-content. sudo usermod -G web-content -a apache # Add the user apache (Apache HTTP Server) to the group web-content. sudo chown -R ec2-user:web-content /var/www/html # Change the owner of /var/www/html and its files to user ec2-user and group web-content. sudo find /var/www/html -type f -exec chmod u=rw,g=rx,o=rx {} \; # Change all file permissions within /var/www/html to user read/write, group read-only, and others read/execute. sudo find /var/www/html -type d -exec chmod u=rwx,g=rx,o=rx {} \; # Change /var/www/html directory permissions to user read/write/execute, group read/execute, and others read/execute.

    用於 Ubuntu 伺服器:

    sudo groupadd web-content # Create a group named web-content. sudo usermod -G web-content -a ubuntu # Add the user ubuntu (your default user for this environment) to the group web-content. sudo usermod -G web-content -a www-data # Add the user www-data (Apache HTTP Server) to the group web-content. sudo chown -R ubuntu:web-content /var/www/html # Change the owner of /var/www/html and its files to user ubuntu and group web-content. sudo find /var/www/html -type f -exec chmod u=rw,g=rx,o=rx {} \; # Change all file permissions within /var/www/html to user read/write, group read-only, and others read/execute. sudo find /var/www/html -type d -exec chmod u=rwx,g=rx,o=rx {} \; # Change /var/www/html directory permissions to user read/write/execute, group read/execute, and others read/execute.
  2. 建立 PHP在 index.php 的預設網站根資料夾中名為 的 型網頁 Apache HTTP 透過執行下列命令來存取伺服器 (即 /var/www/html)。

    針對 Amazon Linux:

    sudo touch /var/www/html/index.php && sudo chown -R ec2-user:web-content /var/www/html/index.php && sudo chmod u=rw,g=rx,o=rx /var/www/html/index.php && sudo printf '%s\n%s\n%s' '<?php' ' phpinfo();' '?>' >> /var/www/html/index.php

    上述 Amazon Linux 命令也會將檔案的擁有者變更為 ec2-user、將檔案的群組變更為 web-content,以及將檔案read/write for the user, and read/execute的群組和其他 許可變更為 。

    用於 Ubuntu 伺服器:

    sudo touch /var/www/html/index.php && sudo chown -R ubuntu:web-content /var/www/html/index.php && sudo chmod u=rw,g=rx,o=rx /var/www/html/index.php && sudo printf '%s\n%s\n%s' '<?php' ' phpinfo();' '?>' >> /var/www/html/index.php

    的上述命令 Ubuntu 伺服器也會將檔案的擁有者變更為 ubuntu、將檔案的群組變更為 web-content,以及將檔案read/write for the user, and read/execute的群組和其他 許可變更為 。

    如果成功,上述命令會以下列內容建立 index.php 檔案。

    <?php phpinfo(); ?>
  3. 透過連接埠 80 啟用傳入 Web 流量,透過設定 Amazon ACL中的網路VPC和與此EC2環境EC2相關聯的安全群組 Amazon 來檢視新網頁。若要這樣做,請依照下列順序執行以下八個命令,一次一個。若要了解每個命令的作用,請閱讀每個命令的 # 字元後面的資訊。

    重要

    執行下列命令會針對與此環境的安全群組和網路相關聯的所有EC2環境和 Amazon EC2執行個體,透過連接埠 80 啟用傳入 Web ACL 流量。這可能會導致意外地透過連接埠 80 為環境和此EC2以外 Amazon EC2執行個體啟用傳入 Web 流量。

    注意

    以下第二個到第四個命令可讓安全群組允許透過連接埠 80 傳入的 web 流量。如果您有允許透過連接埠 22 傳入SSH流量的預設安全群組,則必須執行第一個命令,然後執行這些第二到第四個命令。不過,如果您有一個自訂安全群組,已允許透過連接埠 80 傳入的 Web 流量,則可以略過執行那些命令。

    下列第 5 到第 8 個命令可讓網路ACL允許透過連接埠 80 傳入的 Web 流量。如果您有預設網路 ACL,已允許所有連接埠的所有傳入流量,則可以安全地略過這些命令。不過,假設您的自訂網路不允許透過連接埠 ACL 80 傳入的 Web 流量。然後,執行第一個命令,接著執行第五到第八個命令。

    MY_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) # Get the ID of the instance for the environment, and store it temporarily. MY_SECURITY_GROUP_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SecurityGroups[0].GroupId' --output text) # Get the ID of the security group associated with the instance, and store it temporarily. aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --protocol tcp --cidr 0.0.0.0/0 --port 80 # Add an inbound rule to the security group to allow all incoming IPv4-based traffic over port 80. aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --ip-permissions IpProtocol=tcp,Ipv6Ranges='[{CidrIpv6=::/0}]',FromPort=80,ToPort=80 # Add an inbound rule to the security group to allow all incoming IPv6-based traffic over port 80. MY_SUBNET_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SubnetId' --output text) # Get the ID of the subnet associated with the instance, and store it temporarily. MY_NETWORK_ACL_ID=$(aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$MY_SUBNET_ID --query 'NetworkAcls[].Associations[0].NetworkAclId' --output text) # Get the ID of the network ACL associated with the subnet, and store it temporarily. aws ec2 create-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --protocol tcp --rule-action allow --rule-number 10000 --cidr-block 0.0.0.0/0 --port-range From=80,To=80 # Add an inbound rule to the network ACL to allow all IPv4-based traffic over port 80. Advanced users: change this suggested rule number as desired. aws ec2 create-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --protocol tcp --rule-action allow --rule-number 10100 --ipv6-cidr-block ::/0 --port-range From=80,To=80 # Add an inbound rule to the network ACL to allow all IPv6-based traffic over port 80. Advanced users: change this suggested rule number as desired.
  4. 將 URL取得至 Web 伺服器根目錄內的index.php檔案。若要執行此作業,請執行下列命令,並使用新的 Web 瀏覽器索引標籤或與 AWS Cloud9 IDE不同的 Web 瀏覽器,前往URL顯示的 。如果成功,網頁會顯示有關 的資訊 Apache HTTP 伺服器、MySQL, PHP、 和其他相關設定。

    MY_PUBLIC_IP=$(curl http://169.254.169.254/latest/meta-data/public-ipv4) && echo http://$MY_PUBLIC_IP/index.php # Get the URL to the index.php file within the web server root.

步驟 4:清理

假設您想要繼續使用此環境,但想要停用透過連接埠 80 傳入的 Web 流量。然後,以下列順序執行下列八個命令,一次一個,以刪除您在與環境ACL相關聯的安全群組和網路中設定的對應傳入流量規則。若要了解每個命令的作用,請閱讀每個命令的 # 字元後面的資訊。

重要

執行下列命令會針對與此環境的安全群組和網路相關聯的所有EC2環境和 Amazon EC2執行個體,停用透過連接埠 80 傳入ACL的 Web 流量。這可能會導致意外停用此EC2環境和 Amazon EC2執行個體以外透過連接埠 80 傳入的 Web 流量。

注意

下列第 5 到第 8 個命令會移除現有的規則,以封鎖網路ACL允許透過連接埠 80 傳入的 Web 流量。如果您有預設網路 ACL,已允許所有連接埠的所有傳入流量,則可以略過執行這些命令。不過,假設您有一個自訂網路ACL,其中包含允許透過連接埠 80 傳入 Web 流量的現有規則,而且您想要刪除這些規則。然後,您需要執行第一個命令,接著執行第五到第八個命令。

MY_INSTANCE_ID=$(curl http://169.254.169.254/latest/meta-data/instance-id) # Get the ID of the instance for the environment, and store it temporarily. MY_SECURITY_GROUP_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SecurityGroups[0].GroupId' --output text) # Get the ID of the security group associated with the instance, and store it temporarily. aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --protocol tcp --cidr 0.0.0.0/0 --port 80 # Delete the existing inbound rule from the security group to block all incoming IPv4-based traffic over port 80. aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP_ID --ip-permissions IpProtocol=tcp,Ipv6Ranges='[{CidrIpv6=::/0}]',FromPort=80,ToPort=80 # Delete the existing inbound rule from the security group to block all incoming IPv6-based traffic over port 80. MY_SUBNET_ID=$(aws ec2 describe-instances --instance-id $MY_INSTANCE_ID --query 'Reservations[].Instances[0].SubnetId' --output text) # Get the ID of the subnet associated with the instance, and store it temporarily. MY_NETWORK_ACL_ID=$(aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$MY_SUBNET_ID --query 'NetworkAcls[].Associations[0].NetworkAclId' --output text) # Get the ID of the network ACL associated with the subnet, and store it temporarily. aws ec2 delete-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --rule-number 10000 # Delete the existing inbound rule from the network ACL to block all IPv4-based traffic over port 80. Advanced users: if you originally created this rule with a different number, change this suggested rule number to match. aws ec2 delete-network-acl-entry --network-acl-id $MY_NETWORK_ACL_ID --ingress --rule-number 10100 # Delete the existing inbound rule from the network ACL to block all IPv6-based traffic over port 80. Advanced users: if you originally created this rule with a different number, change this suggested rule number to match.

如果您已完成使用此環境,請將環境刪除,以免您的 AWS 帳戶持續產生費用。如需說明,請參閱「刪除 AWS Cloud9 中的環境」。