Linux 网络服务架设学习笔记(第五期)------Web 服务(上篇):Apache HTTP Server------从静态到动态
本系列更多内容可见:Linux常见服务器配置
Linux系统管理入门系列更多文章欢迎访问:Linux入门------系统管理1、Linux入门------系统管理2
我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~
引言:互联网的"门面"------Web 服务器是如何工作的?
你在浏览器中输入 www.baidu.com,按下回车,几毫秒后一个完整的页面呈现在你面前。这背后发生了什么?
简单来说,你的浏览器向一个 Web 服务器 发送了一个 HTTP 请求,Web 服务器接收到请求后,要么返回一个静态 HTML 文件,要么执行一段动态程序(如 PHP)生成内容,然后通过 HTTP 响应把结果送回浏览器。
Web 服务器是互联网的"门面"------用户接触到的每一个网站、每一个 API、每一个在线应用,背后都有一台或多台 Web 服务器在默默工作。
常见的 Web 服务器软件有:
| Web 服务器 | 特点 | 适用场景 |
|---|---|---|
| Apache HTTP Server | 模块化、稳定、功能丰富 | 传统企业应用、PHP 应用 |
| Nginx | 高性能、低内存、高并发 | 静态文件、反向代理、负载均衡 |
| Tomcat | Java Servlet 容器 | Java Web 应用 |
本期将从最经典的 Apache HTTP Server 开始,学习:
- Apache 的安装与配置文件结构
- 虚拟主机(基于域名和端口)
- SSL/TLS 加密(HTTPS)
- 动态脚本支持(CGI、PHP、Python、Ruby)
- 访问控制与认证(Basic Auth、PAM Auth)
- 日志管理与配置优化
读完这一期,你将具备独立部署和维护 Apache Web 服务器的完整能力。
--- Compiled and Authored by Whisky --- Augest 27 th, 2026
目录
- Web 服务器概述
- 1.1 HTTP 协议基础
- 1.2 常见 Web 服务器对比
- Apache HTTP Server 安装与基础配置
- 2.1 安装 Apache
- 2.2 配置文件结构
- 2.3 启动服务与防火墙配置
- 虚拟主机配置
- 3.1 基于域名的虚拟主机
- 3.2 基于端口的虚拟主机
- SSL/TLS 配置(HTTPS)
- 4.1 生成自签名证书
- 4.2 安装 mod_ssl 并配置 HTTPS 站点
- 4.3 HTTP 自动跳转 HTTPS
- 动态脚本支持
- 5.1 CGI 公共网关接口
- 5.2 Perl CGI
- 5.3 PHP 支持
- 5.4 Python CGI
- 5.5 Ruby CGI
- 访问控制与认证
- 6.1 基于 IP 的访问控制
- 6.2 Basic 认证
- 6.3 PAM 认证
- 6.4 LDAP 认证
- 日志管理
- 7.1 访问日志与错误日志
- 7.2 日志格式自定义
- 7.3 日志轮转
- 总结与速查手册
1. Web 服务器概述
1.1 HTTP 协议基础
HTTP(HyperText Transfer Protocol,超文本传输协议) 是 Web 服务器与浏览器之间的通信语言。它基于 TCP/IP,默认使用 80 端口 (HTTPS 使用 443 端口)。
一次完整的 HTTP 请求-响应过程:
text
浏览器(客户端) Web 服务器
│ │
│ ① 建立 TCP 连接(三次握手) │
│ ─────────────────────────────────────▶│
│ │
│ ② 发送 HTTP 请求报文 │
│ GET /index.html HTTP/1.1 │
│ Host: www.whisky.cloud │
│ ─────────────────────────────────────▶│
│ │
│ ③ 服务器处理请求 │
│ (读取文件或执行动态脚本) │
│ │
│ ④ 返回 HTTP 响应报文 │
│ HTTP/1.1 200 OK │
│ Content-Type: text/html │
│ Content-Length: 1024 │
│ <html>...</html> │
│ ◀─────────────────────────────────────│
│ │
│ ⑤ 关闭连接(或保持 Keep-Alive) │
HTTP 请求方法:
| 方法 | 用途 |
|---|---|
| GET | 获取资源(最常见的请求) |
| POST | 提交数据(如表单提交) |
| HEAD | 获取响应头(不获取正文) |
| PUT | 上传资源 |
| DELETE | 删除资源 |
HTTP 响应状态码:
| 类别 | 含义 | 示例 |
|---|---|---|
| 2xx | 成功 | 200 OK |
| 3xx | 重定向 | 301 永久移动、302 临时移动 |
| 4xx | 客户端错误 | 403 禁止、404 未找到 |
| 5xx | 服务器错误 | 500 内部错误、502 网关错误 |
1.2 常见 Web 服务器对比
| 维度 | Apache | Nginx | Tomcat |
|---|---|---|---|
| 定位 | 通用 Web 服务器 | 高性能 Web/代理服务器 | Java Servlet 容器 |
| 静态文件 | 优秀 | 优秀 | 一般 |
| 动态内容 | 模块化支持(PHP/Perl/Python) | 通过 FastCGI 代理 | 原生支持 JSP/Servlet |
| 并发模型 | 多进程/多线程 | 事件驱动(异步非阻塞) | 多线程 |
| 内存占用 | 较高 | 较低 | 较高 |
| 配置复杂度 | 中等 | 中等 | 中等 |
| 典型场景 | 传统 LAMP 架构 | 高并发静态/代理 | Java Web 应用 |
2. Apache HTTP Server 安装与基础配置
2.1 安装 Apache
实验环境:
- 操作系统:Rocky Linux 8 / CentOS 7
- 服务器 IP:10.1.8.10
- 主机名:www.whisky.cloud
bash
# 安装 Apache(Rocky 8/CentOS 7 中包名为 httpd)
[root@www ~]# yum install -y httpd
# 查看安装的文件
[root@www ~]# rpm -ql httpd | grep -E "conf|bin" | head -10
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/
/etc/httpd/conf.modules.d/
/usr/sbin/httpd
/usr/sbin/apachectl
2.2 配置文件结构
Apache 的配置文件采用层次化结构:
text
/etc/httpd/
├── conf/
│ └── httpd.conf ← 主配置文件
├── conf.d/ ← 额外配置目录(自动加载 *.conf)
│ ├── userdir.conf
│ ├── welcome.conf
│ └── ...
└── conf.modules.d/ ← 模块加载配置
├── 00-base.conf
├── 00-ssl.conf
└── ...
主配置文件 /etc/httpd/conf/httpd.conf 核心参数:
| 参数 | 含义 | 默认值 |
|---|---|---|
ServerRoot |
配置文件根目录 | /etc/httpd |
Listen |
监听的端口 | 80 |
User / Group |
运行用户/组 | apache |
DocumentRoot |
网站根目录 | /var/www/html |
DirectoryIndex |
默认首页文件名 | index.html |
ErrorLog |
错误日志路径 | logs/error_log |
CustomLog |
访问日志路径 | logs/access_log |
2.3 启动服务与防火墙配置
bash
# 启动 Apache 并设置开机自启
[root@www ~]# systemctl enable httpd --now
# 查看服务状态
[root@www ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since ...
# 查看监听端口
[root@www ~]# ss -lntp | grep 80
LISTEN 0 128 *:80 *:* users:(("httpd",pid=1234,fd=4))
# 配置防火墙
[root@www ~]# firewall-cmd --permanent --add-service=http
[root@www ~]# firewall-cmd --reload
# 准备测试页面
[root@www ~]# echo "Hello World From Apache" > /var/www/html/index.html
# 配置 DNS 解析(客户端修改 hosts 文件)
[root@client ~]# echo '10.1.8.10 www.whisky.cloud' >> /etc/hosts
# 测试访问
[root@client ~]# curl http://www.whisky.cloud/
Hello World From Apache
3. 虚拟主机配置
虚拟主机允许同一台 Apache 服务器托管多个网站。Apache 支持三种虚拟主机方式:
| 方式 | 区分依据 | 适用场景 |
|---|---|---|
| 基于域名 | 请求中的 Host 头 | 同一 IP 多个域名(最常用) |
| 基于 IP | 请求的 IP 地址 | 服务器有多个 IP |
| 基于端口 | 请求的端口号 | 同一域名不同端口 |
3.1 基于域名的虚拟主机
场景 :用一台服务器托管 www1.whisky.cloud 和 www2.whisky.cloud 两个网站。
bash
# 创建网站目录和测试页面
[root@www ~]# mkdir -p /var/www/www1 /var/www/www2
[root@www ~]# echo "Hello from www1" > /var/www/www1/index.html
[root@www ~]# echo "Hello from www2" > /var/www/www2/index.html
创建虚拟主机配置文件:
bash
[root@www ~]# vim /etc/httpd/conf.d/vhost-www1.conf
apache
<VirtualHost *:80>
ServerName www1.whisky.cloud
ServerAdmin webmaster@whisky.cloud
DocumentRoot /var/www/www1
<Directory /var/www/www1>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog logs/www1.whisky.cloud-error_log
CustomLog logs/www1.whisky.cloud-access_log combined
</VirtualHost>
bash
[root@www ~]# vim /etc/httpd/conf.d/vhost-www2.conf
apache
<VirtualHost *:80>
ServerName www2.whisky.cloud
ServerAdmin webmaster@whisky.cloud
DocumentRoot /var/www/www2
<Directory /var/www/www2>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog logs/www2.whisky.cloud-error_log
CustomLog logs/www2.whisky.cloud-access_log combined
</VirtualHost>
bash
# 重启 Apache
[root@www ~]# systemctl restart httpd
# 客户端修改 hosts 文件
[root@client ~]# echo '10.1.8.10 www1.whisky.cloud www2.whisky.cloud' >> /etc/hosts
# 测试
[root@client ~]# curl http://www1.whisky.cloud/
Hello from www1
[root@client ~]# curl http://www2.whisky.cloud/
Hello from www2
3.2 基于端口的虚拟主机
场景:同一域名通过不同端口访问不同网站。
bash
[root@www ~]# vim /etc/httpd/conf.d/vhost-port.conf
apache
# 监听 8081 和 8082 端口
Listen 8081
Listen 8082
<VirtualHost *:8081>
ServerName www.whisky.cloud
DocumentRoot /var/www/site1
<Directory /var/www/site1>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:8082>
ServerName www.whisky.cloud
DocumentRoot /var/www/site2
<Directory /var/www/site2>
Require all granted
</Directory>
</VirtualHost>
bash
# 创建目录和测试页面
[root@www ~]# mkdir -p /var/www/site1 /var/www/site2
[root@www ~]# echo "Site on port 8081" > /var/www/site1/index.html
[root@www ~]# echo "Site on port 8082" > /var/www/site2/index.html
# 防火墙放行新增端口
[root@www ~]# firewall-cmd --permanent --add-port=8081/tcp --add-port=8082/tcp
[root@www ~]# firewall-cmd --reload
# 重启 Apache
[root@www ~]# systemctl restart httpd
# 测试
[root@client ~]# curl http://www.whisky.cloud:8081/
Site on port 8081
[root@client ~]# curl http://www.whisky.cloud:8082/
Site on port 8082
4. SSL/TLS 配置(HTTPS)
4.1 生成自签名证书
bash
# 创建证书存放目录
[root@www ~]# mkdir -p /etc/ssl/certs/www.whisky.cloud
# 生成私钥
[root@www ~]# openssl genrsa -out /etc/ssl/certs/www.whisky.cloud/www.key 2048
# 生成证书签名请求(CSR)
[root@www ~]# openssl req -new -key /etc/ssl/certs/www.whisky.cloud/www.key \
-out /etc/ssl/certs/www.whisky.cloud/www.csr \
-subj "/C=CN/ST=JS/L=NJ/O=LM/OU=DEVOPS/CN=www.whisky.cloud/emailAddress=admin@whisky.cloud"
# 使用私钥自签名证书(有效期 365 天)
[root@www ~]# openssl x509 -req -days 365 \
-in /etc/ssl/certs/www.whisky.cloud/www.csr \
-signkey /etc/ssl/certs/www.whisky.cloud/www.key \
-out /etc/ssl/certs/www.whisky.cloud/www.crt
4.2 安装 mod_ssl 并配置 HTTPS 站点
bash
# 安装 mod_ssl 模块
[root@www ~]# yum install -y mod_ssl
# 创建 SSL 虚拟主机配置
[root@www ~]# vim /etc/httpd/conf.d/vhost-ssl.conf
apache
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.whisky.cloud:443
# 证书配置
SSLEngine on
SSLCertificateFile /etc/ssl/certs/www.whisky.cloud/www.crt
SSLCertificateKeyFile /etc/ssl/certs/www.whisky.cloud/www.key
<Directory "/var/www/html">
Require all granted
</Directory>
</VirtualHost>
bash
# 防火墙放行 HTTPS
[root@www ~]# firewall-cmd --permanent --add-service=https
[root@www ~]# firewall-cmd --reload
# 重启 Apache
[root@www ~]# systemctl restart httpd
# 测试 HTTPS(-k 忽略证书验证)
[root@client ~]# curl -k https://www.whisky.cloud/
Hello World From Apache
4.3 HTTP 自动跳转 HTTPS
使用 mod_rewrite 模块实现所有 HTTP 请求自动跳转到 HTTPS:
bash
[root@www ~]# vim /etc/httpd/conf.d/vhost-rewrite.conf
apache
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName www.whisky.cloud
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
bash
[root@www ~]# systemctl restart httpd
# 测试(自动跳转到 HTTPS)
[root@client ~]# curl -L http://www.whisky.cloud/
Hello World From Apache
5. 动态脚本支持
Apache 本身只能处理静态内容(HTML、CSS、JS)。要执行动态脚本(PHP、Python、Perl 等),需要通过 CGI(Common Gateway Interface,公共网关接口) 或 FastCGI 协议与外部解释器通信。
5.1 CGI 公共网关接口
CGI 是 Web 服务器与外部程序之间的通信标准。当用户请求一个 CGI 脚本时,Apache 会启动一个解释器进程,执行脚本,并将输出返回给客户端。
bash
# 默认 CGI 目录
[root@www ~]# grep ScriptAlias /etc/httpd/conf/httpd.conf
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
# 创建自定义 CGI 目录
[root@www ~]# mkdir -p /var/www/html/cgi-enabled
5.2 Perl CGI
bash
# 安装 Perl 和 CGI 模块
[root@www ~]# yum install -y perl perl-CGI
# 创建 CGI 配置文件
[root@www ~]# vim /etc/httpd/conf.d/cgi-enabled.conf
apache
<Directory "/var/www/html/cgi-enabled">
Options +ExecCGI
AddHandler cgi-script .cgi .pl
Require all granted
</Directory>
bash
# 创建 Perl CGI 脚本
[root@www ~]# cat > /var/www/html/cgi-enabled/index.cgi << 'EOF'
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<h1>Perl CGI Test Page</h1>\n";
print "<p>Hello from Perl CGI!</p>\n";
print "</body></html>\n";
EOF
# 设置执行权限
[root@www ~]# chmod 755 /var/www/html/cgi-enabled/index.cgi
# 设置 SELinux(如果启用)
[root@www ~]# chcon -R -t httpd_sys_script_exec_t /var/www/html/cgi-enabled
# 重启 Apache
[root@www ~]# systemctl restart httpd
# 测试
[root@client ~]# curl http://www.whisky.cloud/cgi-enabled/index.cgi
<html><body>
<h1>Perl CGI Test Page</h1>
<p>Hello from Perl CGI!</p>
</body></html>
5.3 PHP 支持
bash
# 安装 PHP
[root@www ~]# yum install -y php php-mysqlnd
# 重启 Apache(PHP 模块自动加载)
[root@www ~]# systemctl restart httpd
# 创建 PHP 测试页面
[root@www ~]# cat > /var/www/html/index.php << 'EOF'
<?php
phpinfo();
?>
EOF
# 测试
[root@client ~]# curl http://www.whisky.cloud/index.php | head -10
<!DOCTYPE html>
<html>
<head>
<title>phpinfo()</title>
...
PHP 配置优化:
bash
# PHP 配置文件
[root@www ~]# vim /etc/php.ini
# 常用参数
date.timezone = Asia/Shanghai
memory_limit = 256M
upload_max_filesize = 20M
post_max_size = 20M
5.4 Python CGI
bash
# 安装 Python 3
[root@www ~]# yum install -y python3
# 修改 CGI 配置支持 .py
[root@www ~]# vim /etc/httpd/conf.d/cgi-enabled.conf
apache
<Directory "/var/www/html/cgi-enabled">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py
Require all granted
</Directory>
bash
# 创建 Python CGI 脚本
[root@www ~]# cat > /var/www/html/cgi-enabled/index.py << 'EOF'
#!/usr/bin/env python3
print("Content-type: text/html\n")
print("<html><body>")
print("<h1>Python CGI Test Page</h1>")
print("<p>Hello from Python CGI!</p>")
print("</body></html>")
EOF
[root@www ~]# chmod 755 /var/www/html/cgi-enabled/index.py
[root@www ~]# chcon -R -t httpd_sys_script_exec_t /var/www/html/cgi-enabled
[root@www ~]# systemctl restart httpd
# 测试
[root@client ~]# curl http://www.whisky.cloud/cgi-enabled/index.py
<html><body>
<h1>Python CGI Test Page</h1>
<p>Hello from Python CGI!</p>
</body></html>
5.5 Ruby CGI
bash
# 安装 Ruby
[root@www ~]# yum install -y ruby
# 修改 CGI 配置支持 .rb
[root@www ~]# vim /etc/httpd/conf.d/cgi-enabled.conf
apache
<Directory "/var/www/html/cgi-enabled">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .py .rb
Require all granted
</Directory>
bash
# 创建 Ruby CGI 脚本
[root@www ~]# cat > /var/www/html/cgi-enabled/index.rb << 'EOF'
#!/usr/bin/ruby
print "Content-type: text/html\n\n"
print "<html><body>"
print "<h1>Ruby CGI Test Page</h1>"
print "<p>Hello from Ruby CGI!</p>"
print "</body></html>"
EOF
[root@www ~]# chmod 755 /var/www/html/cgi-enabled/index.rb
[root@www ~]# chcon -R -t httpd_sys_script_exec_t /var/www/html/cgi-enabled
[root@www ~]# systemctl restart httpd
# 测试
[root@client ~]# curl http://www.whisky.cloud/cgi-enabled/index.rb
<html><body>
<h1>Ruby CGI Test Page</h1>
<p>Hello from Ruby CGI!</p>
</body></html>
6. 访问控制与认证
6.1 基于 IP 的访问控制
使用 Require 指令控制哪些 IP 可以访问特定目录:
bash
[root@www ~]# vim /etc/httpd/conf.d/ip-control.conf
apache
<Directory "/var/www/html/private">
Require ip 10.1.8.0/24
Require ip 127.0.0.1
# 拒绝所有其他 IP
# Require all denied
</Directory>
bash
[root@www ~]# mkdir -p /var/www/html/private
[root@www ~]# echo "Private content" > /var/www/html/private/index.html
[root@www ~]# systemctl restart httpd
6.2 Basic 认证
Basic 认证要求用户输入用户名和密码(用户名密码以 Base64 编码传输,需配合 HTTPS 使用)。
bash
# 创建密码文件(-c 首次创建)
[root@www ~]# htpasswd -c /etc/httpd/conf/.htpasswd whisky
New password: `redhat`
Re-type new password: `redhat`
Adding password for user whisky
# 配置认证
[root@www ~]# vim /etc/httpd/conf.d/auth-basic.conf
apache
<Directory "/var/www/html/auth-basic">
AuthType Basic
AuthName "Basic Authentication"
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
bash
[root@www ~]# mkdir -p /var/www/html/auth-basic
[root@www ~]# echo "Protected Content" > /var/www/html/auth-basic/index.html
[root@www ~]# systemctl restart httpd
# 测试(-u 参数提供用户名密码)
[root@client ~]# curl -u whisky:redhat http://www.whisky.cloud/auth-basic/
Protected Content
[root@client ~]# curl http://www.whisky.cloud/auth-basic/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head><title>401 Unauthorized</title></head>
6.3 PAM 认证
使用 PAM(可插拔认证模块)允许用户使用 Linux 系统账户登录。
bash
# 安装 mod_authnz_external(EPEL 源)
[root@www ~]# yum install -y epel-release
[root@www ~]# yum install -y mod_authnz_external pwauth
# 配置 PAM 认证
[root@www ~]# vim /etc/httpd/conf.d/auth-pam.conf
apache
LoadModule authnz_external_module modules/mod_authnz_external.so
<Directory "/var/www/html/auth-pam">
SSLRequireSSL
AuthType Basic
AuthName "PAM Authentication"
AuthBasicProvider external
AuthExternal pwauth
Require valid-user
</Directory>
bash
[root@www ~]# mkdir -p /var/www/html/auth-pam
[root@www ~]# echo "PAM Protected" > /var/www/html/auth-pam/index.html
[root@www ~]# systemctl restart httpd
# 使用 Linux 系统用户登录
[root@client ~]# curl -u whisky:redhat -k https://www.whisky.cloud/auth-pam/
PAM Protected
6.4 LDAP 认证
将 Apache 与 LDAP 目录服务集成,实现集中认证。
bash
# 安装 mod_ldap
[root@www ~]# yum install -y mod_ldap
# 配置 LDAP 认证(需先有 LDAP 服务器)
[root@www ~]# vim /etc/httpd/conf.d/auth-ldap.conf
apache
<Directory "/var/www/html/auth-ldap">
SSLRequireSSL
AuthName "LDAP Authentication"
AuthType Basic
AuthBasicProvider ldap
# LDAP 服务器 URL
AuthLDAPURL ldap://ldap.whisky.cloud/dc=whisky,dc=cloud?uid?sub?(objectClass=*)
Require ldap-filter objectClass=posixAccount
</Directory>
bash
[root@www ~]# mkdir -p /var/www/html/auth-ldap
[root@www ~]# echo "LDAP Protected" > /var/www/html/auth-ldap/index.html
[root@www ~]# systemctl restart httpd
7. 日志管理
7.1 访问日志与错误日志
Apache 默认日志位置:
| 日志类型 | 文件路径 | 内容 |
|---|---|---|
| 错误日志 | /var/log/httpd/error_log |
服务启动/停止、运行错误、调试信息 |
| 访问日志 | /var/log/httpd/access_log |
每次 HTTP 请求的详细信息 |
bash
# 查看错误日志
[root@www ~]# tail -f /var/log/httpd/error_log
# 查看访问日志
[root@www ~]# tail -f /var/log/httpd/access_log
7.2 日志格式自定义
Apache 使用 LogFormat 定义日志格式:
bash
[root@www ~]# grep LogFormat /etc/httpd/conf/httpd.conf
| 格式名称 | 格式字符串 | 用途 |
|---|---|---|
combined |
%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" |
标准组合日志格式 |
common |
%h %l %u %t \"%r\" %>s %b |
通用日志格式 |
自定义 JSON 格式:
bash
[root@www ~]# vim /etc/httpd/conf/httpd.conf
apache
LogFormat "{\"time\":\"%t\",\"client\":\"%h\",\"method\":\"%m\",\"uri\":\"%U\",\"status\":\"%>s\",\"size\":\"%b\",\"referer\":\"%{Referer}i\",\"agent\":\"%{User-Agent}i\"}" json
# 在虚拟主机中使用
CustomLog logs/access_json.log json
7.3 日志轮转
使用 logrotate 自动切割和压缩日志:
bash
[root@www ~]# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd > /dev/null 2>&1 || true
endscript
}
8. 总结与速查手册
8.1 核心知识点一览
| 主题 | 关键点 |
|---|---|
| HTTP 基础 | GET/POST 请求、2xx/3xx/4xx/5xx 状态码、80/443 端口 |
| Apache 安装 | yum install httpd,配置 /etc/httpd/conf/httpd.conf |
| 虚拟主机 | <VirtualHost *:80>,基于域名或端口区分 |
| HTTPS | mod_ssl,证书与私钥,HTTP 跳转 HTTPS |
| 动态脚本 | CGI(.cgi/.pl/.py/.rb),PHP(mod_php) |
| 访问控制 | Require ip(IP 限制)、Basic Auth(.htpasswd)、PAM/LDAP 认证 |
| 日志管理 | 错误日志 + 访问日志,LogFormat 自定义格式 |
8.2 Apache 命令速查表
| 命令 | 作用 |
|---|---|
systemctl start httpd |
启动 Apache |
systemctl stop httpd |
停止 Apache |
systemctl restart httpd |
重启 Apache |
systemctl reload httpd |
重新加载配置(不中断连接) |
systemctl status httpd |
查看服务状态 |
httpd -t |
验证配置文件语法 |
httpd -M |
列出已加载的模块 |
httpd -S |
查看当前虚拟主机配置 |
8.3 配置文件参数速查表
| 参数 | 作用 |
|---|---|
Listen 80 |
监听端口 |
DocumentRoot "/var/www/html" |
网站根目录 |
DirectoryIndex index.html |
默认首页文件 |
<Directory /path> |
目录访问控制块 |
Require all granted |
允许所有访问 |
Require ip 10.1.8.0/24 |
仅允许特定 IP |
ErrorLog logs/error_log |
错误日志路径 |
CustomLog logs/access_log combined |
访问日志路径和格式 |
8.4 常见错误排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
curl: (7) Failed to connect |
服务未启动或防火墙拦截 | 检查 systemctl status httpd 和防火墙 |
403 Forbidden |
目录权限不足或 SELinux 阻止 | 检查目录权限和 SELinux 上下文 |
500 Internal Server Error |
CGI 脚本语法错误或权限问题 | 检查脚本语法,chmod 755,查看 error_log |
Could not bind to address |
端口被占用 | 检查端口是否已被其他进程占用 |
| SSL 证书错误 | 证书自签名或已过期 | 使用 -k 忽略验证,或重新生成证书 |
| PHP 不执行(显示源码) | PHP 模块未加载 | yum install php,重启 Apache |
8.5 思考与拓展(原课后作业转化)
- Apache 的
Require ip和Require user有什么区别?
→Require ip基于客户端 IP 地址进行访问控制;Require user基于用户身份认证(需配合AuthType)。两者可以组合使用。 - 为什么 CGI 脚本需要
Content-type头部?
→ 浏览器需要知道返回内容的 MIME 类型才能正确渲染。对于 HTML 内容,必须输出Content-type: text/html后跟两个换行,否则浏览器无法识别。 - Apache 的
AllowOverride参数的作用是什么?
→ 控制是否允许目录下的.htaccess文件覆盖主配置。AllowOverride All允许全部覆盖,None禁止。出于性能考虑,生产环境建议设为None。 - 为什么 HTTPS 站点需要证书?
→ 证书用于验证服务器身份(防止中间人攻击)和加密通信。自签名证书虽然提供了加密,但浏览器无法验证其真实性,因此会显示安全警告。
8.6 生产环境最佳实践
| 场景 | 建议 |
|---|---|
| 配置文件管理 | 修改前备份,用 httpd -t 验证语法后再重启 |
| 虚拟主机分离 | 每个虚拟主机使用独立的 .conf 文件,便于维护 |
| HTTPS 强制 | 使用 RewriteRule 将 HTTP 请求永久重定向到 HTTPS |
| 日志管理 | 定期轮转日志,避免日志文件占满磁盘 |
| SELinux | 保持 SELinux 启用,使用 httpd_sys_content_t 和 httpd_sys_script_exec_t 标签 |
| 性能优化 | 静态内容启用 KeepAlive,动态内容根据负载调整进程数量 |
下期预告 :Apache 是经典而强大的 Web 服务器,但在高并发场景下,Nginx 凭借其事件驱动的异步非阻塞架构表现更为出色。下一期我们将进入 Nginx Web 服务器------学习它的安装、配置文件结构、虚拟主机、HTTPS 配置以及动静分离,让你掌握这款"高并发之王"的核心用法。敬请期待第六期!
--- Compiled and Authored by Whisky --- Augest 27 th, 2026