Nginx代理服务
- Nginx代理服务概述
- Nginx代理配置语法
- Nginx正向代理示例
- Nginx反向代理示例
- Nginx负载均衡
- Nginx负载均衡配置场景
- Nginx负载均衡状态配置
- Nginx负载均衡调度策略
- Nginx负载均衡TCP配置
- Nginx动静分离
- Nginx动静分离应⽤案例
- Nginx⼿机电脑应⽤案例
总结
- 按照范围划分 :
gslb
和slb
(调度节点和应用节点在同内网段 ,常用) - 按照层级划分 :
4层(代理端口)
和7层(http,应用层转发)
- 调度算法 :
轮询
,加权轮询
,ip_hash
,url_hash
- 节点状态 :
提供支持
,提供备份
,不使用
- 负载均衡 :
动静分离
,按浏览器类型划分
,按手机类型划分
代理复习
Nginx 作为代理服务可以实现很多的协议代理, 我们主要以 http 代理为主
正向代理(内部上⽹)
客户端<–>代理->服务端
反向代理
客户端->代理<–>服务端
代理区别 , 区别在于代理的对象不⼀样:
- 正向代理代理的对象是客户端
- 反向代理代理的对象是服务端
Nginx代理配置语法
1 | Syntax: proxy_pass URL; |
url举例 :
类似于 nopush 缓冲区
1 | # 尽可能收集所有头请求, |
1 | # 扩展: |
跳转重定向
在代理之后 ,去拿资源的时候,资源做一个301的跳转 , 此配置基本不用
1 | Syntax: proxy_redirect default; |
头信息
- 客户端通过代理 , 访问服务端
- 那么服务端如何知道服务端的真实地址呢 ? 使用
头信息
1 | Syntax: proxy_set_header field value; |
1 | # 扩展: |
代理到后端的 TCP 连接超时
1 | Syntax: proxy_connect_timeout time; |
1 | # 扩展 |
Proxy 常⻅配置项具体配置
1 | # vim /etc/nginx/proxy_params |
具体location实现
1 | location / { |
Nginx正向代理
Nginx 正向代理配置实例 :
- 服务端只允许112访问
- 客户端要想访问服务端 , 那么就要想办法让112为我代理
配置69.113访问限制,仅允许同⽹段访问
1
2
3
4
5location ~ .*\.(jpg|gif|png)$ {
allow 192.168.69.0/24;
deny all;
root /soft/code/images;
}112配置正向代理
1
2
3
4
5
6
7
8
9
10
11server {
listen 80;
resolver 233.5.5.5;
location / {
# 当有人访问112的时候,就将其转发给http://$http_host$request_uri
proxy_pass http://$http_host$request_uri;
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;
}
}$http_host
: 等于 request 中 header的值 , 客户端使用代理的时候 , 需要在header里告诉代理服务器需要代理的网站 , 就放在$http_host
$request_uri
: 就是请求url
Nginx反向代理示例
proxy代理 :
1 | server { |
WEB站点 :
1 | server { |
Nginx负载均衡
提升吞吐率, 提升请求性能, 提⾼容灾
负载均衡按范围划分
- GSLB全局负载均衡
- SLB
GSLB和SLB最大区别就是:
- SLB的调度节点和服务节点在同一个机房,用同一个网络
- GSLB调度节点和服务节点不在同一个网络中 ,
G
即global
, 在不同地区设立了多个数据中心
Nginx 是⼀个典型的
SLB
负载均衡按层级划分
- 四层负载均衡
- 七层负载均衡
- 这里的四层和七层就是
ISO网络模型
- 因为Nginx一般处理的HTTP转发,HTTP是应用层 , 所以 Nginx 是⼀个典型的七层 SLB
- 同理 , 为什么Nginx还可以转发邮件 , 因为邮件协议
SMTP
就是在第七层第四层
就是传输层 , 因此只能转发端口
,ip
之类的
Nginx负载均衡配置场景
Nginx 实现负载均衡⽤到了 proxy_pass
代理模块核⼼配置, 将客户端请求代理转发⾄⼀组 upstream 虚拟服务池
代理和负载均衡的区别
- 代理 是Nginx将请求转发给具体的IP
- 负载均衡 是Nginx将请求转发给虚拟服务池
举例说明就是
- 代理 是将任务交给指定的人去做
- 负载均衡 是将任务交给一个部门去做 , 而不去管是这个部门的哪个人去做
Nginx upstream 虚拟配置语法
1 | Syntax: upstream name { ... } |
upstream例⼦
1 | upstream my_upstream { |
这样 ,就会负载均衡到backend1.example.com
,backend2.example.com:8080
,unix:/tmp/backend3
,backup1.example.com:8080 backup
Nginx负载均衡状态配置
后端服务器在负载均衡调度中的状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器(当其他的都down之后才使用这个服务器) |
max_fails | 允许请求失败的次数(绑定fail_timeout使用) |
fail_timeout | 经过max_fails失败后, 服务暂停时间(绑定max_fails使用) |
max_conns | 限制最⼤的接收连接数 |
1 | upstream my_upstream { |
Nginx负载均衡调度策略
调度算法 | 概述 |
---|---|
轮询 | 按时间顺序逐⼀分配到不同的后端服务器(默认) |
weight | 加权轮询,weight值越⼤,分配到的访问⼏率越⾼ |
ip_hash | 每个请求按访问IP的hash结果分配,这样来⾃同⼀IP的固定访问⼀个后端服务器 |
url_hash | 按照访问URL的hash结果来分配请求,是每个URL定向到同⼀个后端服务器 |
least_conn | 最少链接数,那个机器链接数少就分发 |
hash关键数值 | hash⾃定义的key |
Nginx负载均衡权重轮询具体配置 :
1 | upstream load_pass { |
Nginx负载均衡 ip_hash 具体配置 :
1 | upstream load_pass { |
Nginx负载均衡url_hash具体配置 :
1 | upstream load_pass { |
Nginx负载均衡TCP配置
Nginx 四层代理仅能存在于 main 段
1 | # stream需定义在http外层 |
Nginx动静分离
- 动静分离,通过中间件将动态请求和静态请求进⾏分离, 分离资源, 减少不必要的请求消耗, 减少请求延时。
- 好处: 动静分离后, 即使动态服务不可⽤, 但静态资源不会受到影响
- 通过
中间件
将动态请求和静态请求分离
- 对于动态请求 , 中间件就直接将这个请求交给程序框架
- 对于静态请求 , Nginx直接响应 , 返回数据包 . 根本没有经过程序框架
1 | server{ |
配置负载均衡代理调度, 实现访问 jsp 和 png
1 | upstream static { |
Nginx⼿机电脑应⽤案例
根据不同的浏览器, 以及不同的⼿机, 访问的效果都将不⼀样。
1 | # 通过浏览器来分别连接不同的浏览器访问不同的效果。 |
1 | # server根据判断来访问不同的⻚⾯ |