凌峰创科服务平台

Linux Apache代理服务器如何配置与优化?

目录

  1. 什么是代理服务器?
  2. Apache 代理的核心模块
  3. 准备工作:安装和启用模块
  4. 基础代理配置
    • 示例1:正向代理(较少用)
    • 示例2:反向代理(最常用)
  5. 高级代理配置
    • 负载均衡
    • 缓存
    • SSL/TLS 终止
  6. 安全与优化建议
  7. 故障排查

什么是代理服务器?

代理服务器位于客户端和目标服务器之间,充当中间人,其主要作用包括:

Linux Apache代理服务器如何配置与优化?-图1
(图片来源网络,侵删)
  • 正向代理:为客户端(如公司内网用户)提供访问互联网的途径,客户端需要将请求发送到代理服务器,由代理服务器去访问目标资源,然后再返回给客户端,客户端需要手动配置代理地址。
  • 反向代理:为后端服务器(如 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_cachemod_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) 等输出。

Linux Apache代理服务器如何配置与优化?-图2
(图片来源网络,侵删)

启用模块

对于 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.dsites-available 目录下创建新的配置文件,以保持主配置文件的整洁。

示例1:反向代理(最常用场景)

假设我们有一个运行在 168.1.100:8080 上的内部应用程序,我们希望用户通过访问 proxy.example.com 就能访问它。

Linux Apache代理服务器如何配置与优化?-图3
(图片来源网络,侵删)
  1. 创建虚拟主机配置文件/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>
  2. 启用虚拟主机:

    # 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 来分发流量。

  1. 定义后端服务器集群 (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>
  2. 将请求转发到集群: 使用 ProxyPass 将请求指向 balancer://mycluster

    <VirtualHost *:80>
        ServerName lb.example.com
        ProxyPass / balancer://mycluster/
        ProxyPassReverse / balancer://mycluster/
    </VirtualHost>

缓存

使用 mod_cache 可以缓存后端服务器的响应,显著提高性能。

  1. 配置缓存目录: 在 httpd.conf 或主配置文件中添加:

    # 创建缓存目录并设置权限
    CacheRoot "/var/cache/apache2/mod_cache_disk"
    CacheEnable disk /
    CacheDirLevels 2
    CacheDirLength 2
    CacheMaxFileSize
分享:
扫描分享到社交APP
上一篇
下一篇