努力
加油

如何在 CentOS 7.6 上配置 Apache 并发布静态网站?

在 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>

常见问题排查

  1. 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
  2. 无法访问域名:

    • 确认 DNS 解析是否正确:nslookup example.com
    • 确认防火墙是否放行 80/443 端口。
    • 确认云厂商控制台的安全组(Security Group)是否开放了入站 80/443 端口。
  3. 配置不生效:

    • 每次修改配置文件后,务必执行 sudo systemctl reload httpd 或 restart。
    • 使用 apachectl configtest 检查语法错误。

总结

在 CentOS 7.6 上部署静态网站的核心步骤是:安装 httpd -> 配置防火墙 -> 放置文件并设权 -> 配置虚拟主机 -> 绑定域名。整个过程标准化程度高,一旦掌握,后续迁移其他 Linux 发行版(如 Ubuntu/CentOS 8+)也非常容易。

记住,权限管理和SELinux是两个最大的绊脚石,规范操作可以避免 90% 的诡异问题。