nginx反向代理动静分离和负载均衡

一.nginx 反向代理简要介绍

1.什么是反向代理

反向代理是一种服务器,在这种设置中,代理服务器接收客户端的请求,并将这些请求转发给一个或多个后端服务器(例如应用服务器、数据库服务器等)。然后,后端服务器处理这些请求并将响应返回给代理服务器,代理服务器再将响应传递给客户端。

2.nginx作为反向代理的优势

  1. 负载均衡:Nginx 可以在多个后端服务器之间分发客户端请求,从而平衡负载,防止单一服务器过载。
  2. 缓存:Nginx 可以缓存静态内容和动态内容,加速响应时间并减少对后端服务器的压力。
  3. 安全性:通过隐藏后端服务器的真实 IP 地址,提高了系统的安全性。
  4. SSL 终止:Nginx 可以处理 SSL/TLS 加密,减轻后端服务器的负载。
  5. 健康检查:Nginx 可以自动检查后端服务器的健康状态,并将请求路由到健康的服务器上。

3.关键指令说明

  • upstream :定义一个名为 backend 的上游服务器组,这里包含了两个后端服务器 backend1.example.combackend2.example.com
  • server :定义一个虚拟主机,这里监听 80 端口,并且处理 www.example.com 的请求。
  • location / :处理所有根路径下的请求。
    • proxy_pass :指定请求应被转发到上游服务器组 backend
    • proxy_set_header :设置一些头信息,例如原始的 Host 字段、客户端的真实 IP 地址 (X-Real-IP),以及代理链 (X-Forwarded-For) 等。

4.负载均衡策略

Nginx 支持多种负载均衡策略,如:

  • 轮询 (Round Robin):默认策略,将请求依次分发到每个后端服务器。
  • 权重 (Weight):根据配置的权重值来分发请求。
  • IP 哈希 (IP Hash):基于客户端 IP 地址进行哈希,每个 IP 地址固定分配到某个后端服务器。
  • 最少连接 (Least Connections):将请求分发到当前连接数最少的服务器。

5.反向代理模块

ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理 7层代理

ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组 负载均衡

ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理 4层代理

ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理

ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

6.反向代理配置参数

Module ngx_http_proxy_module官方文档

7.指令语法

Syntax: proxy_pass URL;

Default: ---

Context: location, if in location, limit_except

proxy_pass;

#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式

#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持

8.示例

在192.168.240.10上编写子配置文件

yum安装子配置文件路径/usr/local/nginx/conf.d/(conf.d需要创建)

在另一台主机192.168.240.11上安装http服务,新建一个网页

在真机上访问192.168.240.10

二.nginx动静分离简要介绍

Nginx 动静分离是一种常见的性能优化技术,它将处理静态资源和动态请求的责任分配给不同的服务器或者服务进程,以提高网站的性能和吞吐量。下面是一个简要介绍:

  1. 静态资源和动态请求: 在网站中,通常有两种类型的请求:静态资源请求和动态请求。静态资源包括图片、CSS 文件、JavaScript 文件等,它们的内容在请求时不会改变。而动态请求则是由服务器生成的动态内容,如 PHP、Python、Java 等后端语言生成的页面。

  2. 传统架构的问题: 在传统的架构中,静态资源和动态请求都由同一个服务器处理。但是这样会导致服务器负载过高,因为动态请求通常需要更多的计算和数据库访问。此外,每个请求都会占用服务器的线程或进程,限制了并发处理能力。

  3. 动静分离原理: 动静分离通过将静态资源交给专门的服务器或者服务进程来处理,从而减轻动态请求对主服务器的压力。通常,Nginx 作为反向代理服务器,可以配置多个反向代理规则,将静态资源的请求转发给专门的静态资源服务器,而动态请求则继续由主服务器处理。

  4. 优势和好处: 动静分离的优势在于提高了网站的性能和可扩展性。静态资源可以被缓存,减少了服务器的访问次数,加快了页面加载速度;而动态请求则可以由专门的后端服务器处理,提高了并发处理能力和响应速度。

示例:

1.在代理服务器192.168.240.10上编写子配置文件

vim /usr/local/nginx/conf.d/djfl.conf

2.在192.168.240.11和192.168.240.13真实服务器上安装nginx服务,制作网页

访问192.168.240.10

在/usr/share/nginx/html下

复制代码
curl 192.168.240.10/api  -L
curl 192.168.240.10/static  -L

三.负载均衡

1. 基本概念

Nginx负载均衡通过将客户端请求分发到多个后端服务器(upstream servers),从而提高系统的响应速度和可靠性。

2. 配置示例

http {

upstream backend {

server backend1.example.com;

server backend2.example.com;

server backend3.example.com;

}

server {

listen 80;

location / {

proxy_pass http://backend;

}

}

}

在上述示例中,upstream块定义了一个名为backend的服务器组,其中包含三个后端服务器。proxy_pass指令用于将请求转发到该服务器组。

3. 负载均衡算法

Nginx支持多种负载均衡算法,包括:

  • 轮询(Round Robin):默认算法,按顺序将请求分配给每个后端服务器。

  • 加权轮询(Weighted Round Robin):可以根据服务器的权重来分配请求,例如:

    upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
    }

  • 最少连接数(Least Connections):将请求分配给当前处理连接数最少的服务器。

    upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    }

  • IP哈希(IP Hash):根据客户端IP地址来分配请求,使同一个IP地址的请求总是被分配到同一台后端服务器。

    复制代码
    upstream backend {
    ip_hash; 
    server backend1.example.com; 
    server backend2.example.com; 
    }

4. 健康检查

Nginx Plus(商业版)提供高级的健康检查功能,但开源版本也可以通过一些第三方模块或自定义脚本来实现基本的健康检查。例如,可以使用proxy_next_upstream指令处理后端服务器故障:

复制代码
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
} 
server { listen 80;
location / { 
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_pass http://backend; 
        } 
    } 
}

5.会话保持

Nginx支持会话保持(Session Persistence),确保用户的请求被分配到同一台后端服务器。可以通过sticky模块实现,该模块需要第三方插件支持:

复制代码
upstream backend {
 sticky;
server backend1.example.com; 
server backend2.example.com; 
}
相关推荐
ping某20 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj3 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes