Apache HTTP Server部署全攻略

发布于:2025-07-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

httpd 简介

httpd(Apache HTTP Server)是一款历史悠久的开源 Web 服务器软件,由 Apache 软件基金会开发和维护。自 1995 年首次发布以来,Apache 一直是 Web 服务器领域的领导者,以其稳定性、安全性和灵活性著称。根据 W3Techs 的最新统计,httpd 支持着全球超过 40%的网站运行,特别是在企业级应用中占据重要地位。

httpd 的主要特点包括:

  • 模块化架构:通过动态加载模块扩展功能
  • 支持多种编程语言:如 PHP、Python、Perl 等
  • 丰富的认证机制:包括基本认证、摘要认证等
  • 强大的 URL 重写功能:通过 mod_rewrite 模块实现
  • 虚拟主机支持:可在一台服务器上托管多个网站

一、环境准备

1. 系统要求

以 CentOS 7/RHEL 7 为例进行说明,建议系统满足以下最低配置:

  • CPU:1 核以上
  • 内存:1GB 以上
  • 磁盘空间:10GB 以上
  • 网络:稳定的互联网连接

2. 系统检查

在开始安装前,建议先检查系统状态:

# 检查系统版本
cat /etc/redhat-release

# 检查内核版本
uname -r

# 检查磁盘空间
df -h

# 检查内存
free -m

3. 更新系统

建议使用新安装的系统环境,确保干净无冲突。在安装前先更新系统:

# 更新系统软件包
sudo yum update -y

# 安装常用工具
sudo yum install -y wget vim net-tools

4. 防火墙配置

确保防火墙允许 HTTP(80) 和 HTTPS(443) 端口:

# 检查防火墙状态
sudo systemctl status firewalld

# 开放端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

5. SELinux 配置

如果系统启用了 SELinux,需要进行适当配置:

# 检查 SELinux 状态
getenforce

# 临时关闭(如需)
sudo setenforce 0

# 永久关闭(如需)
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

二、安装 httpd

# 安装httpd主程序
sudo yum install -y httpd

# 验证安装版本
httpd -v

# 启动服务并设置开机自启
sudo systemctl start httpd
sudo systemctl enable httpd

# 检查服务状态(应显示active/running)
sudo systemctl status httpd

# 查看监听端口(默认80)
sudo netstat -tulnp | grep httpd

三、配置防火墙

现代 Linux 系统通常使用 firewalld 作为防火墙管理工具。

# 查看防火墙状态
sudo firewall-cmd --state

# 永久开放HTTP(80)和HTTPS(443)服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 如果需要开放自定义端口(如8080)
sudo firewall-cmd --permanent --add-port=8080/tcp

# 重新加载防火墙配置
sudo firewall-cmd --reload

# 查看当前开放的端口和服务
sudo firewall-cmd --list-all

四、配置文件结构

httpd 采用模块化设计,主要文件和目录结构如下:

/etc/httpd/
├── conf/                  # 主配置目录
│   ├── httpd.conf         # 主配置文件
│   └── magic              # 文件类型识别
├── conf.d/                # 附加配置文件目录
│   ├── autoindex.conf     # 目录列表配置
│   ├── userdir.conf       # 用户目录配置
│   └── welcome.conf       # 默认欢迎页
├── conf.modules.d/        # 模块配置文件
├── logs -> ../../var/log/httpd  # 日志目录
├── modules/               # 模块文件
├── run/                   # PID文件
└── state/                 # 状态文件

/var/www/html/             # 默认网站根目录
/var/log/httpd/            # 日志目录(access_log, error_log)

五、基础配置详解

通过编辑主配置文件进行基本设置:

sudo vim /etc/httpd/conf/httpd.conf

常见配置项说明:

# 全局配置
ServerRoot "/etc/httpd"       # 服务器根目录
Listen 80                     # 监听端口
User apache                   # 运行用户
Group apache                  # 运行组
ServerAdmin webmaster@example.com # 管理员邮箱

