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

高性能web服务器4——Nginx反向代理A


Nginx 反向代理

Nginx 的反向代理功能是其最强大的特性之一,它允许 Nginx 作为中间层来接收客户端的请求,并将这些请求转发到后端服务器。这种架构不仅可以提高安全性,还可以实现负载均衡、缓存和内容过滤等功能。本文将详细介绍 Nginx 反向代理的基本概念、配置方法以及一些高级用法。
在这里插入图片描述

1. 反向代理的基本概念

1.1 什么是反向代理?

  • 定义:反向代理是一种代理服务器类型,它代表一组后端服务器接受和转发客户端的请求。与正向代理不同,反向代理位于客户端看不见的位置。
  • 作用:提高安全性、负载均衡、缓存、内容过滤等。

1.2 反向代理的工作原理

  • 接收请求:客户端向反向代理服务器发送请求。
  • 转发请求:反向代理服务器根据配置将请求转发到一个或多个后端服务器。
  • 返回响应:后端服务器处理请求并返回响应,反向代理再将响应转发给客户端。

在这里插入图片描述

1.3 反向代理转发模块

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预
定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主
要在不同的场景使用以下模块实现不同的功能

  • ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
  • ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass
    #等指令引用的后端服务器分组
  • ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
  • ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
  • ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

在这里插入图片描述

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需
要经过处理才能被访问
在这里插入图片描述

2. 配置反向代理

2.1 定义后端服务器

在 Nginx 中,你可以定义一个或多个后端服务器,并将它们组合成一个上游组。

示例
upstream backend {server 192.168.1.10:8000;server 192.168.1.11:8000;
}

这里定义了一个名为 backend 的上游组,包含两个后端服务器。

2.2 配置反向代理

接下来,你需要在 location 块中配置反向代理规则。

示例
location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;
}

这里,proxy_pass 指令将请求转发到前面定义的 backend 上游组。

2.3 配置负载均衡

Nginx 支持多种负载均衡算法,包括轮询、最少连接数、哈希等。

示例
upstream backend {least_conn;server 192.168.1.10:8000;server 192.168.1.11:8000;
}

这里,least_conn 指令使得请求被转发到当前连接数最少的后端服务器。

3. 高级配置

3.1 会话保持

会话保持确保来自同一客户端的请求总是被转发到同一个后端服务器。

示例
upstream backend {ip_hash;server 192.168.1.10:8000;server 192.168.1.11:8000;
}

这里,ip_hash 指令实现了基于客户端 IP 地址的会话保持。

3.2 健康检查

Nginx 支持对后端服务器进行健康检查,确保只转发请求到健康的服务器。

示例
upstream backend {server 192.168.1.10:8000;server 192.168.1.11:8000 down;server 192.168.1.12:8000 max_fails=3 fail_timeout=30s;
}

这里,down 表示服务器目前不可用,max_failsfail_timeout 用于配置健康检查。

3.3 缓存

Nginx 可以缓存后端服务器的响应,以减少对后端服务器的请求次数。

示例
location / {proxy_pass http://backend;proxy_cache my_cache;proxy_cache_valid 200 60m;
}

这里,proxy_cache 指令配置了缓存,proxy_cache_valid 指令定义了缓存的有效期。

3.4 SSL/TLS 终结

Nginx 可以作为 SSL/TLS 终结点,处理加密通信,减轻后端服务器的负担。

示例
server {listen 443 ssl;ssl_certificate /etc/nginx/ssl/server.crt;ssl_certificate_key /etc/nginx/ssl/server.key;proxy_pass http://backend;
}

这里,ssl_certificatessl_certificate_key 指令配置了 SSL/TLS 证书。

4. 配置示例

4.1 简单的反向代理

假设你有一个简单的后端服务器,你需要配置 Nginx 作为反向代理来转发请求。

配置文件
server {listen 80;server_name example.com;location / {proxy_pass http://192.168.1.10:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

4.2 负载均衡

假设你有两个后端服务器,你需要配置 Nginx 来实现负载均衡。

配置文件
upstream backend {server 192.168.1.10:8000;server 192.168.1.11:8000;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

4.3 会话保持

假设你有两个后端服务器,你需要配置 Nginx 来实现基于客户端 IP 地址的会话保持。

配置文件
upstream backend {ip_hash;server 192.168.1.10:8000;server 192.168.1.11:8000;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

4.4 SSL/TLS 终结

假设你需要配置 Nginx 来处理 HTTPS 请求,并将请求转发到 HTTP 后端服务器。

配置文件
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/server.crt;ssl_certificate_key /etc/nginx/ssl/server.key;location / {proxy_pass http://192.168.1.10:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

5. 注意事项

  • 确保正确配置 SSL/TLS 证书,以避免安全警告。
  • 监控后端服务器的健康状态,及时调整负载均衡策略。
  • 测试反向代理配置,确保所有功能按预期工作。
  • 考虑到安全性,不要暴露后端服务器的 IP 地址。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 工业数采边缘网关: 直击行业痛点,GXF222-4G助您解忧
  • Cesium 全球视角 和 多方案镜头切换
  • webserver使用webbench工具连续压测失败
  • java grpc 使用
  • 关于tresos Studio(EB)的MCAL配置之ADC
  • linux 进程开机自启
  • 从事大模型研发的技术栈和学习路线
  • SX_Git Graph图形化案例详解_20
  • C++学习笔记——打印ASCII码
  • 2024年8月27日(dockerfile应用,创建私有仓库,在企业中分享项目)
  • 详细了解如何设计和实现一个SSO系统?
  • C++ 设计模式——享元模式
  • 统一 transformer 与 diffusion !Meta 融合新方法剑指下一代多模态王者
  • 速盾:cdn能防ip追踪吗?
  • jieba分词和RecursiveCharacterTextSplitter分词
  • 【node学习】协程
  • 2019年如何成为全栈工程师?
  • 3.7、@ResponseBody 和 @RestController
  • HTML中设置input等文本框为不可操作
  • log4j2输出到kafka
  • maya建模与骨骼动画快速实现人工鱼
  • nfs客户端进程变D,延伸linux的lock
  • python_bomb----数据类型总结
  • Python实现BT种子转化为磁力链接【实战】
  • React Native移动开发实战-3-实现页面间的数据传递
  • SOFAMosn配置模型
  • TypeScript实现数据结构(一)栈,队列,链表
  • Zepto.js源码学习之二
  • 初识 beanstalkd
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 如何利用MongoDB打造TOP榜小程序
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用Swoole加速Laravel(正式环境中)
  • 微信小程序设置上一页数据
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)nginx 配置(nginx.conf)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (阿里云万网)-域名注册购买实名流程
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四)JPA - JQPL 实现增删改查
  • (转)Scala的“=”符号简介
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .aanva
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET企业级应用架构设计系列之技术选型
  • .Net中wcf服务生成及调用
  • /boot 内存空间不够
  • @Autowired和@Resource装配