- 正向代理:客户端需要配置代理,它代理的是客户端,用于访问外部互联网,公司内网员工通过代理访问外网,或者用于访问被墙的资源。
- 反向代理:客户端无需感知代理存在,它代理的是服务器,用于接收来自互联网的请求,Nginx 作为反向代理,将请求转发给后端的 Tomcat 或 Nginx 应用服务器,用于负载均衡、SSL 终止等。
下面我将分别介绍如何配置这两种代理服务器,并提供几种主流软件的方案。

正向代理
正向代理主要用于内网用户共享上网访问外网,或者用于缓存、翻墙等场景。
使用 Squid (最经典、功能强大)
Squid 是一个功能非常全面的开源代理缓存服务器,是配置正向代理的传统选择。
安装 Squid
在基于 Debian/Ubuntu 的系统上:

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
关键配置项:

-
监听端口: 默认是
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 的
REDIRECT或DNAT)。# 启用透明代理 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。
