安装 Apache 后,需要对配置文件进行自定义的设置。首先进入到 Apache 的安装目录(通常为 /usr/local/apache),这里有 4 个最常用的核心文件夹,理解它们的作用是配置的第一步:

  1. bin:二进制可执行文件目录,用于控制 Apache 服务。添加环境变量后,可直接在终端使用以下命令:

    • ab:Apache Bench,自带的压力测试工具。
    • apachectl:控制 Apache 启动/停止的脚本,实际调用 httpd 命令。
    • apxs:APache eXtenSion tool,用于编译和安装扩展模块。
    • htpasswd:建立 Basic 认证文件,设置 Web 访问的账号密码。
    • httpd:Apache 的核心控制命令。
    • rotatelogs:自带的日志轮询/切割工具。
  2. conf:用于存储 Apache 服务的配置文件。

    • httpd.conf:主配置文件,核心中的核心。
    • extra:辅助配置文件目录,包含 vhost、ssl 等子配置。
  3. htdocs:默认的站点根目录,安装后里面默认的 index.html 就是你看到的 "It works!" 页面。
  4. logs:默认的日志文件存储目录(访问日志和错误日志)。

1. 主配置文件 (httpd.conf)

        在安装 Apache 的时候我们已经保留了一份主配置文件。编辑 conf/httpd.conf,主要关注以下几点:

  1. 服务器根目录ServerRoot "根目录",指示 Apache 在哪个目录下寻找配置文件和模块。
  2. 侦听端口Listen 指令。可以删除或注释掉,建议统一在辅助文件中配置,保持主配置简洁。
  3. 加载模块LoadModule ... .so。根据后续需求开启(去掉行首的 #),例如 rewrite、ssl、http2 等模块。
  4. 运行用户和组User daemon, Group daemon
            强烈建议修改运行用户和组为特定用户(如 apache),否则后续站点文件可能出现权限问题无法更新,且使用 root 运行极不安全:

    # 创建系统用户组 apache
    groupadd -r apache
    # 创建系统用户,不创建家目录,禁止登录
    useradd -r -g apache -s /sbin/nologin -d /apache -M apache
    
    # 更改目录所有者
    chown -R apache:apache /usr/local/apache
    
    # 修改权限 (注意:777 权限在生产环境有极大安全风险,建议使用 755)
    chmod 755 -R /usr/local/apache
  5. 管理员邮箱ServerAdmin,建议在辅助文件中针对每个站点单独配置。
  6. 权限控制Directory 标签,建议在辅助文件中配置。
  7. 站点根目录DocumentRoot,建议在辅助文件中配置。
  8. 默认首页DirectoryIndex,通常设置为 index.html index.php

2. 辅助配置文件

        为了管理方便,我们通常不直接塞满主配置文件,而是启用辅助配置。请在 httpd.conf 中找到以下几行,删除行首的 # 号以启用它们:

  • Include conf/extra/httpd-vhosts.conf
  • Include conf/extra/httpd-mpm.conf
  • Include conf/extra/httpd-ssl.conf

2.1 虚拟主机设置 (httpd-vhosts.conf)

        此配置文件用于配置虚拟主机(Virtual Host)。当配置多个虚拟主机时,Apache 会对每一个请求进行判断,匹配 IP、端口、ServerName 或 ServerAlias,并做出对应响应。

  1. 常见的虚拟主机模式

    • 基于 IP:多网卡或多 IP 环境,通过请求的 IP 地址区分。
    • 基于域名(最常用):多个域名解析到同一个 IP,通过 Host 请求头区分。
    • 基于端口:不同站点监听不同端口(如 8080, 8081)。
  2. 常见配置示例

    # 侦听端口 (支持 IPv4 和 IPv6)
    Listen 80
    
    # 开启 HTTP/2 支持 (需在主配置开启 mod_http2)
    Protocols h2 h2c http/1.1
    
    # 目录访问权限控制模板
    <Directory "/data/wwwroot">
        # 跟随符号链接 (软链接)
        Options FollowSymLinks
        
        # 是否允许 .htaccess 文件覆盖配置 (固定链接通常需要开启为 All)
        AllowOverride All
        
        # 访问控制
        Require all granted
    </Directory>
    
    # 虚拟主机配置示例
    <VirtualHost *:80>
        ServerName https://www.example.com
        ServerAlias example.com
        DocumentRoot "/data/wwwroot/example"
        
        # 日志文件
        ErrorLog "logs/example-error_log"
        CustomLog "logs/example-access_log" common
    </VirtualHost>
  3. 高级技巧:禁止 IP 直接访问

    <VirtualHost *:80>
        ServerName 192.168.1.1
        <Location />
            Require all denied
        </Location>
        # 或者使用重定向将流量引流到域名
        # RedirectPermanent / https://www.example.com/
    </VirtualHost>

2.2 并发控制 (httpd-mpm.conf)

        Apache 的性能核心在于 MPM(多路处理模块)。默认通常使用 event 模式(在 Apache 2.4+ 中性能最佳)。

  1. 三种模式简介

    • prefork:非线程、多进程。稳定但内存消耗大,适合非线程安全的 PHP 模块。
    • worker:多进程、多线程。内存消耗少,并发高。
    • event:worker 的升级版,引入了 Epoll 事件处理机制,专门解决 Keep-Alive 场景下的资源占用问题。
  2. Event 模式参数调优

    <IfModule mpm_event_module>
        # 主服务能创建的最大子进程数量
        ServerLimit           16
        # 启动时创建的子进程数量
        StartServers           3
        # 最小空闲线程数,意味着小于该空闲线程时即开启新的进程
        MinSpareThreads       75
        # 最大空闲线程数,意味着大于该空闲线程时即销毁一个进程
        MaxSpareThreads      250
        # 每个子进程产生的线程数 (64的倍数推荐),当开启一个进程时即会打包开启的子线程数量
        ThreadsPerChild       64
        # 同时处理的最大请求数量 (ServerLimit * ThreadsPerChild)
        MaxRequestWorkers   1024
        # 子进程生命周期内处理的最大请求数 (0表示永不回收,建议设置数值以防内存泄漏)
        MaxConnectionsPerChild 10000
    </IfModule>

2.3 HTTPS 安全配置 (httpd-ssl.conf)

        此配置文件用于启用 SSL/HTTPS。前提:在主配置文件中开启 mod_ssl.somod_socache_shmcb.so 模块。

  1. 域名与证书准备

    • 建议使用 Cloudflare 管理 DNS(注意:国内 VPS 使用 Cloudflare 可能会导致被墙或减速)。
    • 申请证书后,将 fullchain.pem (公钥/证书链) 和 privkey.pem (私钥) 上传至服务器安全目录。
  2. SSL 核心配置

    # 监听 443 端口
    Listen 443
    
    # 全局 SSL 设置
    SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
    SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
    SSLHonorCipherOrder on
    SSLSessionTickets on
    
    # 仅允许安全的 TLS 协议
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLProxyProtocol -all +TLSv1.2 +TLSv1.3
    
    # SSL 会话缓存 (需开启 mod_socache_shmcb)
    SSLSessionCache "shmcb:logs/ssl_scache(512000)"
    
    # 虚拟主机配置
    <VirtualHost *:443>
        ServerName https://www.example.com
        DocumentRoot "/data/wwwroot/example"
        
        SSLEngine on
        
        # 证书路径配置
        SSLCertificateFile "/usr/local/apache/conf/ssl/fullchain.pem"
        SSLCertificateKeyFile "/usr/local/apache/conf/ssl/privkey.pem"
        
        # 推荐的现代加密套件 (兼容性与安全性平衡)
        SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        
        <Directory "/data/wwwroot/example">
            Options FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
  3. HTTP 自动跳转 HTTPS
    可以在 Cloudflare 后台开启 "Always Use HTTPS",或者在 Apache 的 80 端口虚拟主机中配置 Rewrite:

    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^(.*)?$ https://%{SERVER_NAME}$1 [L,R=301]