Linux 网络服务架设学习笔记(第五期)——Web 服务(上篇):Apache HTTP Server——从静态到动态

Linux 网络服务架设学习笔记(第五期)------Web 服务(上篇):Apache HTTP Server------从静态到动态

本系列更多内容可见:Linux常见服务器配置
Linux系统管理入门系列更多文章欢迎访问:

Linux入门------系统管理1Linux入门------系统管理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

目录

  1. Web 服务器概述
    • 1.1 HTTP 协议基础
    • 1.2 常见 Web 服务器对比
  2. Apache HTTP Server 安装与基础配置
    • 2.1 安装 Apache
    • 2.2 配置文件结构
    • 2.3 启动服务与防火墙配置
  3. 虚拟主机配置
    • 3.1 基于域名的虚拟主机
    • 3.2 基于端口的虚拟主机
  4. SSL/TLS 配置(HTTPS)
    • 4.1 生成自签名证书
    • 4.2 安装 mod_ssl 并配置 HTTPS 站点
    • 4.3 HTTP 自动跳转 HTTPS
  5. 动态脚本支持
    • 5.1 CGI 公共网关接口
    • 5.2 Perl CGI
    • 5.3 PHP 支持
    • 5.4 Python CGI
    • 5.5 Ruby CGI
  6. 访问控制与认证
    • 6.1 基于 IP 的访问控制
    • 6.2 Basic 认证
    • 6.3 PAM 认证
    • 6.4 LDAP 认证
  7. 日志管理
    • 7.1 访问日志与错误日志
    • 7.2 日志格式自定义
    • 7.3 日志轮转
  8. 总结与速查手册

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.cloudwww2.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 思考与拓展(原课后作业转化)

  1. Apache 的 Require ipRequire user 有什么区别?
    Require ip 基于客户端 IP 地址进行访问控制;Require user 基于用户身份认证(需配合 AuthType)。两者可以组合使用。
  2. 为什么 CGI 脚本需要 Content-type 头部?
    → 浏览器需要知道返回内容的 MIME 类型才能正确渲染。对于 HTML 内容,必须输出 Content-type: text/html 后跟两个换行,否则浏览器无法识别。
  3. Apache 的 AllowOverride 参数的作用是什么?
    → 控制是否允许目录下的 .htaccess 文件覆盖主配置。AllowOverride All 允许全部覆盖,None 禁止。出于性能考虑,生产环境建议设为 None
  4. 为什么 HTTPS 站点需要证书?
    → 证书用于验证服务器身份(防止中间人攻击)和加密通信。自签名证书虽然提供了加密,但浏览器无法验证其真实性,因此会显示安全警告。

8.6 生产环境最佳实践

场景 建议
配置文件管理 修改前备份,用 httpd -t 验证语法后再重启
虚拟主机分离 每个虚拟主机使用独立的 .conf 文件,便于维护
HTTPS 强制 使用 RewriteRule 将 HTTP 请求永久重定向到 HTTPS
日志管理 定期轮转日志,避免日志文件占满磁盘
SELinux 保持 SELinux 启用,使用 httpd_sys_content_thttpd_sys_script_exec_t 标签
性能优化 静态内容启用 KeepAlive,动态内容根据负载调整进程数量

下期预告 :Apache 是经典而强大的 Web 服务器,但在高并发场景下,Nginx 凭借其事件驱动的异步非阻塞架构表现更为出色。下一期我们将进入 Nginx Web 服务器------学习它的安装、配置文件结构、虚拟主机、HTTPS 配置以及动静分离,让你掌握这款"高并发之王"的核心用法。敬请期待第六期!
--- Compiled and Authored by Whisky --- Augest 27 th, 2026

相关推荐
zbyyd37 分钟前
Linux 多线程:互斥锁 &amp; 信号量
linux·c语言·开发语言·网络
wuyk5551 小时前
从零吃透Modbus通信|第3章:STM32 Modbus RTU主机
服务器·开发语言·网络·数据结构·stm32·单片机·嵌入式硬件
绘梨衣5471 小时前
异步任务队列-学习2
爬虫·python·学习·任务队列
斑马1391 小时前
Linux软件编程学习笔记(四)——进程
linux·运维·服务器
扛枪的书生1 小时前
Linux 三剑客 - Awk 命令指南
linux·运维
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
MaximusCoder2 小时前
等保测评命令——weblogic
运维·安全·安全威胁分析
xixingzhe22 小时前
nginx无网络升级
服务器·nginx
喜欢吃燃面2 小时前
HTTP协议深度解析:从请求响应到状态管理与安全传输
linux·网络协议·学习