# 主服务器配置
ServerName www.example.com:80 # 服务器域名
DocumentRoot "/var/www/html"  # 网站根目录
ErrorLog "logs/error_log"     # 错误日志路径

# 目录权限设置
<Directory "/var/www/html">
    Options Indexes FollowSymLinks  # 允许目录列表和符号链接
    AllowOverride None        # 是否允许.htaccess覆盖
    Require all granted       # 访问控制
</Directory>

# 日志格式定义
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

六、虚拟主机配置

虚拟主机允许在单台服务器上运行多个网站。

1.创建网站目录结构:

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/test.com/public_html
sudo chown -R apache:apache /var/www/example.com
sudo chown -R apache:apache /var/www/test.com

2.创建虚拟主机配置文件:

sudo vim /etc/httpd/conf.d/vhosts.conf

示例配置:

# 第一个虚拟主机
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com/public_html
    
    ErrorLog /var/log/httpd/example.com-error.log
    CustomLog /var/log/httpd/example.com-access.log combined
    
    <Directory "/var/www/example.com/public_html">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    # 重定向非www到www
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule ^(.*)$ http://www.example.com$1 [L,R=301]
</VirtualHost>

# 第二个虚拟主机
<VirtualHost *:80>
    ServerName test.com
    DocumentRoot /var/www/test.com/public_html
    ...
</VirtualHost>

七、安全加固配置

1.隐藏服务器信息:

# 在httpd.conf中添加
ServerTokens Prod       # 仅显示Apache
ServerSignature Off     # 关闭页脚签名
TraceEnable Off         # 禁用TRACE方法

2.限制敏感目录访问:

<DirectoryMatch "^/.*/\.(svn|git|ht)/">
    Require all denied
</DirectoryMatch>

<Files ".ht*">
    Require all denied
</Files>

3.禁用不必要的HTTP方法:

<Location "/">
    <LimitExcept GET POST HEAD>
        Deny from all
    </LimitExcept>
</Location>

八、SSL/TLS 配置(启用 HTTPS)

1.安装 SSL 模块:

sudo yum install -y mod_ssl openssl

