代理服务器基础概念
代理服务器充当客户端与后端服务器之间的中介
正向代理(Forward Proxy)位于客户端侧,代理客户端请求(如访问受限资源),客户端感知代理存在;反向代理(Reverse Proxy)位于服务器侧,代理后端服务接收请求,客户端无法感知代理存在
反向代理的核心优势是增强安全性和性能:隐藏后端服务器信息、实现负载均衡、提供缓存加速,并集中管理SSL/TLS加密
典型场景包括高并发网站(如淘宝、天猫使用基于NGINX的Tengine),通过分布式部署处理海量请求
Nginx作为高性能轻量级Web服务器,采用事件驱动、非阻塞I/O模型,适用于高并发场景(如淘宝Tengine)。其优势包括:
- 轻量级:安装包仅1.4MB,运行时占用资源少
- 高并发支持:通过
epoll机制处理海量连接,优于Apache的select模型 - 功能丰富:支持反向代理、负载均衡、HTTPS等
NGINX简介与安装
NGINX是一款轻量级、高性能的Web服务器,采用事件驱动与非阻塞I/O模型(基于epoll),适用于高并发场景
与Apache(同步阻塞模型)相比,NGINX更擅长处理数万级并发连接
全球Top 100万网站中NGINX占比最高(数据来源:Netcraft)
安装步骤:
1 )启用EPEL仓库(额外软件包源):
bash
yum install epel-release -y
yum update epel-release -y
2 )安装NGINX:
bash
yum install nginx -y # 安装包仅562KB
3 )解决端口冲突(默认80端口被Apache占用):
bash
systemctl stop httpd # 停止Apache 停止占用80端口的Apache
systemctl start nginx # 启动NGINX
systemctl enable nginx # 设置开机自启
避坑提示:若启动报错Address already in use,需释放80端口或修改Nginx监听端口
4 ) 验证安装
-
访问
http://服务器IP,显示Welcome to CentOS页面(实际由Nginx驱动) -
修改默认页面:
bashvim /usr/share/nginx/html/index.html # 修改HTML内容 systemctl restart nginx
NGINX配置文件解析
主配置文件:/etc/nginx/nginx.conf,结构基于指令块:
- 全局块:定义进程数(
worker_processes auto匹配CPU核心数)、连接数(worker_connections 1024) - events块:配置事件处理模型(
use epoll) - http块:核心配置区域,包含:
log_format:定义日志格式(如客户端IP、请求时间)access_log:访问日志路径(/var/log/nginx/access.log)server块:虚拟主机配置(类比Apache的VirtualHost)
关键指令:
listen:监听端口(如listen 80;)server_name:域名(如server_name www.linuxcoreapp.com;)location:路径匹配规则(如location /jenkins { ... })
反向代理配置实践
目标:通过NGINX代理Apache(端口7080)和Tomcat上的Jenkins(端口8080)。
步骤:
1 ) 修改Apache端口避免冲突:
-
编辑
/etc/httpd/conf/httpd.conf:将Listen 80改为Listen 7080 -
编辑
/etc/httpd/conf.d/ssl.conf:将Listen 443改为Listen 7443 -
解决SELinux限制:
bashsemanage port -a -t http_port_t -p tcp 7080 semanage port -a -t http_port_t -p tcp 7443 -
防火墙放行:
bashfirewall-cmd --add-port=7080/tcp --permanent firewall-cmd --add-port=7443/tcp --permanent firewall-cmd --reload
2 ) 配置NGINX反向代理:
nginx
http {
# 定义后端服务器组(upstream)
upstream backend-apache {
server 127.0.0.1:7080; # Apache服务
}
upstream backend-jenkins {
server 127.0.0.1:8080; # Jenkins服务
}
server {
listen 80;
server_name www.linuxcoreapp.com linuxcoreapp.com;
# 重定向所有HTTP请求至HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.linuxcoreapp.com linuxcoreapp.com;
# SSL证书配置
ssl_certificate /etc/nginx/pki/server.crt;
ssl_certificate_key /etc/nginx/pki/server.key;
# 路径代理规则
location / {
proxy_pass http://backend-apache; # 根路径代理到Apache
}
location /jenkins {
proxy_pass http://backend-jenkins; # /jenkins路径代理到Jenkins
}
}
}
- 关键指令:
proxy_pass:将请求转发至后端服务器。upstream:定义后端服务器组,支持负载均衡(如添加多台服务器)。
3 ) 应用配置:
bash
systemctl restart nginx # 重启NGINX生效
4 ) 客户端测试:
-
添加本地DNS解析(
/etc/hosts):conf192.168.0.106 www.linuxcoreapp.com linuxcoreapp.com -
访问
https://linuxcoreapp.com→ 代理至Apache。 -
访问
https://linuxcoreapp.com/jenkins→ 代理至Jenkins。
5 )HTTPS配置与安全增强
原理:通过SSL/TLS加密传输,防止数据窃听
步骤:
-
生成证书(复用Apache证书):
bashmkdir /etc/nginx/pki cp /etc/httpd/pki/server.crt /etc/nginx/pki/ # 复制证书 cp /etc/httpd/pki/server.key /etc/nginx/pki/ # 复制私钥 -
在NGINX配置中启用HTTPS:
nginxserver { listen 443 ssl; ssl_certificate /etc/nginx/pki/server.crt; ssl_certificate_key /etc/nginx/pki/server.key; ... } -
强制HTTP重定向至HTTPS:
nginxserver { listen 80; return 301 https://$host$request_uri; }
验证HTTPS:
访问http://linuxcoreapp.com → 自动重定向至https://linuxcoreapp.com,启用加密传输
NestJS实现反向代理示例
1 )方案1
在应用层实现类似代理逻辑
typescript
import { Controller, Get, Req, Res } from '@nestjs/common';
import { createProxyMiddleware } from 'http-proxy-middleware';
import { Request, Response } from 'express';
@Controller()
export class ProxyController {
private apacheProxy = createProxyMiddleware({
target: 'http://localhost:7080', // Apache后端
changeOrigin: true,
});
private jenkinsProxy = createProxyMiddleware({
target: 'http://localhost:8080', // Jenkins后端
changeOrigin: true,
pathRewrite: { '^/jenkins': '/' }, // 路径重写
});
@Get()
proxyRoot(@Req() req: Request, @Res() res: Response) {
this.apacheProxy(req, res); // 代理根路径到Apache
}
@Get('jenkins/*')
proxyJenkins(@Req() req: Request, @Res() res: Response) {
this.jenkinsProxy(req, res); // 代理/jenkins路径到Jenkins
}
}
说明:
- 使用
http-proxy-middleware库处理代理逻辑 changeOrigin: true:修改请求头Host为目标服务器地pathRewrite:重写路径以匹配后端服务路由
2 )方案2
实现NestJS实现反向代理
typescript
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { map } from 'rxjs/operators';
@Injectable()
export class ProxyService {
constructor(private readonly httpService: HttpService) {}
// 反向代理核心逻辑
async forwardRequest(targetUrl: string, originalRequest: Request) {
// 构造目标请求头
const headers = {
'X-Forwarded-For': originalRequest.ip,
'User-Agent': originalRequest.headers['user-agent']
};
// 转发请求并返回数据流
return this.httpService.get(targetUrl, { headers }).pipe(
map(response => response.data)
);
}
// 负载均衡模拟(多后端选择)
async loadBalancedProxy(path: string, req: Request) {
const backendServers = [
'http://internal-server1:8080',
'http://internal-server2:8080'
];
// 简单轮询算法
const target = backendServers[Math.floor(Math.random() * backendServers.length)];
return this.forwardRequest(`${target}${path}`, req);
}
}
配置生效与验证
bash
# 语法检查
sudo nginx -t
# 重启服务
sudo systemctl restart nginx
# 验证代理效果
curl http://www.linuxcoreapp.com # 访问Apache资源
curl http://www.linuxcoreapp.com/jenkins # 访问Jenkins无需8080端口
关键细节:location路径匹配优先级高于/,upstream名称必须使用连字符(禁用下划线)
总结
反向代理通过NGINX实现客户端与后端服务的解耦,提升安全性(隐藏服务器IP)、扩展性(负载均衡)和性能(缓存静态资源)。
技术优势对比
| 服务器 | 并发模型 | 阻塞类型 | 适用场景 |
|---|---|---|---|
| Apache | 进程/线程 | 同步阻塞 | 低并发稳定场景 |
| Nginx | 事件驱动 | 非阻塞 | 高并发/分布式 |
关键数据:单进程支持1024+并发连接,安装包仅1.4MB(运行内存4.1MB),C语言编写确保高性能。
生产环境最佳实践
- 性能调优
worker_processes auto;匹配CPU核心数- 启用
gzip压缩减少带宽消耗
- 安全加固
- 隐藏Nginx版本号:
server_tokens off; - 限制客户端请求体大小:
client_max_body_size 10m;
- 隐藏Nginx版本号:
- 高可用方案
- 使用
keepalive维持上游连接:upstream { keepalive 32; } - 集成
NGINX Plus实现主动健康检查
- 使用
通过上述配置,Nginx成功承担安全网关角色:① 终端用户通过单一入口访问异构服务 ② 后端服务器IP与端口彻底隐藏 ③ HTTPS加密传输抵御中间人攻击。后续可扩展代理缓存、WAF防护等进阶功能
技术总结
- 反向代理核心价值:
- 安全性:隐藏后端服务器信息,避免直接暴露
- 性能优化:通过负载均衡分散请求压力(如淘宝Tengine)
- Nginx核心机制:
- 事件驱动模型:通过
worker_processes auto匹配CPU核心数,高效处理并发 - 配置结构:全局块 →
events块 →http块(含server/location子块) upstream定义后端服务组location匹配路径并proxy_pass转发
- 事件驱动模型:通过
- 生产实践要点:
- 端口管理:避免服务冲突,需同步调整SELinux与防火墙
- 协议升级:HTTP自动跳转HTTPS,增强传输安全性
- SSL终端化:在NGINX统一管理HTTPS证书
补充说明:Nginx与Apache对比中,全球Top 100万网站中Nginx占比超40%(来源:W3Techs),其高并发能力成为大型,NGINX的轻量级与高并发能力使其成为现代Web架构的核心组件,适用于微服务网关、API聚合等场景