目录
- 什么是代理服务器?
- Apache 代理的核心模块
- 准备工作:安装和启用模块
- 基础代理配置
- 示例1:正向代理(较少用)
- 示例2:反向代理(最常用)
- 高级代理配置
- 负载均衡
- 缓存
- SSL/TLS 终止
- 安全与优化建议
- 故障排查
什么是代理服务器?
代理服务器位于客户端和目标服务器之间,充当中间人,其主要作用包括:

- 正向代理:为客户端(如公司内网用户)提供访问互联网的途径,客户端需要将请求发送到代理服务器,由代理服务器去访问目标资源,然后再返回给客户端,客户端需要手动配置代理地址。
- 反向代理:为后端服务器(如 Web 服务器集群)提供服务,客户端不知道后端服务器的存在,它只与反向代理通信,反向代理负责将客户端的请求转发给后端的服务器,并将后端服务器的响应返回给客户端,这对客户端是透明的,反向代理常用于负载均衡、SSL 终止、提供统一入口等。
- 透明代理:客户端无需进行任何配置,网络设备(如路由器)会自动将流量重定向到代理服务器。
在 Apache 中,我们最常用的是 反向代理。
Apache 代理的核心模块
Apache 的代理功能由一系列模块协同工作完成:
mod_proxy:核心模块,提供了代理的基本功能和指令,如ProxyPass,ProxyPassReverse。mod_proxy_http:处理 HTTP 和 HTTPS 协议的流量,这是最常用的代理模块。mod_proxy_ftp:处理 FTP 协议的流量。mod_proxy_ajp:处理 AJP 协议(常用于 Apache 与 Tomcat 的通信)。mod_proxy_balancer:实现负载均衡功能,需要与mod_proxy_http等模块配合使用。mod_cache和mod_disk_cache:提供代理缓存功能,可以缓存后端服务器的响应,提高性能。
准备工作:安装和启用模块
在大多数现代 Linux 发行版(如 Ubuntu, Debian, CentOS, RHEL)中,Apache 的代理模块通常是默认安装的但可能未启用。
检查模块是否已安装
# 对于使用 apachectl 的系统 apache2ctl -M | grep proxy # 对于使用 httpd 的系统 (如 CentOS/RHEL) httpd -M | grep proxy
你应该能看到 proxy_module (shared) 和 proxy_http_module (shared) 等输出。

启用模块
对于 Ubuntu/Debian:
sudo a2enmod proxy sudo a2enmod proxy_http # 如果需要负载均衡 sudo a2enmod proxy_balancer # 如果需要缓存 sudo a2enmod cache sudo a2enmod disk_cache
对于 CentOS/RHEL:
# 确保已安装 httpd 包 sudo yum install httpd # 模块通常在安装时已包含,只需在配置文件中加载 # 编辑 /etc/httpd/conf.modules.d/00-proxy.conf,确保以下行未被注释 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule cache_module modules/mod_cache.so LoadModule disk_cache_module modules/mod_disk_cache.so
重启 Apache 服务
# Ubuntu/Debian sudo systemctl restart apache2 # CentOS/RHEL sudo systemctl restart httpd
基础代理配置
Apache 的主配置文件通常是 /etc/apache2/apache2.conf (Ubuntu/Debian) 或 /etc/httpd/conf/httpd.conf (CentOS/RHEL),建议在 conf.d 或 sites-available 目录下创建新的配置文件,以保持主配置文件的整洁。
示例1:反向代理(最常用场景)
假设我们有一个运行在 168.1.100:8080 上的内部应用程序,我们希望用户通过访问 proxy.example.com 就能访问它。

-
创建虚拟主机配置文件,
/etc/apache2/sites-available/proxy.conf:<VirtualHost *:80> ServerName proxy.example.com ServerAdmin webmaster@example.com ErrorLog ${APACHE_LOG_DIR}/proxy_error.log CustomLog ${APACHE_LOG_DIR}/proxy_access.log combined # --- 核心代理配置 --- # 将所有发往此虚拟主机的请求,都转发到后端应用服务器 ProxyPass / http://192.168.1.100:8080/ # --- 重要:重定向URL修复 --- # 当后端应用返回 302/301 等重定向响应时,Location 头中的 URL # 会被自动替换为代理服务器的 URL,防止客户端直接访问后端服务器。 ProxyPassReverse / http://192.168.1.100:8080/ # 可选:添加一些请求头,让后端知道请求的真实来源 # ProxyAddHeaders On # RequestHeader set X-Forwarded-Proto "http" # RequestHeader set X-Forwarded-Host "proxy.example.com" </VirtualHost> -
启用虚拟主机:
# Ubuntu/Debian sudo a2ensite proxy.conf sudo systemctl reload apache2 # CentOS/RHEL # 直接确保配置文件在 conf.d 目录下,并重启服务 sudo systemctl restart httpd
访问 http://proxy.example.com,Apache 会将你的请求透明地转发到 http://192.168.1.100:8080。
示例2:路径级反向代理
假设你想将 http://proxy.example.com/app 下的所有请求转发到后端应用,而 proxy.example.com 的其他部分(如首页)由 Apache 自己处理。
<VirtualHost *:80>
ServerName proxy.example.com
# Apache 处理根路径
DocumentRoot /var/www/html
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 将 /app 路径下的请求转发到后端应用
# 注意结尾的 /,它表示 /app 下的所有路径
ProxyPass /app/ http://192.168.1.100:8080/
# 同样,修复重定向URL
ProxyPassReverse /app/ http://192.168.1.100:8080/
</VirtualHost>
高级代理配置
负载均衡
当有多个后端服务器时,可以使用 mod_proxy_balancer 来分发流量。
-
定义后端服务器集群 (Balancer Group): 在配置文件中定义一个名为
mycluster的集群,包含两台服务器。<Proxy "balancer://mycluster"> # 定义集群中的成员 BalancerMember http://192.168.1.101:8080 loadfactor=1 BalancerMember http://192.168.1.102:8080 loadfactor=2 # 负载均衡策略 # SetEnvIf Request_URI "some_path" no_session_route=1 # Header always unset no_session_route # Header always set no_session_route %{no_session_route}e # 策略: byrequests (按请求次数, 默认), bytraffic (按流量), bybusyness (按繁忙程度) ProxySet lbmethod=byrequests </Proxy> -
将请求转发到集群: 使用
ProxyPass将请求指向balancer://mycluster。<VirtualHost *:80> ServerName lb.example.com ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/ </VirtualHost>
缓存
使用 mod_cache 可以缓存后端服务器的响应,显著提高性能。
-
配置缓存目录: 在
httpd.conf或主配置文件中添加:# 创建缓存目录并设置权限 CacheRoot "/var/cache/apache2/mod_cache_disk" CacheEnable disk / CacheDirLevels 2 CacheDirLength 2 CacheMaxFileSize
