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仓库(额外软件包源):

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驱动)

  • 修改默认页面:

    bash 复制代码
    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限制:

    bash 复制代码
    semanage port -a -t http_port_t -p tcp 7080  
    semanage port -a -t http_port_t -p tcp 7443  
  • 防火墙放行:

    bash 复制代码
    firewall-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):

    conf 复制代码
    192.168.0.106 www.linuxcoreapp.com linuxcoreapp.com  
  • 访问https://linuxcoreapp.com → 代理至Apache。

  • 访问https://linuxcoreapp.com/jenkins → 代理至Jenkins。

5 )HTTPS配置与安全增强

原理:通过SSL/TLS加密传输,防止数据窃听

步骤:

  1. 生成证书(复用Apache证书):

    bash 复制代码
    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:

    nginx 复制代码
    server {  
      listen 443 ssl;  
      ssl_certificate /etc/nginx/pki/server.crt;  
      ssl_certificate_key /etc/nginx/pki/server.key;  
      ...  
    }  
  3. 强制HTTP重定向至HTTPS:

    nginx 复制代码
    server {  
      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语言编写确保高性能。

生产环境最佳实践

  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聚合等场景

相关推荐
zhilin_tang3 小时前
对比select和epoll两种多路复用机制
linux·c语言·架构
showker4 小时前
ecstore等产品开启缓存-后台及前台不能登录原因-setcookie+session问题
java·linux·前端
运维行者_4 小时前
运维实战:SSL 证书故障避坑指南(精简版)
运维·网络协议·ssl
AI扶我青云志4 小时前
AGENT 和自动化工作流的区別
运维·自动化
victory04314 小时前
progen2 docker镜像打包命令文档
运维·docker·容器
初学者_xuan4 小时前
零基础新手小白快速了解掌握服务集群与自动化运维(十五)Redis模块-哨兵集群
运维·redis·自动化
conkl4 小时前
在 CentOS 系统上实现定时执行 Python 邮件发送任务完整指南
linux·运维·开发语言·python·centos·mail·邮箱
江輕木4 小时前
VMware安装配置CentOS 7
linux·运维·centos
wydaicls5 小时前
了解一下kernel6.12中cpu_util_cfs_boost函数的逻辑
linux·开发语言