跳转到内容

Apache (httpd)

Apache HTTP Server(httpd)是最广泛使用的 Web 服务器之一。本文将从安装开始,逐步介绍配置结构、虚拟主机、模块管理、SSL 证书以及 SELinux 相关设置。

版本数据实时来自 pkgseek.com

使用 DNF 安装 Apache 及常用工具:

安装 Apache
sudo dnf install httpd httpd-tools -y

安装完成后启动服务并设置为开机自启:

启动并启用 httpd
sudo systemctl start httpd
sudo systemctl enable httpd

验证服务运行状态:

检查 httpd 状态
sudo systemctl status httpd

开放防火墙的 HTTP 和 HTTPS 端口:

配置防火墙
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

打开浏览器访问服务器 IP 地址,如果看到默认测试页面,说明安装成功。

Apache 的配置文件分布在多个目录中,了解其结构有助于日后维护:

路径说明
/etc/httpd/conf/httpd.conf主配置文件
/etc/httpd/conf.d/额外配置片段目录(.conf 文件自动加载)
/etc/httpd/conf.modules.d/模块加载配置目录
/var/www/html/默认网站根目录
/var/log/httpd/日志目录(access_log、error_log)

查看主配置文件中的关键参数:

查看主配置文件(过滤注释和空行)
grep -v '^\s*#' /etc/httpd/conf/httpd.conf | grep -v '^$'

常见的全局配置项包括:

httpd.conf 关键配置项
ServerRoot "/etc/httpd"
Listen 80
ServerAdmin root@localhost
ServerName your-domain.com:80
DocumentRoot "/var/www/html"

修改配置后务必检查语法再重载:

检查配置语法并重载
sudo apachectl configtest
sudo systemctl reload httpd

虚拟主机允许在一台服务器上托管多个网站。推荐在 /etc/httpd/conf.d/ 下为每个站点创建独立配置文件。

创建网站目录结构
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/example.com/log
echo '<h1>Welcome to example.com</h1>' | sudo tee /var/www/example.com/html/index.html

设置目录所有权:

设置目录权限
sudo chown -R apache:apache /var/www/example.com
创建虚拟主机配置文件
sudo tee /etc/httpd/conf.d/example.com.conf << 'EOF'
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/html
ErrorLog /var/www/example.com/log/error.log
CustomLog /var/www/example.com/log/access.log combined
<Directory /var/www/example.com/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
测试配置并重载
sudo apachectl configtest
sudo systemctl reload httpd

如需添加更多站点,重复上述步骤并创建对应的 .conf 文件即可。

Apache 通过模块扩展功能。EL 系统中模块配置位于 /etc/httpd/conf.modules.d/ 目录。

列出所有已加载模块
httpd -M

mod_sslmod_rewrite 为例:

安装 mod_ssl
sudo dnf install mod_ssl -y

mod_rewrite 已包含在 httpd 默认安装中,只需确认已加载:

确认 mod_rewrite 已加载
httpd -M | grep rewrite

在虚拟主机或目录配置中设置 AllowOverride All 即可启用 .htaccess 文件中的重写规则。创建一个示例 .htaccess

创建 .htaccess 重写示例
sudo tee /var/www/example.com/html/.htaccess << 'EOF'
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
EOF

安装 mod_ssl 后会自动生成自签名证书,可直接通过 HTTPS 访问。证书位于:

  • 证书:/etc/pki/tls/certs/localhost.crt
  • 私钥:/etc/pki/tls/private/localhost.key

使用 Let’s Encrypt 免费证书(生产环境)

Section titled “使用 Let’s Encrypt 免费证书(生产环境)”

安装 Certbot:

安装 Certbot
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y

申请证书:

使用 Certbot 申请证书
sudo certbot --apache -d example.com -d www.example.com

Certbot 会自动修改 Apache 配置并配置 HTTPS 虚拟主机。

测试自动续期
sudo certbot renew --dry-run

Certbot 安装后会自动创建 systemd timer 来处理证书续期。确认 timer 已启用:

确认续期 timer 状态
sudo systemctl status certbot-renew.timer

如果需要手动配置,参考以下模板:

SSL 虚拟主机配置示例
sudo tee /etc/httpd/conf.d/example.com-ssl.conf << 'EOF'
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example.com/html
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/example.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/example.com.key
SSLCertificateChainFile /etc/pki/tls/certs/chain.crt
<Directory /var/www/example.com/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF

在启用 SELinux 的系统上,Apache 受到额外的安全策略限制。以下是常见场景的处理方法。

查看 SELinux 状态
getenforce
sestatus

如果将网站文件放在非默认目录(非 /var/www/),需要设置正确的 SELinux 上下文:

设置自定义目录的 SELinux 上下文
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/www

当 Apache 需要反向代理或连接后端数据库时:

允许 httpd 发起网络连接
sudo setsebool -P httpd_can_network_connect on
允许 httpd 连接数据库
sudo setsebool -P httpd_can_network_connect_db on
允许 httpd 发送邮件
sudo setsebool -P httpd_can_sendmail on

如果启用了 UserDir 模块:

允许 httpd 访问用户家目录
sudo setsebool -P httpd_enable_homedirs on

如果 Apache 监听非标准端口(如 8080),需要将其添加到 SELinux 策略:

添加自定义端口到 SELinux
sudo semanage port -a -t http_port_t -p tcp 8080

如果遇到 SELinux 导致的问题,可以查看审计日志:

排查 SELinux 拒绝记录
sudo ausearch -m avc -ts recent
sudo sealert -a /var/log/audit/audit.log

安装 setroubleshoot 工具可以获得更详细的建议:

安装 SELinux 排错工具
sudo dnf install setroubleshoot-server -y
httpd 日常运维命令
# 启动 / 停止 / 重启 / 重载
sudo systemctl start httpd
sudo systemctl stop httpd
sudo systemctl restart httpd
sudo systemctl reload httpd
# 查看实时访问日志
sudo tail -f /var/log/httpd/access_log
# 查看实时错误日志
sudo tail -f /var/log/httpd/error_log
# 查看 httpd 版本与编译参数
httpd -V
# 列出所有虚拟主机配置
httpd -S