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

相关推荐
石小千13 小时前
Ubuntu24.04 安装Docker
运维·docker·容器
坏一点13 小时前
Yocto项目构建(3)——构建和部署树莓派镜像
linux·驱动开发·嵌入式硬件
Ronin30513 小时前
【Linux网络】多路转接select
linux·网络·select·多路转接
zhuzewennamoamtf13 小时前
Linux设备树理解和应用
linux·运维·服务器
雨大王51213 小时前
汽车厂内物流如何通过自动化实现降本增效?
运维·自动化
Qzkj66613 小时前
医疗和教育行业自动化、精准匹配、易掌握的数据分类分级最佳实践与案例
大数据·运维·自动化
我科绝伦(Huanhuan Zhou)13 小时前
Linux 环境下 SQL Server 自动收缩日志作业创建脚本(Shell 版)
linux·运维·数据库·sql server
徐徐图之!14 小时前
五、【阶段一运维基础 之 干货!!!】安装 Vmware 和 CentOS
linux·运维·centos
石小千14 小时前
OpenProject服务的备份与恢复
运维
scriptsboy14 小时前
Halo Docker 迁移方法
运维·docker·容器