Nginx学习笔记(四、Nginx反向代理与负载均衡)
目录:
- 正向代理与方向代理简介
- 正向代理基本操作指令
- 反向代理基本操作指令
- 负载均衡
正向代理与方向代理简介
1、正向代理:内部服务器访问外部资源。
外部资源好比外面的因特网,是一个巨大的资源库,如果不受控制的访问外部资源那肯定是及其不安全的,容易导致病毒入侵内网。
因此就需要一个挡板或过滤器来限制这种不安全的资源访问,正向代理便是如此的代理服务器。
它主要是为了增强局域网内部的网络安全性,使得外网的威胁因素影响不到内部的网络;这里的代理服务器起到了防火墙的作用,同时也可以对局域网内的访问进行必要的监控和管理,正向代理服务器不支持外部对内部网络的访问请求。
2、反向代理:外部资源访问内部服务器。
它与正向代理相反,如果我们的局域网向Internet提供资源,让internet上的其他用户可以访问我们局域网内部资源,也可以设置一个代理服务器,他提供的服务就叫做反向代理(Reverse proxy)服务。
正向代理基本操作指令
指令名称: |
用途: |
resolver |
指定DNS ip地址默认端口53 |
resolver_timeout |
设置解析超时时间 |
proxy_pass |
代理服务器的协议地址 |
1、resolver:该指令用于指定DNS服务器的IP地址。
DNS服务器的主要工作是对域名的解析工作,将域名转变为对应的ip地址。
1 server { 2 # 设置DNS服务器的IP 3 # valid:有些情况下我们的数据包在一定的时间内不能被传递到目的地,但是又不能让这个数据包无线的存在,所以我们可以设定一个时间 4 # 当数据包在这段时间内没有到达目的地就会被丢弃,然后发送者会受到一个消息,并且决定要不要重新发送该数据包 5 resolver 8.8.8.8 valid = 30s; 6 7 listen 80; 8 server_name localhost; 9 }
2、resolver_timeout指令。
该指令用于设置DNS服务器解析超时时间。
1 server { 2 resolver 8.8.8.8 valid = 30s; 3 # 设置DNS服务器的解析超时时间 4 resolver_timeout 100s; 5 6 listen 80; 7 server_name localhost; 8 9 #charset koi8-r; 10 }
3、proxy_pass指令。
该指令用于配置代理服务器的协议的地址,更用于nginx的反向代理服务。
指令:proxy_pass URL(URL指的是设置代理服务器协议和地址)。
1 server { 2 resolver 8.8.8.8 valid = 30s; 3 resolver_time 100s; 4 5 listen 80; 6 server_name localhost; 7 8 location / { 9 root html; 10 index index.html index.htm; 11 proxy_pass http://$http_host$request_uri; 12 } 13 }
其中代理服务器协议设置为Http,$http_host和$request两个变量是Nginx支持的动态获取主机和uri的变量。
反向代理基本操作指令
1、proxy_pass:设置被代理服务器的地址。
1 upstream testServer { 2 3 # weight:权重 4 server ip1:8080 weight=1; 5 server ip2:8081 weight=1; 6 7 # 1-2 ip_hash; 服务器 不会太大 8 # 3-5 session复制; 配置比较麻烦一点 9 # 5以上 redis共享 直接代码层次 10 # ip_hash; 11 12 } 13 14 server { 15 16 # 监听的端口 17 listen 80; 18 server_name localhost; 19 20 #charset koi8-r; 21 22 #access_log logs/host.access.log main; 23 24 # 请求带有/server的,转到此处理 25 location /server { 26 # 设置被代理的服务器:把http://host/server的请求代理到http://testServer执行 27 # http://testServer >>> upstream testServer中的server 28 # 也就是会转到ip1:8080或ip2:8081处理 29 proxy_pass http://testServer; 30 } 31 32 }
2、proxy_hide_header:配置发送http响应隐藏的头域信息。
1 # field为需要发送的头域,该指令可以在http、server、location块中进行配置 2 proxy_hide_header field;
3、proxy_pass_header:配置头域信息。
1 # field指的是哪些文件将被发送 2 Proxy_pass_header field;
4、proxy_pass_request_body:配置是否客户端发送的请求体发送给代理服务器。
1 # 默认为on,开关可以在http块server或者location块中进行配置 2 proxy_pass_request_body on|off;
5、proxy_pass_request_headers:配置是否发送请求头给代理服务器。
# 默认为on,开关可以在http块server或者location块中进行配置 proxy_pass_request_headers on|off;
6、proxy_set_header:更改nginx服务器收到的请求头,然后将新的请求头发给代理服务器。
1 # field你要更改的信息所在的头域 2 # value更改的值,支持文本,变量或者说变量的结合 3 proxy_set_header field value; 4 5 # 默认情况下的配置 6 proxy_set_header host $proxy_host; 7 8 # 实例: 9 # 将目前host的值充填成客户端的地址值 10 proxy_set_header host $http_host; 11 # 将location块的server_name的指令充填到Host头域 12 proxy_set_header host $host;
7、proxy_set_body:更改nginx服务器的请求体。
1 # value是更改的信息,支持文本变量或者变量的组合 2 proxy_set_body value;
8、proxy_bind:强行将代理主机绑定到指定的ip地址。
1 # ip指的是主机ip(只有0.8.22nginx以上支持) 2 proxy_bind ip;
9、proxy_connect_timeout:配置nginx服务器与被代理服务器建立进阶的超时时间。
1 # Time为超时时间默认60s 2 proxy_connect_timeout time;
10、proxy_read_timeout:nginx服务器向后端被代理服务器发出read请求后等待响应超时时间。
1 # Time为超时时间默认60s 2 proxy_read_timeout time;
11、proxy_send_timeout:示nginx服务器向后端发起write请求后等待响应的超时时间。
1 # Time为超时时间默认60s 2 proxy_send_timeout time;
12、proxy_http_version:设置http协议版本。
1 # 版本自己选择1.0或者1.1稳定一点 2 proxy_http_version 1.0|1.1;
13、proxy_method:设置nginx服务器请求被代理服务器时使用的请求方法,一般为post 或者get。
1 # 注意自己选择get还是post不要加""号 2 proxy_method post|get;
14、proxy_ignore_client_abort:设置客户端中断网络请求,nginx服务器是否中断被代理的服务器请求。
1 # 默认off,极少使用数据交互 2 proxy_ignore_client_abort off|on
15、proxy__ignore_headers:设置一些http的响应头区域 nginx服务器接收到被代理的服务器响应时不会被处理设置的头域。
1 # field 未设置的http响应头的区域,例如"x-accel-REdirect","x-Accel-Expires"等 2 proxy_ignore_headers field ...
负载均衡
Nginx负载均衡策略分为如下几种:
- 一般轮询
- 加权轮询
- ip_hash(session共享)
- 最小链接leastconn(第三方)
- url_hash(第三方)
常用的负载均衡配置示例:
1、一般轮询负载均衡:
每个请求按时间顺序逐一分配到不同的后端服务器,所有服务器的默认权重为1(weight=1),若后端发起down调,自动剔除。
1 upstream testServer { 2 server 192.168.56.10:80; 3 server 192.168.56.20:80; 4 server 192.168.56.30:80; 5 } 6 7 server { 8 listen 80; 9 server_name www.yuming.com; 10 localtion / { 11 proxy_pass http://testServer 12 ...... 13 } 14 }
所有访问http://www.yuming.com的请求都会使用testServer组中的服务器实现负载均衡。
2、加权轮询负载均衡:
请求按照权重比率分配到不同的后端服务器,用于后端服务器性能不均的情况。
1 upstream testServer { 2 server 192.168.56.10:80 weight=3; 3 server 192.168.56.20:80 weight=2; 4 server 192.168.56.30:80 weight=1; 5 } 6 7 server { 8 listen 80; 9 server_name www.yuming.com; 10 localtion / { 11 proxy_pass http://testServer 12 ...... 13 } 14 }
3、特定资源负载均衡:
该示例中定义了两组负载均衡服务器,用于处理不同的请求。一组用于对css类型的文件进行请求处理,另外—组用于对file类型的文件进行请求处理。
1 upstream imgTestServer { 2 server 192.168.56.10:80; 3 server 192.168.56.20:80; 4 server 192.168.56.30:80; 5 } 6 7 upstream cssTestServer { 8 server 192.168.60.10:80; 9 server 192.168.60.20:80; 10 server 192.168.60.30:80; 11 } 12 13 server { 14 listen 80; 15 server_name www.yuming.com; 16 17 localtion /img/ { 18 proxy_pass http://imgTestServer 19 ...... 20 } 21 22 localtion /css/ { 23 proxy_pass http://cssTestServer 24 ...... 25 } 26 }
所有访问http://www.yuming.com/img/*都会在imgTestServer服务器组中获得均衡效果。
所有访问http://www.yuming.com/css/*都会在cssTestServer服务器组中获得均衡效果。
4、不同域名负载均衡:
该示例中定义了两组虚拟服务器,两组被代理的后端务器组,分别用于对来自不同域名请求进行负载均衡处理。
1 upstream imgTestServer { 2 server 192.168.56.10:80; 3 server 192.168.56.20:80; 4 server 192.168.56.30:80; 5 } 6 7 upstream cssTestServer { 8 server 192.168.60.10:80; 9 server 192.168.60.20:80; 10 server 192.168.60.30:80; 11 } 12 13 server { 14 listen 80; 15 server_name img.yuming.com; 16 localtion /img/ { 17 proxy_pass http://imgTestServer 18 ...... 19 } 20 } 21 22 server { 23 listen 81; 24 server_name css.yuming.com; 25 localtion /css/ { 26 proxy_pass http://cssTestServer 27 ...... 28 } 29 }
来自img.yuming.com/的请求,会由虚拟服务器server1接受并转向imgTestServer服务器进行负载均衡处理。
来自css.yuming.com/的请求,会由虚拟服务器server2接受并转向cssTestServer服务器进行负载均衡处理。
5、URL重写负载均衡:
URL rewrite的主要功能是实现地址的重定向,URL地址修改时不需要客户端参与,直接在服务端进行修改。其可用于隐藏真实的地址等等。
语法格式:rewrite <regex> <replacement> [flag];
- regex:使用prel兼容的正则进行匹配。
- replacement:将匹配的内容替换成replacement。
- flag:热write支持的flag标记。
- last:规则匹配完成后继续向下匹配新的location规则。
- break:规则匹配完成后不再匹配后面的任何规则。
- redirect:返回302临时重定向。
- permanent:返回301永久重定向。
该示例中定义了一组虚拟服务器,然后使用URL重写功能实现负载均衡。
1 upstream backend { 2 server 192.168.56.10:80; 3 server 192.168.56.20:80; 4 server 192.168.56.30:80; 5 } 6 7 server { 8 listen 80; 9 server_name www.yuming.com; 10 localtion /file/ { 11 rewrite ^(/file/.*)/media/(.*)\.*$ $1/mp3/$2.mp3 last; 12 } 13 14 localtion / { 15 proxy_pass http://backend; 16 proxy_set_header Host $host; 17 ...... 18 } 19 }
对于请求http://www.myweb.com/file/download/media/1.mp3,首先会使用location rewirte进行重写为http://www.myweb.com/file/download/mp3/1.mp3。再由location/发送backend服务器组实现负载均衡。