凌峰创科服务平台

Linux如何配置HTTP代理服务器?

  • 正向代理:客户端需要配置代理,它代理的是客户端,用于访问外部互联网,公司内网员工通过代理访问外网,或者用于访问被墙的资源。
  • 反向代理:客户端无需感知代理存在,它代理的是服务器,用于接收来自互联网的请求,Nginx 作为反向代理,将请求转发给后端的 Tomcat 或 Nginx 应用服务器,用于负载均衡、SSL 终止等。

下面我将分别介绍如何配置这两种代理服务器,并提供几种主流软件的方案。

Linux如何配置HTTP代理服务器?-图1
(图片来源网络,侵删)

正向代理

正向代理主要用于内网用户共享上网访问外网,或者用于缓存、翻墙等场景。

使用 Squid (最经典、功能强大)

Squid 是一个功能非常全面的开源代理缓存服务器,是配置正向代理的传统选择。

安装 Squid

在基于 Debian/Ubuntu 的系统上:

Linux如何配置HTTP代理服务器?-图2
(图片来源网络,侵删)
sudo apt update
sudo apt install squid

在基于 CentOS/RHEL/Fedora 的系统上:

sudo yum install squid
# 或者 (对于较新版本)
sudo dnf install squid

配置 Squid

主配置文件是 /etc/squid/squid.conf,我们可以先备份原文件,然后进行编辑。

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
sudo nano /etc/squid/squid.conf

关键配置项:

Linux如何配置HTTP代理服务器?-图3
(图片来源网络,侵删)
  • 监听端口: 默认是 3128,你可以修改或添加 http_port 指令来监听多个端口或 IP 地址。

    http_port 3128
    # 监听所有网络接口的 3128 端口
    # http_port 192.168.1.100:3128
  • 允许访问的客户端: 这是最重要的安全设置,默认 Squid 只允许本地访问 (localhost),你需要修改 http_access 规则以允许你的内网 IP 段。

    # 默认规则,拒绝所有,然后允许特定规则
    http_access allow localhost
    http_access deny all
    # 允许整个 192.168.1.0/24 网段的客户端
    http_access allow 192.168.1.0/24
  • 透明代理 (可选): 透明代理让客户端无需手动配置代理,这需要你在防火墙或路由器上进行端口重定向(例如使用 iptables 的 REDIRECTDNAT)。

    # 启用透明代理
    http_port 3128 transparent
  • 缓存目录 (可选): Squid 可以缓存 frequently accessed 的对象,以加速后续访问,默认是启用的。

    cache_dir ufs /var/spool/squid 100 16 256

创建缓存目录并设置权限

# Squid 首次启动或配置更改后需要初始化缓存目录
sudo squid -z

启动并设置开机自启

sudo systemctl start squid
sudo systemctl enable squid

检查状态

sudo systemctl status squid

客户端配置 你只需要将你的电脑、手机等设备的网络代理设置为这台 Linux 服务器的 IP 地址和 3128 端口即可。


使用 Nginx (更现代、配置简单)

Nginx 虽然以反向代理闻名,但它也能很好地胜任正向代理的角色,配置更简单。

安装 Nginx

# Debian/Ubuntu
sudo apt install nginx
# CentOS/RHEL
sudo yum install nginx

配置 Nginx

创建一个新的配置文件,/etc/nginx/conf.d/http_proxy.conf

