AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用该服务。了解更多
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
LAMP的教程 AWS Cloud9
本教程允许您设置和运行 LAMP (Linux, Apache HTTP服务器,MySQL,以及 PHP) 在 AWS Cloud9 开发环境中。
按照本教程并创建此示例可能会导致向您收取费用 AWS 账户。其中包括亚马逊弹性计算云 (AmazonEC2) AWS 服务 等可能产生的费用。有关更多信息,请参阅 Amazon EC2 定价
先决条件
在使用此示例之前,请确保您的设置满足以下要求:
-
您必须拥有现有的 AWS Cloud9 EC2开发环境。此示例假设您的EC2环境已连接到运行 Amazon Linux 的亚马逊EC2实例,或者 Ubuntu 服务器。如果您有不同类型的环境或操作系统,可能需要按照本示例的说明来设置相关的工具。有关更多信息,请参阅 在中创建环境 AWS Cloud9。
-
您已经打开了 AWS Cloud9 IDE适用于现有环境的。当你打开一个环境时,会IDE在 Web 浏览器中 AWS Cloud9 打开该环境的。有关更多信息,请参阅 在 AWS Cloud9 中打开环境。
步骤 1:安装工具
在本步骤中,您将安装以下工具:
-
Apache HTTP服务器,一个 Web 服务器主机。
-
PHP,一种特别适合 Web 开发的脚本语言,可以嵌入到HTML。
-
MySQL,数据库管理系统。
然后,您可以通过开始完成此步骤 Apache HTTP服务器然后 MySQL.
-
确保已在实例上安装了最新的安全更新和错误修复。为此,请在的终端会话中 AWS Cloud9 IDE,运行 for (Amazon Linux) 或 f
apt update
or (yum update
Ubuntu 服务器)命令。(要开始新的终端会话,请在菜单栏上依次选择 Window(窗口)> New Terminal(新建终端)。)对于 Amazon Linux:
sudo yum -y update
对于 Ubuntu 服务器:
sudo apt -y update
-
检查是否 Apache HTTP服务器已安装。为此,请运行
httpd -v
(适用于亚马逊 Linux)或apache2 -v
(对于 Ubuntu 服务器)命令。如果成功,则输出包含 Apache HTTP服务器版本号。
如果您看到错误,请安装 Apache HTTP通过运行
install
命令进行服务器。对于 Amazon Linux:
sudo yum install -y httpd24
对于 Ubuntu 服务器:
sudo apt install -y apache2
-
确认是否 PHP 已通过运行
php -v
命令进行安装。如果成功,则输出将包含PHP版本号。
如果您看到错误,请运行
install
命令PHP进行安装。对于 Amazon Linux:
sudo yum install -y php56
对于 Ubuntu 服务器:
sudo apt install -y php libapache2-mod-php php-xml
-
确认是否 MySQL 已通过运行
mysql --version
命令进行安装。如果成功,则输出包含 MySQL 版本号。
如果您看到错误,请安装 MySQL 通过运行
install
命令。对于 Amazon Linux:
sudo yum install -y mysql-server
对于 Ubuntu 服务器:
sudo apt install -y mysql-server
-
安装之后 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
-
启动 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 命令行客户端。
-
实施 MySQL 的安全最佳实践 MySQL 通过在中的终端会话中运行以下命令进行安装 AWS Cloud9 IDE。
sudo mysql_secure_installation
-
在提示时,按照说明回答以下问题。
对于 Amazon Linux:
-
输入当前的根密码(如无密码,按 Enter) – 按
Enter
(如无密码)。 -
设置根密码 – 键入
Y
,然后按Enter
。 -
新建密码 – 键入密码,然后按
Enter
。 -
重新输入新密码 – 再次键入密码,然后按
Enter
。(请务必将密码存储在安全位置以便以后使用。) -
删除匿名用户 – 键入
Y
,然后按Enter
。 -
禁止远程根登录 – 键入
Y
,然后按Enter
。 -
删除测试数据库以及对它的访问 – 键入
Y
,然后按Enter
。 -
立即重新加载权限表 – 键入
Y
,然后按Enter
。
对于 Ubuntu 服务器:
-
你想设置VALIDATEPASSWORD插件吗?回
y
车,然后按Enter
。 -
有三个密码验证策略级别 – 输入
0
、1
或2
,然后按Enter
。 -
新建密码 – 输入密码,然后按
Enter
。 -
重新输入新密码 – 再次输入密码,然后按
Enter
。务必将密码存储在安全位置以便以后使用。 -
是否希望继续使用提供的密码 – 输入
y
,然后按Enter
。 -
删除匿名用户 – 输入
y
,然后按Enter
。 -
禁止远程根登录 – 输入
y
,然后按Enter
。 -
删除测试数据库以及对它的访问 – 输入
y
,然后按Enter
。 -
立即重新加载权限表 – 输入
y
,然后按Enter
。
-
-
要直接与之互动 MySQL,启动 MySQL 通过运行以下命令以 root 用户身份运行命令行客户端。在提示时,键入您之前设置的根用户的密码,然后按
Enter
。当你进入mysql>
时,提示会更改为 MySQL 命令行客户端。sudo mysql -uroot -p
-
要退出 MySQL 命令行客户端,运行以下命令。提示符变回
$
。exit;
步骤 3:设置网站
在此步骤中,您将设置默认网站根目录 Apache HTTP具有推荐所有者和访问权限的服务器。然后你创建一个 PHP基于该默认网站根目录下的网页。
然后,您可以通过在 Amazon 中设置安全组,在 Amazon Virtual Private Cloud (Ama EC2 zonACL) 中设置与此EC2环境关联的网络访问控制列表(网络VPC),使传入的网络流量能够查看该网页。每个EC2环境都必须同时与 Amazon 中的安全组EC2和亚马逊的网络ACL相关联VPC。但是,尽管ACL中的默认网络 AWS 账户 允许环境的所有传入和传出流量,但默认安全组仅允许通过端口 22 的传入流量。SSH有关更多信息,请参阅 VPC AWS Cloud9 开发环境的设置。
然后,您可以成功地从外部查看网页,从而完成此步骤 AWS Cloud9 IDE。
-
为设置默认网站根目录 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.
-
创建一个 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 命令还将文件的所有者更改为
web-content
,将文件组更改read/write for the user, and read/execute为,并将该组和其他人的文件权限更改为。ec2-user
对于 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(); ?>
-
通过在 Amazon ACL 中设置网络VPC和与此EC2环境关联的安全组 Amazon,允许通过端口 80 EC2 的传入网络流量查看新网页。要执行此操作,按照以下顺序运行下面的八个命令,一次运行一个命令。要了解每个命令的作用,请阅读每个命令的
#
字符后的信息。重要
运行以下命令允许所有EC2环境以及与此环境的安全组和网络ACL关联的 Amazon EC2 实例通过端口 80 传入 Web 流量。这可能会导致该环境和 Amazon 实例以外的EC2环境和 Amazon EC2 实例意外启用通过端口 80 的传入网络流量。
注意
下面的第二到第四个命令启用安全组来允许端口 80 上的传入 Web 流量。如果您的默认安全组仅允许通过端口 22 的传入SSH流量,则必须运行第一个命令,然后运行第二个到第四个命令。但是,如果您有已经允许端口 80 上的传入 Web 流量的自定义安全组,则可以跳过运行这些命令。
以下第五至第八条命令使网络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.
-
获URL取 Web 服务器根目录中的
index.php
文件。为此,请运行以下命令,然后使用新的 Web 浏览器选项卡或与显示的 AWS Cloud9 IDE不同URL的 Web 浏览器。如果成功,网页将显示以下信息 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 流量。
注意
以下第五至第八条命令删除了现有规则,以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 中删除环境。