在 CentOS 7.6 上部署静态网站,Apache(httpd)依然是最稳妥、文档最丰富的选择之一。虽然 Nginx 在高并发场景下更受青睐,但对于中小规模或传统架构的静态站点,Apache 的配置逻辑清晰,且与 PHP 等后端服务的集成无缝。
以下是基于生产环境标准的实操指南,涵盖从安装、配置、安全到发布的完整流程。
1. 基础环境准备
首先,确保你拥有 root 权限或 sudo 权限。CentOS 7.6 默认使用 systemd 管理服务,防火墙是 firewalld,SELinux 处于强制模式(这是新手最容易踩坑的地方)。
# 更新系统包(可选,但建议保持最新)
sudo yum update -y
# 关闭或调整 SELinux(生产环境建议正确配置策略而非直接关闭,此处为简化演示设为 permissive)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 检查防火墙状态
sudo firewall-cmd --state
2. 安装 Apache (httpd)
CentOS 7 的软件源中,Apache 的服务名是 httpd。
sudo yum install httpd -y
安装完成后,启动服务并设置为开机自启:
sudo systemctl start httpd
sudo systemctl enable httpd
验证是否运行成功:
sudo systemctl status httpd
curl http://localhost
# 如果看到 "Testing 123.." 字样,说明安装成功
3. 开放防火墙端口
CentOS 7 默认使用 firewalld。你需要开放 HTTP (80) 和 HTTPS (443) 端口。
# 永久开放 http 服务
sudo firewall-cmd --permanent --add-service=http
# 如果涉及 SSL,也开放 https
sudo firewall-cmd --permanent --add-service=https
# 重载防火墙配置使其生效
sudo firewall-cmd --reload
此时,通过浏览器访问服务器公网 IP,应该能看到 Apache 的欢迎页面。
4. 准备静态网站文件
假设你的静态网站文件位于 /var/www/html(这是 httpd 默认的 DocumentRoot)。
最佳实践:创建独立的目录结构
不要直接在 /var/www/html 里堆砌文件,建议为每个项目创建独立目录。例如,发布一个名为 my-static-site 的网站:
# 创建网站根目录
sudo mkdir -p /var/www/my-static-site
# 上传或编写你的 HTML/CSS/JS 文件到这个目录
# 例如创建一个测试页
echo "<h1>Hello from CentOS 7.6</h1>" | sudo tee /var/www/my-static-site/index.html
关键权限设置
Apache 进程以 apache 用户身份运行。必须确保该用户对网站目录有读取权限。
# 将目录所有者改为 apache,组保持不变(通常是 root 或 apache)
sudo chown -R apache:apache /var/www/my-static-site
# 设置目录权限为 755,文件为 644
sudo find /var/www/my-static-site -type d -exec chmod 755 {} ;
sudo find /var/www/my-static-site -type f -exec chmod 644 {} ;
注意:如果你之前关闭了 SELinux 测试,这一步可能不会报错。但在生产环境中,即使开启 SELinux,只要遵循上述标准权限和上下文标签(context),通常也能正常工作。若遇到 403 Forbidden,可使用
restorecon -rv /var/www/my-static-site修复 SELinux 上下文。
5. 配置虚拟主机(Virtual Host)
为了让域名能指向这个网站,我们需要配置虚拟主机。编辑配置文件:
sudo vi /etc/httpd/conf.d/my-static-site.conf
写入以下内容:
<VirtualHost *:80>
ServerName example.com # 替换为你的域名
ServerAlias www.example.com # 如果需要支持带 www 的访问
DocumentRoot /var/www/my-static-site
# 错误日志和访问日志
ErrorLog /var/log/httpd/my-static-site-error.log
CustomLog /var/log/httpd/my-static-site-access.log combined
<Directory /var/www/my-static-site>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
参数解释:
Require all granted:允许所有客户端访问。Options Indexes FollowSymLinks:允许列出目录内容(调试用)和跟随符号链接。生产环境建议去掉Indexes以防止目录遍历泄露信息。AllowOverride None:不使用.htaccess文件,提升性能。如需重写规则,建议写在主配置文件中。
保存退出后,重新加载 Apache 配置:
sudo systemctl restart httpd
6. 域名解析与测试
在你的 DNS 服务商处,将 example.com 和 www.example.com 的 A 记录指向你的 CentOS 服务器公网 IP。
等待 DNS 生效后,在本地浏览器访问 http://example.com,你应该能看到之前创建的 index.html 内容。
7. 进阶优化与安全加固(生产环境必看)
A. 隐藏版本信息
默认情况下,Apache 会在错误页面暴露版本号,这有助于攻击者识别漏洞。修改主配置文件:
sudo vi /etc/httpd/conf/httpd.conf
找到以下行并修改:
ServerTokens Prod
ServerSignature Off
重启 Apache 生效。
B. 启用 Gzip 压缩
对于静态资源(HTML, CSS, JS, JSON),启用压缩可显著减少传输体积,加快加载速度。
在 httpd.conf 或新建的 conf.d 文件中添加:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json
</IfModule>
确保 mod_deflate 模块已加载(CentOS 7 默认包含)。
C. 启用 HTTPS(Let’s Encrypt)
HTTP 明文传输不安全,且现代浏览器会标记为“不安全”。推荐使用 Certbot 获取免费 SSL 证书。
# 安装 EPEL 源和 Certbot
sudo yum install epel-release -y
sudo yum install certbot python2-certbot-apache -y
# 获取证书(需要域名已解析且服务器可达)
sudo certbot --apache -d example.com -d www.example.com
Certbot 会自动修改 Apache 配置,重定向 HTTP 到 HTTPS,并配置 SSL。按照提示输入邮箱并接受条款即可。
D. 限制目录访问
如果你的网站有敏感文件(如 .git, .env),确保它们不被公开访问。可以在 VirtualHost 中添加:
<DirectoryMatch "/.git">
Require all denied
</DirectoryMatch>
<FilesMatch ".(env|ini|log)$">
Require all denied
</FilesMatch>
常见问题排查
-
403 Forbidden:
- 检查文件权限:
ls -l /var/www/my-static-site - 检查 SELinux:
getsebool -a | grep httpd,确保httpd_read_user_content为 on。 - 检查 Apache 错误日志:
tail -f /var/log/httpd/my-static-site-error.log
- 检查文件权限:
-
无法访问域名:
- 确认 DNS 解析是否正确:
nslookup example.com - 确认防火墙是否放行 80/443 端口。
- 确认云厂商控制台的安全组(Security Group)是否开放了入站 80/443 端口。
- 确认 DNS 解析是否正确:
-
配置不生效:
- 每次修改配置文件后,务必执行
sudo systemctl reload httpd或restart。 - 使用
apachectl configtest检查语法错误。
- 每次修改配置文件后,务必执行
总结
在 CentOS 7.6 上部署静态网站的核心步骤是:安装 httpd -> 配置防火墙 -> 放置文件并设权 -> 配置虚拟主机 -> 绑定域名。整个过程标准化程度高,一旦掌握,后续迁移其他 Linux 发行版(如 Ubuntu/CentOS 8+)也非常容易。
记住,权限管理和SELinux是两个最大的绊脚石,规范操作可以避免 90% 的诡异问题。
云技术博客