2.生成证书(生产环境建议使用 Let's Encrypt):

# 创建证书目录
sudo mkdir /etc/httpd/ssl
sudo chmod 700 /etc/httpd/ssl

# 生成自签名证书(测试用)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/httpd/ssl/server.key \
    -out /etc/httpd/ssl/server.crt \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Example Inc/CN=example.com"

3.配置 HTTPS 虚拟主机:

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot "/var/www/example.com/public_html"
    
    SSLEngine on
    SSLCertificateFile /etc/httpd/ssl/server.crt
    SSLCertificateKeyFile /etc/httpd/ssl/server.key
    
    # 强制HTTP跳转到HTTPS
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    # 启用HSTS
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</VirtualHost>

九、性能优化配置

1.调整 MPM 模块(多处理模块):

sudo vim /etc/httpd/conf.modules.d/00-mpm.conf

选择事件驱动模式(适合高并发):

LoadModule mpm_event_module modules/mod_mpm_event.so

相关参数调整:

<IfModule mpm_event_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

2.启用内容压缩:

LoadModule deflate_module modules/mod_deflate.so

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript
    DeflateCompressionLevel 6
    SetOutputFilter DEFLATE
</IfModule>

3.启用缓存控制:

LoadModule expires_module modules/mod_expires.so

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 month"
    ExpiresByType text/css "access plus 1 week"
    ExpiresDefault "access plus 2 days"
</IfModule>

十、测试与验证

1.创建测试页面:

sudo bash -c 'cat > /var/www/html/index.html <<EOF
<!DOCTYPE html>
<html>
<head>
    <title>Apache Test Page</title>
    <meta charset="UTF-8">
</head>
<body>
    <h1>Apache HTTP Server Works!</h1>
    <p>Server time: <?php echo date("Y-m-d H:i:s"); ?></p>
</body>
</html>
EOF'

2.检查配置文件语法:

sudo httpd -t

3.重新加载配置:

sudo systemctl reload httpd
# 或完全重启
sudo systemctl restart httpd

4.访问测试:

  • 本地测试:curl http://localhost
  • 远程访问:浏览器输入服务器IP或域名

十一、故障排除指南

1.常见问题排查命令:

# 查看错误日志
sudo tail -50 /var/log/httpd/error_log

# 查看访问日志
sudo tail -f /var/log/httpd/access_log

# 测试端口连通性
telnet your-server-ip 80
nc -zv your-server-ip 80

# SELinux相关检查
sudo ausearch -m avc -ts recent  # 查看安全事件
sudo sealert -a /var/log/audit/audit.log  # 分析SELinux问题

2.SELinux 配置(生产环境建议保持开启):

# 临时设置
sudo setenforce 0   # 宽松模式
sudo setenforce 1   # 强制模式

# 永久设置(编辑/etc/selinux/config)
SELINUX=enforcing  # 强制模式
SELINUX=permissive # 仅记录不阻止
SELINUX=disabled   # 完全禁用

# 调整文件上下文标签
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
sudo restorecon -Rv /var/www/html

十二、进阶配置选项

1.URL 重写(mod_rewrite):

LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/var/www/html">
    RewriteEngine On
    
    # 示例1:重定向旧URL
    RewriteRule ^oldpage\.html$ newpage.html [R=301,L]
    
    # 示例2:隐藏.php扩展名
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php [L]
</Directory>

2.反向代理配置:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<Location "/app/">
    ProxyPass http://localhost:8080/
    ProxyPassReverse http://localhost:8080/
</Location>

3.HTTP/2 支持(需要 httpd 2.4.17+):

sudo yum install -y mod_http2

配置示例:

LoadModule http2_module modules/mod_http2.so

Protocols h2 http/1.1

<VirtualHost *:443>
    ...
    Protocols h2 http/1.1
    H2Direct on
</VirtualHost>

4.日志分析工具集成:

# 安装GoAccess日志分析工具
sudo yum install -y goaccess

# 生成HTML报告
goaccess /var/log/httpd/access_log -a -o /var/www/html/report.html

十三、维护与管理

1.日常维护命令:

# 检查配置更改
sudo apachectl configtest

# 优雅重启(不中断连接)
sudo apachectl graceful

# 查看已加载模块
sudo apachectl -M

# 查看完整配置
sudo apachectl -S

2.日志轮转配置:

sudo vim /etc/logrotate.d/httpd

示例配置:

/var/log/httpd/*log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        /bin/systemctl reload httpd > /dev/null 2>/dev/null || true
    endscript
}

3.监控设置:

# 安装mod_status用于服务器状态监控
sudo yum install -y mod_status

配置示例:

<Location "/server-status">
    SetHandler server-status
    Require ip 192.168.1.0/24  # 限制访问IP
</Location>

十四、备份与恢复

1.重要文件备份:

# 备份配置文件
sudo tar czvf httpd_conf_backup.tar.gz /etc/httpd/

# 备份网站数据
sudo tar czvf web_content_backup.tar.gz /var/www/

# 备份SSL证书
sudo tar czvf ssl_certs_backup.tar.gz /etc/httpd/ssl/

2.恢复步骤:

# 停止服务
sudo systemctl stop httpd

# 恢复配置
sudo tar xzvf httpd_conf_backup.tar.gz -C /

# 恢复网站内容
sudo tar xzvf web_content_backup.tar.gz -C /

# 恢复证书
sudo tar xzvf ssl_certs_backup.tar.gz -C /

# 重启服务
sudo systemctl start httpd

通过以上完整配置,您已经成功部署了一个功能全面、安全可靠的 Apache HTTP Server。根据实际业务需求,可以进一步调整和优化各项参数。