把一台刚创建好的EC2实例变成一台能对外提供服务的Web服务器,Apache往往是最稳妥的选择。它稳定、文档齐全,各种发行版的软件源里都有现成的包,安装和配置都不复杂。不过不少人在EC2上装完Apache后,打开浏览器访问公网IP却发现连不通,问题大多出在安全组没有放行端口,或者系统防火墙没关。这篇文章就把从连接实例到配置站点的完整流程梳理一遍,把容易踩的坑都标出来。

一、连接EC2实例并准备系统环境
安装Apache之前,先要通过SSH连上EC2实例。假设你的实例使用默认的Amazon Linux 2023镜像,密钥文件为mykey.pem,连接命令如下:
chmod 400 mykey.pem ssh -i mykey.pem ec2-user@你的实例公网IP
连接成功后,第一件事是更新软件源。不同的发行版命令不一样,Amazon Linux和CentOS系使用dnf或yum,Ubuntu系使用apt。更新软件源可以保证安装到的Apache是最新版本,同时把已知的安全补丁一并打上,这一步不要省略。
Amazon Linux 2023执行:
sudo dnf update -y
Ubuntu执行:
sudo apt update && sudo apt upgrade -y
这里有个常见的坑:如果你使用的是Ubuntu镜像,默认用户名是ubuntu而不是ec2-user,用错用户名会一直提示Permission denied,很多人在这个环节卡半天。另外,如果实例是在VPC私有子网里,还需要通过堡垒机或者SSM Session Manager跳转进去,直接SSH是连不上的。
二、安装Apache并启动服务
在Amazon Linux 2023或者CentOS上,Apache的软件包名叫httpd,安装命令是:
sudo dnf install -y httpd sudo systemctl start httpd sudo systemctl enable httpd sudo systemctl status httpd
在Ubuntu上,软件包名则叫apache2,命令换成:
sudo apt install -y apache2 sudo systemctl start apache2 sudo systemctl enable apache2
注意httpd和apache2虽然都是Apache HTTP Server,但目录结构和配置文件名差异很大。httpd的主配置文件在/etc/httpd/conf/httpd.conf,虚拟主机配置放在/etc/httpd/conf.d/目录下;而apache2的主配置在/etc/apache2/apache2.conf,站点配置放在/etc/apache2/sites-available/,启用站点需要用a2ensite命令做软链接。网上教程大多混用两套体系,照抄时一定要先确认自己的发行版。
启动服务后,先在本机验证一下:
curl -I http://localhost
如果返回HTTP/1.1 200 OK,说明服务本身已经跑起来了,页面对应的默认文档根目录在/var/www/html,你可以放一个测试文件进去确认。
三、配置安全组放行端口
本机能访问不代表外网能访问,EC2的安全组默认只放行了SSH的22端口。你需要到EC2控制台,找到实例对应的Security Group,编辑Inbound Rules,添加两条规则:一条是HTTP,端口80,来源0.0.0.0/0;另一条是HTTPS,端口443,来源0.0.0.0/0。
如果用AWS CLI操作也可以,示例命令如下:
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx \ --protocol tcp --port 80 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx \ --protocol tcp --port 443 --cidr 0.0.0.0/0
安全组改完后,用浏览器访问实例的公网IP,应该能看到Apache的默认测试页。如果还是不通,按顺序排查三个地方:安全组规则是否保存生效、实例是否有公网IP或者绑定了弹性IP、以及系统内部的防火墙(Amazon Linux默认没有启用firewalld,但自己开过的要检查sudo firewall-cmd --list-all)。此外VPC的路由表里必须有指向互联网网关的默认路由,否则流量根本出不去。
四、配置虚拟主机与网站目录
实际部署网站时,通常需要配置虚拟主机来支持多个域名。以Amazon Linux的httpd为例,新建一个配置文件:
sudo vi /etc/httpd/conf.d/mysite.conf
配置内容示例:
<VirtualHost *:80>
ServerName www.ipipp.com
DocumentRoot /var/www/mysite
<Directory /var/www/mysite>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog logs/mysite-error.log
CustomLog logs/mysite-access.log combined
</VirtualHost>这里的几个指令值得说明一下。Options -Indexes关闭了目录浏览,避免没有默认首页时把整个目录结构暴露出去;AllowOverride All允许站点目录下的.htaccess文件生效,WordPress这类程序依赖重写规则时会用到;Require all granted则是对所有来源放行访问。目录权限是新手最容易出错的地方,如果配置完访问报403,多半是缺少Require all granted,或者文件本身的属主不对。
创建站点目录并设置权限:
sudo mkdir -p /var/www/mysite sudo chown -R ec2-user:apache /var/www/mysite sudo chmod -R 755 /var/www/mysite
改完配置后先做语法检查再重启,避免配置错误导致服务起不来:
sudo httpd -t sudo systemctl reload httpd
reload和restart的区别也顺便提一句:reload不会断开现有连接,平滑加载新配置;restart会直接杀掉进程重启,生产环境上配置尽量用reload。
五、启用HTTPS与日常运维
现在上线一个网站基本都要求HTTPS。Let's Encrypt提供了免费的证书,配合certbot可以全自动完成申请和续期。以Amazon Linux为例:
sudo dnf install -y mod_ssl certbot python3-certbot-apache sudo certbot --apache -d www.ipipp.com
certbot会自动修改Apache配置,把80端口的请求重定向到443,并配置好证书路径。证书有效期90天,可以装个定时任务自动续期:
echo "0 3 * * * root certbot renew --quiet" | sudo tee /etc/cron.d/certbot-renew
日常运维方面,日志是最重要的排查入口。访问日志和错误日志都在/var/log/httpd/目录下(Ubuntu是/var/log/apache2/),排查403、500错误时先看error_log,里面会给出具体原因。需要诊断端口占用时用sudo ss -tlnp | grep :80,查看实时连接可以用sudo tail -f /var/log/httpd/access_log。
最后,别忘了把服务加入开机自启,前面的systemctl enable已经做了这件事,但建议在实例重启后用systemctl is-enabled httpd确认一次。如果后续要上负载均衡,还要记得在ELB的健康检查里把路径指向一个稳定返回200的页面,比如单独放一个health.html,避免用默认首页做健康检查时因为改版导致后端被误判下线。