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服务器组实现负载均衡。

posted @ 2020-11-08 12:09  被猪附身的人  阅读(224)  评论(0编辑  收藏  举报