VPC中基于LAMP堆栈的PHP Web应用程序
本教程可能会发生成本。 使用 成本估算器 根据您的预计使用量生成成本估算。
本教程将指导您在 Ubuntu L inux 虚拟服务器上创建 A pache Web 服务器、M ySQL 数据库和 P HP 脚本,IBM Cloud 虚拟私有云(VPC)基础架构。 这种软件组合(通常称为 LAMP堆栈 )通常用于交付网站和Web应用程序。 使用 IBM Cloud VPC 可以快速部署 LAMP 堆栈,并根据需要添加日志和监控。 为了体验LAMP服务器的实际运行,您还需要安装并配置免费且开源 WordPress。
目标
- 在 VPC 中供应虚拟服务器实例 (VSI)。
- 安装最新的 Apache MySQL 和PHP软件。
- 通过安装和WordPress 来托管网站或博客。
- 配置日志记录和监视以检测中断并监视慢速性能 (可选)。
- 调整 VSI 的大小 (可选)。

- 最终用户使用 Web 浏览器访问在 VPC 上运行的 LAMP 服务器。
- VSI 配置为使用已加密的 Block Storage 卷中的数据 (可选)。
准备工作
本教程需要:
- IBM Cloud 计费帐户,
- IBM Cloud CLI,
- IBM Cloud VPC 插件 (
vpc-infrastructure
),
- IBM Cloud VPC 插件 (
terraform
以使用基础结构作为代码来供应资源,jq
以查询 JSON 文件,git
以克隆源代码存储库,
您将在 解决方案教程入门 指南中找到有关为您的操作环境下载和安装这些工具的指示信息。 要避免安装这些工具,可以使用 Cloud Shell。
创建服务
在此部分中,您将使用 IBM Cloud Shell 和 IBM Cloud CLI 来供应 VPC,子网,安全组和虚拟服务器实例 (VSI)。 虚拟服务器接口通常用于应对需求高峰,高峰过后 即可暂停或关闭,从而确保云环境完全满足您的基础设施需求。
如果您希望使用 Terraform 模板来生成这些资源,那么可以使用此处提供的模板: https://github.com/IBM-Cloud/vpc-tutorials/tree/master/vpc-lamp,并遵循 README.md中的指示信息。 此模板也可以在 Schematics中使用。
- 登录到 IBM Cloud 帐户时,启动 IBM Cloud Shell。
- 在 shell 中,您将自动登录到其中一个 IBM Cloud 区域,如果需要,可以通过运行以下命令来切换到其他区域:
ibmcloud target -r <region-name> -g <resource-group>
创建 SSH 密钥
-
在 VPC 中,SSH 密钥用于管理员访问 VSI 而不是密码。 通过运行以下命令创建 SSH 密钥,并在提示时接受缺省值。 有关 SSH 密钥的更多信息,请参阅文档 SSH 密钥。
ssh-keygen -t rsa -b 4096
以上命令在
~/.ssh
目录中生成两个文件:id_rsa
和id_rsa.pub
。 Cloud Shell 会话是 短期 会话,您在 IBM Cloud Shell 中创建的任何文件都应保存在安全位置以供将来复用。 在屏幕右上角的 Cloud Shell 中有一个下载和上载文件选项。如果您有要复用的现有 SSH 密钥,那么可以改为将其上载到 Cloud Shell 会话。
-
将SSH密钥添加到您的账户中。
SSHKEY_ID=$(ibmcloud is key-create sshkey-lamp-tutorial @$HOME/.ssh/id_rsa.pub --json | jq -r '.id')
创建 VPC,子网和安全组
-
创建 VPC。 有关更多信息,请参阅有关在控制台或 CLI 中创建 VPC 的文档。
VPC_ID=$(ibmcloud is vpc-create vpc-lamp-tutorial --json | jq -r '.id')
-
为您的VPC创建子网。
SUBNET_ID=$(ibmcloud is subnet-create subnet-lamp-1 $VPC_ID --zone $(ibmcloud target --output json | jq -r '.region.name')-1 --ipv4-address-count 256 --json | jq -r '.id')
-
为 VPC 创建安全组。
SG_ID=$(ibmcloud is security-group-create sg-lamp-1 $VPC_ID --json | jq -r '.id')
-
添加规则以将入站限制为 SSH 端口 22。
ibmcloud is security-group-rule-add $SG_ID inbound tcp --port-min 22 --port-max 22 --json
您可以将 SSH 端口的访问权限限制在一组地址中,在上述命令中使用 --remote <IP地址或 CIDR> 来限制谁可以访问该服务器,即
ibmcloud is security-group-rule-add $SG_ID inbound tcp --remote YOUR_IP_ADDRESS --port-min 22 --port-max 22 --json
-
添加规则,限制入站端口HTTP 80端口。
ibmcloud is security-group-rule-add $SG_ID inbound tcp --port-min 80 --port-max 80 --json
您还可以HTTP访问权限限制为部分地址,在上述命令中使用 --remote <IP地址或CIDR>来限制访问此服务器的用户,即
ibmcloud is security-group-rule-add $SG_ID inbound tcp --remote YOUR_IP_ADDRESS --port-min 80 --port-max 80 --json
-
添加一个规则以允许所有用户出站,这是安装软件所必需的,以后可以将其禁用或除去。
ibmcloud is security-group-rule-add $SG_ID outbound all --json
创建虚拟服务器实例
- IBM Cloud 使用最新软件定期更新 Ubuntu 映像,通过运行以下命令获取最新 Ubuntu 20.x 的映像标识。
IMAGE_ID=$(ibmcloud is images --json | jq -r '.[] | select (.name=="ibm-ubuntu-22-04-1-minimal-amd64-3") | .id')
- 创建虚拟服务器实例
NIC_ID=$(ibmcloud is instance-create vsi-lamp-1 $VPC_ID $(ibmcloud target --output json | jq -r '.region.name')-1 cx2-2x4 $SUBNET_ID --image-id $IMAGE_ID --key-ids $SSHKEY_ID --security-group-ids $SG_ID --json | jq -r '.primary_network_interface.id')
- 预留浮动 IP
FLOATING_IP=$(ibmcloud is floating-ip-reserve fip-lamp-1 --nic-id $NIC_ID --json | jq -r '.address')
- 使用 SSH 连接到服务器,请注意,可能需要一分钟时间才能通过 SSH 访问新创建的服务器。
您将需要知道用于通过浏览器访问虚拟服务器的浮动 IP。 由于先前是在 shell 变量中捕获的,因此您可以运行以下命令以获取浮动 IP 地址ssh root@$FLOATING_IP
echo $FLOATING_IP
或通过运行ibmcloud is floating-ips --json
并在结果中搜索用于创建浮动 IPfip-lamp-1
的名称。 您还可以从 Web 控制台 中找到服务器的浮动 IP 地址。
Apache MySQL, 和PHP
在本节中,您将运行命令更新 Ubuntu 软件包源,并安装最新版本的 Apache MySQL 和PHP。
当服务器首次启动时,可能已在运行系统更新并阻止您运行以下命令,您可以通过运行 ps aux | grep -i apt
来检查系统更新的状态,并等待自动化系统更新任务完成或终止任务。
- 在更新期间禁用交互方式
export DEBIAN_FRONTEND=noninteractive
- 更新软件包
apt update
- 安装 Apache
apt install apache2 -y
- 安装 MySQL
apt install mysql-server -y
- 安装 PHP
apt install php libapache2-mod-php php-mysql php-common php-cli -y
验证安装和配置
在此部分中,您将验证 Apache、MySQL 和 PHP 是否为最新版本,并且正在 Ubuntu 映像上运行。 您还将对 MySQL 实现建议的安全设置。
- 在浏览器中打开浮动IP地址,验证 Ubuntu。 你应该看到 Ubuntu欢迎页面。
验证 Ubuntu - 使用以下命令查看安装的 Apache、MySQL 和 PHP 版本。
apache2 -v
mysql -V
php -v
- 打开一个
mysql
提示。mysql
- 运行以下命令,将您的密码替换为 yourPassword。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourPassword';
- 退出
mysql
提示。exit
- 运行以下脚本来保护 MySQL 数据库。 选择最适合您首选项的选项,或者只需按 ENTER 键即可快速完成设置。
mysql_secure_installation
- 此外,您还可以使用以下命令快速创建一个 PHP 信息页面。
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
- 查看您创建的 PHP 信息页面:打开浏览器并访问
http://{FloatingIPAddress}/info.php
。 请替换您的VSI的浮动IP地址。 它看起来类似于下图。

安装和配置 WordPress
通过安装应用程序来体验 LAMP 堆栈。 以下步骤将安装开放式源代码 WordPress 平台,该平台通常用于创建 Web 站点和博客。 有关生产安装的更多信息和设置,请参阅 WordPress。
- 运行以下命令安装 Wordpress。
apt install wordpress -y
- 将 WordPress 配置为使用 MySQL 和 PHP。 运行以下命令打开文本编辑器,并创建
/etc/wordpress/config-localhost.php
文件。sensible-editor /etc/wordpress/config-localhost.php
- 将以下行复制到该文件中,并将 yourPassword 替换为您的 MySQL 数据库密码,其他值保持不变。 保存并退出该文件。
<?php define('DB_NAME', 'wordpress'); define('DB_USER', 'wordpress'); define('DB_PASSWORD', 'yourPassword'); define('DB_HOST', 'localhost'); define('WP_CONTENT_DIR', '/usr/share/wordpress/wp-content'); ?>
- 打开
mysql
提示并提供密码。mysql -u root -p
- 运行以下命令,将数据库密码替换为 yourPassword,其他值保持不变。
CREATE DATABASE wordpress;
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'yourPassword';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON wordpress.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
- 退出
mysql
提示。exit
- 将 WordPress 安装移至 Web 服务器文档根目录。
ln -s /usr/share/wordpress /var/www/html/wordpress
mv /etc/wordpress/config-localhost.php /etc/wordpress/config-default.php
- 完成 WordPress 设置并在平台上发布。 打开浏览器,访问
http://{FloatingIPAddress}/wordpress/wp-admin
。 请替换为您的实例的浮动IP地址。 它应该与下图类似。WordPress 网站正在运行
配置域
要在您的LAMP服务器上使用现有域名,请更新A记录,使其指向VSI的浮动IP地址。
服务器监视和日志管理
为了确保服务器可用性和最佳用户体验,应在每个生产服务器上启用监视。 有多个选项可用于监视 VSI 并在中央位置捕获日志以进行分析。
服务器监视
IBM Cloud Monitoring后,您可以监控VSI实例的CPU、容量、内存和网络使用情况。 如果要配置监视服务,请遵循 监视 Linux 主机 文档中概述的步骤。
服务器日志记录
您可以创建一个IBM Cloud Logs实例来管理IBM Cloud的系统和应用程序日志。
IBM Cloud Logs 为管理员、DevOps和开发人员提供了过滤、搜索和跟踪日志数据、定义警报以及设计自定义视图以监控应用程序和系统日志的高级功能
按照 管理Linux日志代理 中概述的说明进行操作
配置自带密钥 (BYOK) 加密数据卷 (可选)
VSI 是使用 100 GB 的提供者管理的加密 Boot 卷创建的,但是如果删除该 VSI,那么在删除 VSI 之前需要移动任何要保护的数据。 替代方法是创建可持久存储的 数据 卷,即使删除 VSI 并将其连接到新的 VSI 也是如此。 您还可以使用自己的密钥对卷进行加密。 如果这是您期望的结果,请遵循以下概述的步骤来创建数据卷并将其附加到 VSI。
-
创建数据卷配置文件。
VOLUME_ID=$(ibmcloud is volume-create volume-lamp-1 10iops-tier $(ibmcloud target --output json | jq -r '.region.name')-1 --capacity 100 --json | jq -r '.id')
在 VPC 中,您还可以选择使用客户管理的加密密钥。 要存储您自己的加密密钥,可以使用以下两个可用服务之一: (1) FIPS 140-2 级别 3 服务 IBM Key Protect。 请参阅文档中的 供应 IBM Key Protect 服务 主题。(2) FIPS 140-2 级别 4 服务 IBM Cloud Hyper Protect Crypto Services,请参阅文档中的 IBM Cloud Hyper Protect Crypto Services 主题入门。 创建卷时,可以将
--encryption-key
参数与 CRN 一起指定到要使用的加密密钥。 -
通过列出所有实例并根据实例名称进行过滤,捕获先前创建的 VSI 的标识:
VSI_ID=$(ibmcloud is instances --json | jq -r '.[] | select(.name == "vsi-lamp-1") | .id')
-
将数据卷连接到现有 VSI。
ibmcloud is instance-volume-attachment-add attachment-data-1 $VSI_ID $VOLUME_ID --auto-delete false --json
-
使用 SSH 连接到服务器。
ssh root@$FLOATING_IP
-
在 VSI 上配置新创建的数据卷,一次运行 1 行以下的每一行。
new_bsv=$(echo $(parted -l 2>&1) | awk 'NR==1{print $2}' | sed 's/:$//') parted $new_bsv mklabel gpt parted -a opt $new_bsv mkpart primary ext4 0% 100% new_part=${new_bsv}1 mkfs.ext4 -L lamp-data ${new_part} mkdir /data mount ${new_part} /data echo "${new_part} /data ext4 defaults,relatime 0 0" | tee -a /etc/fstab mount -a
配置 Apache 以使用新的 /data 文件系统
- 停止 Apache
service apache2 stop
- 将 Apache 目录从 /var 移至 /data
mv /var/www /data/
- 创建指向新位置的链接
ln -s /data/www /var/www
- 启动 Apache
service apache2 start
配置 MySQL 以使用新的 /data 文件系统
- 停止 MySQL
service mysql stop
- 将 MySQL 目录从 /var 移至 /data
mkdir /data/lib
mv /var/lib/mysql /data/lib/
- 创建指向新位置的链接
ln -s /data/lib/mysql /var/lib/mysql
- 在 AppArmor 中添加新位置的别名,否则 AppArmor 将阻止访问。
echo "alias /var/lib/mysql/ -> /data/lib/mysql/," >> /etc/apparmor.d/tunables/alias
- 重启 AppArmor
systemctl restart apparmor
- 启动 MySQL
service mysql start
- 打开浏览器,访问
http://{FloatingIPAddress}/wordpress
。 请替换为您的实例的浮动IP地址。 您应该能够像添加新数据卷之前一样访问 WordPress 页面。
调整 VSI 大小 (可选)
VSI 是使用 VPC 中可用的一个最小概要文件 (即 2 vCPU 和 4GiB RAM) 创建的。 可以根据您的使用需求来增加或减少可用的 vCPU 和 RAM 量,请参阅 调整虚拟服务器实例的大小。
-
通过列出所有实例并根据实例名称进行过滤,捕获先前创建的 VSI 的标识:
VSI_ID=$(ibmcloud is instances --json | jq -r '.[] | select(.name == "vsi-lamp-1") | .id')
-
停止实例。
ibmcloud is instance-stop $VSI_ID
-
调整实例大小。
ibmcloud is instance-update $VSI_ID --profile cx2-4x8
您可以通过发出以下命令
ibmcloud is instance-profiles
来获取备用概要文件列表,但请注意 调整虚拟服务器实例的大小 主题中有关根据当前/目标概要文件调整大小的限制。 -
启动实例。
ibmcloud is instance-start $VSI_ID
-
您可能需要等待几分钟,因为 VSI 已放置在相应的主机上并已启动。 打开浏览器,访问
http://{FloatingIPAddress}/wordpress
。 请替换为您的实例的浮动IP地址。 您应该能够像在调整大小之前一样访问 WordPress 页面。
除去资源
- 在 VPC控制台中,依次点击浮动IP、VSIs的IP地址,然后在操作菜单中选择 “释放”。 确认您想要发布此 IP 地址。
- 接下来,切换到 虚拟服务器实例,删除 您的实例。
- 删除 VSI 之后,切换到子网。 删除子网。
- 删除子网后,切换到 VPC 选项卡,并删除您的 VPC。
- 如果已创建可选数据卷并且不再需要该数据卷,请切换到 块存储卷 选项卡并删除该卷。
使用控制台时,您可能需要刷新浏览器以在删除资源后查看更新后的状态信息。
根据资源的不同,可能不会立即将其删除,但会保留 (缺省情况下为 7 天)。 您可以通过永久删除该资源或在保留期内将其复原来回收该资源。 请参阅本文档,以了解如何 使用资源回收。