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; 
}
相关推荐
_.Switch18 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_8504108318 分钟前
文件系统和日志管理
linux·运维·服务器
JokerSZ.22 分钟前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
芯盾时代1 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方2 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘2 小时前
NFS服务器
运维·服务器
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰3 小时前
[linux]docker基础
linux·运维·docker
Jason-河山4 小时前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化
雨雪飘零4 小时前
Windows系统使用OpenSSL生成自签名证书
nginx·证书·openssl