跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    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_ssl 和 mod_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