Nginx代理与负载均衡
代理
代理有正向代理和反向代理。
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
Nginx代理服务支持的协议
- ngx_http_uwsgi_module模块 :支持Python
- ngx_http_fastcgi_module模块 : 支持支持PHP
- ngx_http_scgi_module模块 : 支持Java
- ngx_http_v2_module模块 : 支持Golang
- ngx_http_proxy_module模块 : 支持HTTP
Nginx反向代理
首先在虚拟机192.168.15.5
自定义配置文件(/etc/nginx/conf.d/mario.conf
)中加入以下配置;
server {
listen 80;
server_name _;
location / {
proxy_pass http://192.168.15.7:80;
}
}
反向代理的ip地址是192.168.15.7
,因此启动此ip机器的nginx。以下是此ip地址机器的nginx配置及其mario文件目录;
启动完成后,使用浏览器访问192.168.15.5
,反向代理成功。
Nginx代理常用参数
1、添加发往后端服务器的请求头信息
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $http_host;
proxy_set_header Connection close;
Context: http, server, location
# 用户请求的时候HOST的值是linux.proxy.com, 那么代理服务会像后端传递请求的还是linux.proxy.com
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2、代理到后端的TCP连接、响应、返回等超时时间
#nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
#nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
#后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
#################### example ########################
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;
3、代理缓冲区
#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
#设置nginx代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
#proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
负载均衡
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性。
负载均衡实现
# 1. 创建IP连接池
upstream [连接池名称] {
server [ip]:[port];
server [ip]:[port];
server [ip]:[port];
}
# 2. 配置反向代理
server {
listen 80;
server_name _;
location / {
proxy_pass http://[连接池];
# 以下代理参数可以写入参数文件/ect/nginx/proxy_params,通过include导入
include /ect/nginx/proxy_params;
# proxy_set_header Host $http_host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_connect_timeout 10s;
# proxy_read_timeout 10s;
# proxy_send_timeout 10s;
# proxy_buffering on;
# proxy_buffer_size 8k;
# proxy_buffers 8 8k;
}
}
负载均衡模式
以下例子前提条件: 在ip连接池中的三个服务器上皆有mario应用,并且目录中皆有web.html,文件中内容分别为web01、web02、web03。
轮询
# 默认情况下,Nginx负载均衡是轮询状态。
upstream mario {
server 192.168.15.7:80;
server 192.168.15.8:80;
server 192.168.15.9:80;
}
访问http://192.168.15.5/web.html
结果如下,
访问结果循环为web02 -> web01 -> web03
,这便是负载均衡默认的轮询模式。
权重
在创建ip连接池的ip后添加weight=权重
配置负载均衡的比例。
# Nginx中的权重0-100,数字越大,权重越高
upstream mario {
server 192.168.15.7:80 weight=9;
server 192.168.15.8:80 weight=5;
server 192.168.15.9:80 weight=1;
}
以上的配置会明显导致访问192.168.15.7这台机器比例最高,192.168.15.9这台机器比例最小。
ip_hash
# 每一个IP固定访问某一个后端。
upstream mario {
server 192.168.15.7:80;
server 192.168.15.8:80;
server 192.168.15.9:80;
ip_hash;
}
以上配置在客户端第一次访问被分配到一个后端后,后续访问皆访问此后端。
负载均衡后端状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后, 服务暂停时间 |
down
配置 down 的 server 不参与负载均衡,即使其他 server 全部宕机也无用。以下配置表示只有192.168.15.8
和192.168.15.9
参与负载均衡。
upstream mario {
server 192.168.15.7:80 down;
server 192.168.15.8:80;
server 192.168.15.9:80;
}
backup
配置 backup 的 server 表示预留的备份服务器,当其他服务器全部宕机后才会分配给它。
upstream mario {
server 192.168.15.7:80 backup;
server 192.168.15.8:80;
server 192.168.15.9:80;
}
max_fails、fail_timeout
一般 max_fails 和 fail_timeout 一起使用,并且在location中需要proxy_next_upstream模块配合使用。proxy_next_upstream是后端错误标识,负载均衡分配给指定的服务器报错到达max_fails阈值时,根据fail_timeout定义的时间内,此服务器不再参与负载均衡。
upstream mario {
server 192.168.15.7:80 max_fails=3 fail_timeout=3s;
server 192.168.15.8:80 max_fails=3 fail_timeout=3s;
server 192.168.15.9:80 max_fails=3 fail_timeout=3s;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://mario;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;
include /etc/nginx/proxy_params;
}
}
proxy_next_upstream 支持的所有错误标识
error # 与服务器建立连接,向其传递请求或读取响应头时发生错误;
timeout # 在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header # 服务器返回空的或无效的响应;
http_500 # 服务器返回代码为500的响应;
http_502 # 服务器返回代码为502的响应;
http_503 # 服务器返回代码为503的响应;
http_504 # 服务器返回代码504的响应;
http_403 # 服务器返回代码为403的响应;
http_404 # 服务器返回代码为404的响应;
http_429 # 服务器返回代码为429的响应(1.11.13);
non_idempotent # 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求;
off # 禁用将请求传递给下一个服务器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署