sudo nano /etc/nginx/conf.d/http_proxy.conf
# 定义一个名为 "http_proxy" 的上游服务器组
# 这里以代理到公网为例,你可以替换成你的目标
upstream http_proxy {
    server http://httpbin.org; # 一个用于测试的 HTTP 服务
    # server http://www.google.com; # 或者代理到其他网站
}
# 定义正向代理的监听端口
server {
    listen 3128;
    # 允许的客户端 IP,这里只允许本地
    allow 127.0.0.1;
    deny all;
    resolver 8.8.8.8; # 必须指定一个 DNS 服务器,用于解析目标域名
    location / {
        # 关键:将客户端的请求转发到上游服务器
        proxy_pass http://http_proxy;
        # 设置一些常见的代理头信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

检查配置并重启 Nginx

sudo nginx -t # 检查配置语法是否正确
sudo systemctl restart nginx
sudo systemctl enable nginx

客户端配置方法与 Squid 相同。


反向代理

反向代理是现代 Web 架构的核心组件,用于负载均衡、SSL 卸载、动静分离等。

使用 Nginx (首选、最流行)

Nginx 是配置反向代理事实上的标准。

安装 Nginx (同上)

配置反向代理

假设你有一个后端 Web 应用运行在 168.1.101:8080,你想通过 Nginx 对外暴露。

创建或编辑 /etc/nginx/sites-available/my_app (或 /etc/nginx/conf.d/my_app.conf):

sudo nano /etc/nginx/sites-available/my_app
server {
    # 监听 80 端口,接收 HTTP 请求
    listen 80;
    server_name your_domain.com www.your_domain.com; # 替换成你的域名或 IP
    # 将所有请求转发到后端应用服务器
    location / {
        proxy_pass http://192.168.1.101:8080;
        # 设置代理头,将客户端信息传递给后端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
    }
}

启用站点

# 创建软链接到 sites-enabled
sudo ln -s /etc/nginx/sites-available/my_app /etc/nginx/sites-enabled/
# 检查配置并重启
sudo nginx -t
sudo systemctl restart nginx

访问 http://your_domain.com 的请求就会被 Nginx 转发到后端的应用服务器。

使用 Apache (功能全面)

Apache 也可以配置反向代理,通过 mod_proxy 模块实现。

安装 Apache 和 mod_proxy 模块

# Debian/Ubuntu
sudo apt install apache2 libapache2-mod-proxy-html
# CentOS/RHEL
sudo yum install httpd mod_proxy_html

启用必要的模块:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer # 如果需要负载均衡

配置反向代理

编辑 Apache 的虚拟主机配置文件,/etc/apache2/sites-available/000-default.conf/etc/httpd/conf/httpd.conf

sudo nano /etc/apache2/sites-available/000-default.conf

<VirtualHost *:80> 标签内添加以下内容:

<VirtualHost *:80>
    ServerName your_domain.com
    # 启用反向代理
    ProxyPass / http://192.168.1.101:8080/
    ProxyPassReverse / http://192.168.1.101:8080/
    # 将 Host 头传递给后端
    ProxyPreserveHost On
</VirtualHost>

重启 Apache

sudo systemctl restart apache2

总结与对比

特性 Squid (正向代理) Nginx (正向代理) Nginx (反向代理) Apache (反向代理)
主要用途 内网共享上网、访问控制、缓存 简单正向代理、API 代理 负载均衡、SSL 终止、Web 服务器 负载均衡、Web 服务器
易用性 配置项多,相对复杂 配置简洁 配置简洁、模块化 配置相对传统
性能 非常高,专为代理优化 极高,事件驱动模型 极高,事件驱动模型 性能良好,但略逊于 Nginx
功能 缓存、ACL、认证、日志等 基本代理功能、SSL 代理 负载均衡、缓存、Gzip、SSL 等 功能全面,模块生态成熟
推荐场景 需要强大缓存和访问控制的内网正向代理 快速搭建一个简单的正向代理 Web 应用的反向代理、负载均衡首选 已有 Apache 环境,或需要特定 Apache 模块

如何选择?

  • 需要做内网正向代理
    • 如果需要精细的访问控制、强大的缓存功能,选 Squid
    • 如果只是快速搭建一个简单的代理,或者对 Nginx 更熟悉,选 Nginx
  • 需要为 Web 应用做反向代理
    • 首选 Nginx,它在性能、配置灵活性和社区支持方面都是最优选择。
    • 如果你的服务器已经运行 Apache,并且不想引入新的软件,可以使用 Apache 的 mod_proxy
分享:
扫描分享到社交APP
上一篇
下一篇