Linux小课堂: NGINX反向代理服务器配置与实践
代理服务器基础概念
代理服务器充当客户端与后端服务器之间的中介
正向代理(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仓库(额外软件包源):
yum install epel-release -y
yum update epel-release -y
2 )安装NGINX:
yum install nginx -y # 安装包仅562KB
3 )解决端口冲突(默认80端口被Apache占用):
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驱动) - 修改默认页面:
vim /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限制:
semanage port -a -t http_port_t -p tcp 7080 semanage port -a -t http_port_t -p tcp 7443 - 防火墙放行:
firewall-cmd --add-port=7080/tcp --permanent firewall-cmd --add-port=7443/tcp --permanent firewall-cmd --reload
2 ) 配置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 ) 应用配置:
systemctl restart nginx # 重启NGINX生效
4 ) 客户端测试:
- 添加本地DNS解析(
/etc/hosts):192.168.0.106 www.linuxcoreapp.com linuxcoreapp.com - 访问
https://linuxcoreapp.com→ 代理至Apache。 - 访问
https://linuxcoreapp.com/jenkins→ 代理至Jenkins。
5 )HTTPS配置与安全增强
原理:通过SSL/TLS加密传输,防止数据窃听
步骤:
- 生成证书(复用Apache证书):
mkdir /etc/nginx/pki cp /etc/httpd/pki/server.crt /etc/nginx/pki/ # 复制证书 cp /etc/httpd/pki/server.key /etc/nginx/pki/ # 复制私钥 - 在NGINX配置中启用HTTPS:
server { listen 443 ssl; ssl_certificate /etc/nginx/pki/server.crt; ssl_certificate_key /etc/nginx/pki/server.key; ... } - 强制HTTP重定向至HTTPS:
server { listen 80; return 301 https://$host$request_uri; }
验证HTTPS:
访问http://linuxcoreapp.com → 自动重定向至https://linuxcoreapp.com,启用加密传输
NestJS实现反向代理示例
1 )方案1
在应用层实现类似代理逻辑
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实现反向代理
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);}
}
配置生效与验证
# 语法检查
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聚合等场景
