当前位置: 首页 > news >正文

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加密传输,防止数据窃听

步骤:

  1. 生成证书(复用Apache证书):
    mkdir /etc/nginx/pki  
    cp /etc/httpd/pki/server.crt /etc/nginx/pki/  # 复制证书 
    cp /etc/httpd/pki/server.key /etc/nginx/pki/  # 复制私钥
    
  2. 在NGINX配置中启用HTTPS:
    server {  listen 443 ssl;  ssl_certificate /etc/nginx/pki/server.crt;  ssl_certificate_key /etc/nginx/pki/server.key;  ...  
    }  
    
  3. 强制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语言编写确保高性能。

生产环境最佳实践

  1. 性能调优
    • worker_processes auto; 匹配CPU核心数
    • 启用gzip压缩减少带宽消耗
  2. 安全加固
    • 隐藏Nginx版本号:server_tokens off;
    • 限制客户端请求体大小:client_max_body_size 10m;
  3. 高可用方案
    • 使用keepalive维持上游连接:upstream { keepalive 32; }
    • 集成NGINX Plus实现主动健康检查

通过上述配置,Nginx成功承担安全网关角色:① 终端用户通过单一入口访问异构服务 ② 后端服务器IP与端口彻底隐藏 ③ HTTPS加密传输抵御中间人攻击。后续可扩展代理缓存、WAF防护等进阶功能

技术总结

  1. 反向代理核心价值:
    • 安全性:隐藏后端服务器信息,避免直接暴露
    • 性能优化:通过负载均衡分散请求压力(如淘宝Tengine)
  2. Nginx核心机制:
    • 事件驱动模型:通过worker_processes auto匹配CPU核心数,高效处理并发
    • 配置结构:全局块 → events块 → http块(含server/location子块)
    • upstream定义后端服务组
    • location匹配路径并proxy_pass转发
  3. 生产实践要点:
    • 端口管理:避免服务冲突,需同步调整SELinux与防火墙
    • 协议升级:HTTP自动跳转HTTPS,增强传输安全性
    • SSL终端化:在NGINX统一管理HTTPS证书

补充说明:Nginx与Apache对比中,全球Top 100万网站中Nginx占比超40%(来源:W3Techs),其高并发能力成为大型,NGINX的轻量级与高并发能力使其成为现代Web架构的核心组件,适用于微服务网关、API聚合等场景

http://www.dtcms.com/a/541754.html

相关文章:

  • 做网站的人多吗c 做网站源码实例
  • C++核心组件与构建过程全解析
  • 探秘XZ压缩:以“极致小巧”重塑数据存储效率
  • 【笔试真题】- 电信-2025.10.17
  • 网站悬浮窗商标注册网官方查询
  • 基于python大数据的特产推荐系统
  • AI整理详细解释C++中的内存对象模型
  • DDC可编程控制器风机水泵空调节能控制器哪家技术强
  • 撰写网站栏目规划百度网址大全
  • 【案例实战】鸿蒙开发:web页面如何适配深色模式
  • 大学学院教授委员会制度研究(六)思考与建议-杨立恒毕业论文
  • 算法--滑动窗口(二)
  • 公司网站里面页面链接怎么做网站制作千知寻
  • MIRE: Matched Implicit Neural Representations
  • 中山网站推广如何通过短视频与网站联动实现精准获客?六匹马的AI策略解析
  • 广西鼎汇建设集团有限公司网站适合交换友情链接的是
  • vue3 懒加载第三方组件
  • 洛阳霞光做网站公司自己做的网站点击赚钱
  • 在哪个网站做外贸生意好网站域名试用期
  • 海口市建设工程质量安全监督站网站网站导航菜单代码
  • 什么是战略屋?基本定义
  • 华为OD机试双机位A卷 - 分披萨 (C++ Python JAVA JS GO)
  • 网站设计与开发未来发展方向房地产销售新手入门知识
  • 网站开发各个文件电脑制作ppt的软件
  • 青岛网站建设青岛新思维搜索引擎外部链接优化
  • 天津市网站建设官网静态html模板
  • 【STL——list】
  • 购物类网站设计网站公司可去亿企邦
  • KH|我跟A学习Linux语句:systemctl与rm
  • AI写作的字数谜题:Token机制与指令遵循的双重困境