美文网首页htmlLinux 服务器的搭建
[code.nginx] Nginx服务器的代理服务

[code.nginx] Nginx服务器的代理服务

作者: 吃瓜的东 | 来源:发表于2017-08-05 13:45 被阅读580次

正向代理与反向代理的概念

代理(Proxy)服务,通常也称为正向代理服务,可以使用下图示意,



其中箭头的方向指示访问的方向。如果把局域网外的Internet想象成一个巨大的资源库,那么资源就分布在Internet的各个站点上,局域网内的客户端要访问这个库里的资源必须统一通过代理服务器才能对各个站点进行访问。
局域网的机器借助代理服务访问局域网外的网站,这主要是为了增强局域网内部网络的安全性,使得网络外的威胁因素不容易影响到网内,这里代理服务器起到了一部分防火墙的功能。同时,利用代理服务器也可以对局域网对外网的访问进行必要的监控和管理。正向代理服务器不支持外部对网络的访问请求。即上图中的箭头的方向不能反过来。
与正向代理服务器相反,如果局域网向Internet提供资源,让Internet上的其他用于可以访问局域网内的资源,也可以设置使用一个代理服务器,它提供的服务就叫做反向代理(Reverse Proxy)服务。可以看到,反向代理服务器与代理服务在功能逻辑上刚好是相反的。箭头方向代表访问方向。



正向代理服务器与反向代理服务器的概念和简单,归纳起来就是,正向代理服务器用来让局域网客户机接入外网以访问外网资源,反向代理服务器用来让外网的客户端接入局域网中的站点以访问站点中的资源。理解这两个概念的关键是要明白我们当前的角色和目的是什么,在正向代理服务器中,我们的角色是客户端,目的是要访问外网的资源。在反向代理服务器中,我们的角色是站点,目的是把站点的资源发布出去让其他客户端能够访问。

Nginx服务器的正向代理服务

首先介绍Nginx服务器的正向代理服务的相关配置指令和正向代理服务的使用。

Nginx服务器正向代理服务的配置的3个指令

在实际应用中,使用Nginx服务器代理服务功能的情况相对少一些,Nginx代理服务本身也相对简单,涉及的主要指令不多,我们接下来分别介绍。这些指令原则上可以出现在Nginx配置文件的http块、server块或者location块中,但是一般在搭建的Nginx服务器中单独配置一个server块用来设置代理服务。

1.resolver指令
该指令用于指定DNS服务器的IP地址。DNS服务器的主要工作是进行域名解析,将域名映射为对应的IP地址。该指令的语法结构为:

resolver address ... [valid=time]
  • address,DNS服务器的IP地址。如果不指定端口号,默认使用53端口。
  • time,设置数据包在网络中的有效时间。出现该指令的主要原因是,在访问站点时,有很多情况使得数据包在一定时间内不能被传递到目的地,但是又不能让该数据包无期限的存在,于是就需要设定一段时间,当数据包在这段时间内没有到达目的地,就会被丢弃,然后发送者会接收到一个消息,并决定是否要重发数据包。
    使用该指令的一个例子如下:
resolver 127.0.0.1 [::1]:5353 valid=30s;

在实际应用中,一般不需要设置这么复杂,只要将DNS服务器的IP地址设置给该指令即可。
从Nginx 1.1.7版本开始,该指令支持设置多个IP地址,从Nginx 1.3.1开发版本和Nginx 1.2.2稳定版本开始,该指令支持设置IPV6地址。

2.resolver_timeout指令
该指令用于设置DNS服务器域名解析超时时间,语法结构为:

resolver_timeout time;

3.proxy_pass指令
该指令用于设置代理服务器的协议和地址,它不仅仅用于Nginx服务器的代理服务,最主要的是应用于反向代理服务,我们马上就会谈及。该指令的语法结构为:

proxy_pass URL;

其中,URL即为设置的代理服务器协议和地址。
在代理服务配置中,该指令的设置相对固定,因此在这里就不介绍其他细节了,具体内容在学习Nginx服务器的反向代理服务时再重点阐述。在代理服务配置中,该指令配置为:

proxy_pass http://$http_host$request_uri;

其中,代理服务器协议设置为HTTP,$http_host和$request_uri两个变量是Nginx配置支持的用于自动获取主机和URI的变量。配置代理服务时,一般不要改变该指令的配置。

Nginx服务器正向代理服务的使用

这里,给大家准备了一个Nginx服务器基本代理服务的配置示例片段,帮助大家在实际应用中更容易地实施部署。

        ...
        server
        {
                  resolver   8.8.8.8;
                  listen 82;
                  location /
                  {
                          proxy_pass http://$http_host$request_uri;
                  }        
        }

实例片段很简单,设置DNS服务器地址为8.8.8.8,使用默认的53端口作为DNS服务器的服务端口,代理服务的监听端口设置为82端口,Nginx服务器接收到的所有请求都由第5行的location块进行过滤处理。
Nginx服务器代理服务使用的场合不多,从上一节的配置指令来看,功能也相对简单。在使用过程中,有一些需要注意的事项在这里说明一下。
首先,设置Nginx服务器的代理服务器,一般是配置到一个server块中。注意,在该server块中,不要出现server_name指令,即不要设置虚拟主机的名称或IP。而resolver指令是必须的,如果没有该指令,Nginx服务器无法处理接收到的域名。
其次,Nginx服务器的代理服务器不支持正向代理HTTPS站点。

Nginx服务器的反向代理服务

Nginx服务器的反向代理服务时其最常用的重要功能之一,在实际工作中应用广泛,涉及的配置指令也比较多,各类指令完成的功能也不尽相同。这里按照功能功能分类介绍配置该服务需要掌握的配置指令。由反向代理服务又可以衍生出多种于此相关的Nginx服务器的重要功能,随后将逐步梳理这些功能,并提供配置实例供大家参考。
Nginx服务器提供的反向代理服务也是比较高效的。它能够同时接收的客户端连接由worker_processes指令和worker_connections指令决定,计算方法为:worker_processes * worker_connections / 4。
配置Nginx服务器反向代理用到的指令如果没有特别说明,原则上可以出现在Nginx配置文件的http块、server块或者location块中,但同正向代理服务器设置一样,一般是在搭建的Nginx服务器中单独配置一个server块用来设置反向代理服务。这些指令主要由ngx_http_proxy_module模块进行解析和处理。该模块是Nginx服务器的标准HTTP模块。

反向代理的基本设置的21个指令

学习Nginx服务器的反向代理服务,要涉及与后端代理服务器相关的配置。本小节涉及的指令比较重要,是为客户端提供正常Web服务的基础,应该熟练掌握,尤其是proxy_pass指令,在实际应用过程中需要注意一些配置细节,需要小心使用。

1.proxy_pass指令
该指令用来设置被代理服务器的地址,可以是主机名称、IP地址加端口号等形式。其语法结构为:

proxy_pass URL;

其中,URL为要设置的被代理服务器的地址,包含传输协议、主机名称或IP地址加端口号、URI等要素。传输协议通常是“http”或者“https://”。指令同时还接受以“unix”开始的UNIX-domain套接字路径。例如:

proxy_pass http://www.myweb.name/uri;
proxy_pass http://localhost:8000/uri/;
proxy_pass http://unix:/tmp/backend.socket:/uri/;

如果被代理服务器是一组服务器的话,可以使用upstream指令配置后端服务器组。例如:

          ...
          upstream proxy_svrs          #配置后端服务器组
          {
                   server http://192.168.1.1:8001/uri/;
                   server http://192.168.1.2:8001/uri/;
                   server http://192.168.1.3:8001/uri/;
          }

          server
          {
                    ...
                    listen 80;
                    server_name  www.myweb.name;
                    location /
                    {
                            proxy_pass  proxy_svrs;      #使用服务器组的名称
                    }    
          }

这里首先需要提醒大家proxy_pass指令在使用服务器组名称时需要注意的一个细节。在上例中,在组内的各个服务器中都指明了传输协议“http://”,而在proxy_pass指令中就不需要指明了。如果现在将upstream指令的配置改为:

upstream proxy_svrs
{
        server  192.168.1.1:8001/uri/;
        server  192.168.1.2:8001/uri/;
        server  192.168.1.3:8001/uri/;
}

我们就需要在proxy_pass指令中指明传输协议“http://”:

proxy_pass  http://proxy_svrs;

在使用该指令的过程中还要注意,URL中是否包含有URI,Nginx服务器的处理方式是不同的。如果URL中不包含URI,Nginx服务器是不会改变原地址的URI。但是如果包含了URI,Nginx服务器将会使用新的URI替代原来的URI。
举例说明,请看下面的Nginx配置片段:

        ...
        server
        {
                  ...
                  listen 80;
                  server_name www.myweb.name;
                  location  /server/
                  {
                            ...
                            proxy_pass  http://192.168.1.1;
                  }
        }

如果客户端使用“http://www.myweb.name/server”发起请求,该请求被配置中显示的location块进行处理,由于proxy_pass指令的URL变量不含有URI,所以转向的地址为“http://192.168.1.1/server”。
我们再来看下面的Nginx配置片段:

        ...
        server
        {
                ...
                listen 80;
                server_name  www.myweb.name;
                location /server/
                {
                        ...
                        proxy_pass  http://192.168.1.1/loc/;
                }
        }

在该配置实例中,proxy_pass指令的URL包含了URI“/loc/”。如果客户端仍然使用“http://www.myweb.name/server”发起请求,Nginx服务器将会把地址转向“http://192.168.1.1/loc/”。
通过上面的实例,我们可以总结出,在使用proxy_pass指令时,如果不想改变原地址中的URI,就不要在URL变量中配置URI。
明白了上面两个例子的用法,我们来解释大家经常讨论的一个问题,就是proxy_pass指令的URL变量末尾是否加斜杠“/”的问题。
请看这两个配置示例:

#配置1:          proxy_pass    http://192/168.1.1;
#配置2:       proxy_pass    http://192.168.1.1/;

配置1和配置2的区别在于,配置2中的proxy_pass指令的URL变量末尾添加了斜杠“/”,这意味着配置2中proxy_pass指令的URL变量包含了URI “/”,而配置1中proxy_pass指令的URL变量不包含URI。理解了这一点,我们就可以解释下面的实例和现象了。大家注意各例子之间的对比。

实例1:

          ...
          server
          {
                      ...
                      listen 80;
                      server_name      www.myweb.name;
                      location   /              #注意location的uri变量
                      {
                              ...
                              #配置1:        proxy_pass  http://192.168.1.1;
                              #配置2:        proxy_pass  http://192.168.1.1/;
                      }
          }

在该配置中,location块使用“/”作为url变量的值来匹配不包含URI的请求URL。由于请求URL中不包含URI,因此配置1和配置2的效果是一样的。比如,客户端的请求URL为“http://www.myweb.name/index.htm”,其将会被实例1中的location块匹配成功并进行处理。不管使用配置1还是配置2,转向的URL都为:“http://192.168.1.1/index.htm”。

实例2:

            ...
            server
            {
                      ...
                      listen 80;
                      server_name    www.myweb.name;
                      location  /server/        #注意location的url变量
                      {
                                ...
                                #配置1:    proxy_pass  http://192.168.1.1;
                                #配置2:    proxy_pass http://192.168.1.1/;                      
                      }
            }

在该配置中,location块使用“/server/”作为url变量的值来匹配包含URI “/server/”的请求URL。这时,使用配置1和配置2的转向结果就不相同了。使用配置1的时候,proxy_pass指令中的URL变量不包含URI,Nginx服务器将不改变原地址的URI。使用配置2的时候,proxy_pass指令中的URL变量包含URI “/”,Nginx服务器会将原地址的URI替换为“/”。
比如,客户端的请求URL为“http://www.myweb.name/server/index.htm”,将会被实例2中的location块配置成功并进行处理。使用配置1的时候,转向的URL为“http://192.168.1.1/server/index.htm”,原地址的URI “/server/”未被改变。但使用配置2时,转向的URL为“http://192.168.1.1/index.htm”,可以看到,原地址的URI “/server/”被替换为“/”。
大家在应用过程中,一定要注意到该指令在配置上的细节问题,分清楚URL和URI的区别与联系,并能够正确使用它们配置出符合需求的Nginx服务器。

2.proxy_hide_header指令
该指令用于设置Nginx服务器在发送HTTP响应时,隐藏一些头域信息。其语法结构为:

proxy_hide_header field;

其中,field为需要隐藏的头域。该指令可以在http块、server块或者location块中进行配置。

3.proxy_pass_header指令
默认情况下,Nginx服务器在发送响应报文时,报文头中不包含“Date”、“Server”、“X-Accel”等来自被代理服务器的头域信息。该指令可以设置这些头域信息以被发送,其语法结构为:

proxy_pass_header  field;

其中,field为需要发送的头域。该指令可以在http块、server块或者location块中进行配置。

4.proxy_pass_request_body指令
该指令用于配置是否将客户端请求的请求体发送给代理服务器,其语法结构为:

proxy_pass_request_body   on | off;

默认设置为开启(on),开关可以在http块、server块或者location块中进行配置。

5.proxy_pass_request_headers指令
该请求用于配置是否将客户端请求的请求头发送给代理服务器,其语法结构为:

proxy_pass_request_headers on | off;

默认设置为开启(on),开关可以在http块、server块或者location块中进行配置。

6.proxy_set_header指令
该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给被代理的服务器。其语法结构为:

proxy_set_header  field  value;
  • field,要更改的信息所在的头域。
  • value,更改的值,支持使用文本、变量或者变量的组合。

默认情况下,该指令的设置为:

proxy_set_header  Host  $proxy_host;
proxy_set_header  Connection  close;

请看一些实例:

proxy_set_header Host  $http_host;
proxy_set_header  Host  $host;    #将当前location块的server_name指令值填充到Host头域。
proxy_set_header  Host  $host:$proxy_port;    #将当前location块的server_name指令值和listener指令值一起填充到Host头域。

7.proxy_set_body指令
该指令可以更改Nginx服务器接收到的客户端请求的请求体信息,然后将新的请求体发送给被代理的服务器。器语法结构为:

proxy_set_body value;

其中,value为更改的信息,支持使用文本、变量或者变量的组合。

8.proxy_bind指令
官方文档中对该指令的解释是,强制将与代理主机的连接绑定到指定的IP地址。通俗来讲就是,在配置了多个基于名称或者基于IP的主机的情况下,如果我们希望代理连接由指定的主机处理,就可以使用该指令进行配置,其语法结构为:

proxy_bind address;

其中,address为指定主机的IP地址。

注意 Nginx 0.8.22及以上版本支持该指令。

9.proxy_connect_timeout指令
该指令配置Nginx服务器与后端被代理服务器尝试建立连接的超时时间,其语法结构为:

proxy_connect_timeout time;

其中,time为设置的超时时间,默认为60s。

10.proxy_read_timeout指令
该指令配置Nginx服务器向后端被代理服务器(组)发出read请求后,等待响应的超时时间,其语法结构为:

proxy_read_timeout time;

其中,time为设置的超时时间,默认为60s。

11.proxy_send_timeout指令
该指令配置Nginx服务器向后端被代理服务器(组)发出write请求后,等待响应的超时时间,其语法结构为:

proxy_send_timeout time;

其中,time为设置的超时时间,默认为60s。

12.proxy_http_version指令
该指令用于设置用于Nginx服务器提供代理服务的HTTP协议版本,其语法结构为:

proxy_http_version  1.0 | 1.1;

默认设置为1.0版本。1.1版本支持upstream服务器组设置中的keepalive指令。

13.proxy_method指令
该指令用于设置Nginx服务器请求被代理服务器时使用的请求方法,一般为POST或者GET。设置了该指令,客户端的请求方法将被忽略。其语法结构为:

proxy_method method;

其中,method的值可以设置为POST或者GET,注意不加引号。

14.proxy_ignore_client_abort指令
该指令用于设置在客户端中断网络请求时,Nginx服务器是否中断对被代理服务器的请求,其语法结构为:

proxy_ignore_client_abort on | off;

默认设置为off,当客户端中断网络请求时,Nginx服务器中断对被代理服务器的请求。

15.proxy_ignore_headers指令
该指令用于设置一些HTTP响应头中的头域,Nginx服务器接收到被代理服务器的响应数据后,不会处理被设置的头域。其语法结构为:

proxy_ignore_headers field ...;

其中,field为要设置的HTTP响应头的头域,例如“X-Accel-Redirect”、“X-Accel-Expires”、“Expires”、“Cache-Control”或“Set-Cookie”等。

16.proxy_redirect指令
该指令用于修改被代理服务器返回的响应头中的Location头域和“Refresh”头域,与proxy_pass指令配合使用。比如,Nginx服务器通过proxy_pass指令将客户端的请求地址重写为被代理服务器的地址,那么Nginx服务器返回给客户端的响应头中“Location”头域显示的地址就应该和客户端发起请求的地址相对应,而不是代理服务器直接返回的地址信息,否则就会出问题。该指令解决了这个问题,可以把代理服务器返回的地址信息更改为需要的地址信息。其语法结构为:

1 proxy_redirect redirect replacement;
2 proxy_redirect default;
3 proxy_redirect off;
  • redirect,匹配“Location”头域值的字符串,支持变量的使用和正则表达式。
  • replacement,用于替换redirect变量内容的字符串,支持变量的使用。
    该指令的用法我们通过几个配置示例来解释。

对于第一个结构,假设被代理服务器返回的响应头中“Location”头域为:

Location:  http://localhost:8081/proxy/some/uri/

该指令设置为:

proxy_redirect http://localhost:8081/proxy/  http://myweb/frontend/;

Nginx服务器会将“Location”头域的信息更改为:

Location: http://myweb/frontend//some/uri/

这样,客户端收到的响应信息头部中的“Location”头域也就被更改了。

结构2使用default,代表使用location块的uri变量作为replacement,并使用proxy_pass变量作为redirect。请看下面两段配置,它们的配置效果是等同的。

#配置1
location /server/
{
      proxy_pass http://proxyserver/source/;
      proxy_redirect default;
}
#配置2
location /server/
{
      proxy_pass http://proxyserver/source/;
      proxy_redirect http://proxyserver/source /server/;
}

使用结构3可以将当前作用域下所有的proxy_redirect指令配置全部设置为无效。

17.proxy_intercept_errors指令
该指令用于配置一个状态是开启还是关闭。在开启该状态时,如果被代理的服务器返回的HTTP状态代码为400或者大于400,则Nginx服务器使用自己定义的错误页(使用error_page指令)。如果是关闭该状态,Nginx服务器直接将被代理服务器返回的HTTP状态返回给客户端。其语法结构为:

proxy_intercept_errors on | off;

18.proxy_headers_hash_max_size指令
该指令用于配置存放HTTP报文头的哈希表的容量,其语法结构为:

proxy_headers_hash_max_size size;

其中,size为HTTP报文头哈希表的容量上限,默认为512个字符,即:

proxy_headers_hash_max_size 512;

Nginx服务器为了能够快速检索HTTP报文头中的各项信息,比如服务器名称、MIME类型、请求头名称等,使用哈希表存储这些信息。Nginx服务器在申请存放HTTP报文头的空间时,通常以固定大小为单位申请,该大小由proxy_headers_hash_bucket_size指令配置。
在Nginx配置中,不仅能够配置整个哈希表的大小上限,对大部分的内容项,也可以配置其大小上限,比如server_names_hash_max_size指令和server_name_hash_bucket_size指令用来设置服务器名称的字符数长度。

19.proxy_headers_hash_bucket_size指令
该指令用于设置Nginx服务器申请存放HTTP报文的哈希表容量的单位大小。该指令的具体作用在上面proxy_header_hash_max_size指令的使用中已经说明。其语法结构为:

proxy_headers_hash_bucket_size size;

其中,size为设置的容量,默认为64个字符。

20.proxy_next_upstream指令
在配置Nginx服务器反向代理功能时,如果使用upstream指令配置了一组服务器作为被代理服务器,服务器组中各服务器的访问规则遵循upsteam指令配置的轮询规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交给下一个组内服务器处理。该指令的语法结构为:

proxy_next_upstream status ...;

其中,status为设置的服务器返回状态,可以是一个或者多个。这些状态包括:

  • error,在建立连接、向被代理的服务器发送请求或者读取响应头时服务器发生连接错误。
  • timeout,在建立连接,向被代理的服务器发送请求或者读取响应头时服务器发生连接超时。
  • invalid_header,被代理的服务器返回的响应头为空或者无效。
  • http_500 | http_502 | http_503 | http_504 | http_404,被代理的服务器返回500、502、503、504或者404状态代码。
  • off,无法将请求发送给被代理的服务器。

注意
与被代理的服务器进行数据传输的过程中发生错误的请求,不包含在该指令支持的状态之内。

21.proxy_ssl_session_reuse指令
该指令用于配置是否使用基于SSL安全协议的会话连接(“https://”)被代理的服务器,其语法结构为:

proxy_ssl_session_reuse on | off;

默认设置为开启(on)状态。如果我们在错误日志中发现“SSL3_GET_FINISHED:digest check failed”的情况,可以将该指令配置为关闭(off)状态。

Proxy Buffer的配置的7个指令

我们简单介绍一下Proxy Buffer的工作原理,这对理解和该功能相关的几个指令是由帮助的。
我们首先明确的是,接下来介绍的与Proxy Buffer相关的指令proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size等,它们的配置都是针对每一个请求起作用的,而不是全局概念,即每个请求都会按照这些指令的配置来配置各自的Buffer,Nginx服务器不会生成一个公共的Proxy Buffer供代理请求使用。
Proxy Buffer启用以后,Nginx服务器会异步地将被代理服务器的响应数据传递给客户端。
Nginx服务器首先尽可能地从被代理服务器哪里接收响应数据,放置在Proxy Buffer中,Buffer的大小由proxy_buffer_size指令和proxy_buffers指令决定。如果在接收过程中,发现Buffer没有足够大小来接收一次响应的数据,Nginx服务器会将部分接收到的数据临时存放在磁盘的临时文件中,磁盘上的临时文件路径可以通过proxy_temp_path指令进行设置,临时文件的大小由proxy_max_temp_file_size指令和proxy_temp_file_write_size指令决定。一次响应数据被接收完成或者Buffer已经装满后,Nginx服务器开始向客户端传输数据。
每个Proxy Buffer装满数据后,在从开始向客户发送一直到Proxy Buffer中的数据全部传输给客户端的整个过程中,它都处于BUSY状态,期间对它进行的其他操作都会失败。同时处于BUSY状态的Proxy Buffer总大小由proxy_busy_buffers_size指令限制,不能超过该指令设置的大小。
当Proxy Buffer关闭时,Nginx服务器只要接收到响应数据就会同步地传递给客户端,它本身不会读取完整的响应数据。

1.proxy_buffering指令
该指令用于配置是否启用或者关闭Proxy Buffer,其语法结构为:

proxy_buffering on | off;

默认设置为开启状态。
开始和关闭Proxy Buffer还可以通过在HTTP响应头部的“X-Accel-Buffering”头域设置“yes”或者“no”来实现,但Nginx配置中proxy_ignore_headers指令的设置可能导致该头域设置失效。

2.proxy_buffers指令
该指令用于配置接收一次被代理服务器响应数据的Proxy Buffer个数和每个Buffer的大小,其语法结构为:

proxy_buffers number size;
  • number,Proxy Buffer的个数。
  • size,每个Buffer的大小,一般设置为内存页的大小。根据平台的不同,可能为4KB或者8KB。

由这个指令可以得到接收一次被代理服务器响应数据的Proxy Buffer总大小为number * size。该指令的默认设置为:

proxy_buffers 8 4k | 8k;

3.proxy_buffer_size指令
该指令用于配置从被代理服务器获取的第一部分响应数据的大小,该数据中一般包含了HTTP响应头,Nginx服务器通过它来获取响应数据和被代理服务器的一些必要信息。该指令的语法结构为:

proxy_buffer_size size;

其中,size为设置的缓存大小。默认设置为4KB或者8KB,保持与proxy_buffers指令中的size变量相同,当然也可以设置得更小。
注意该指令不要和proxy_buffers指令混淆。

4.proxy_busy_buffers_size指令
该指令用于限制同时处于BUSY状态的Proxy Buffer的总大小,通过上面对Proxy Buffer机制的阐述,相信大家很容易理解该指令的功能。该指令的语法结构为:

proxy_busy_buffers_size size;

其中,size为设置的处于BUSY状态的缓冲区大小。默认设置为8KB或者16KB。

5.proxy_temp_path指令
该指令用于配置磁盘上的一个文件路径,该文件用于临时存放代理服务器的大体积响应数据。如果Proxy_Buffer被装满后,响应数据仍然没有被Nginx服务器完全接收,响应数据就会被临时存放在该文件中。在上面对Proxy Buffer机制的阐述中已经提到过这一点。该指令的语法结构为:

proxy_temp_path path [level1 [ level2 [level3]]];
  • path,设置磁盘上存放临时文件的路径。
  • levelN,设置在path变量设置的路径下第几级hash目录中存放临时文件。

看一个例子:

proxy_temp_path /nginx/proxy_web/spool/proxy_temp 1 2;

在该例子中,配置临时文件存放在/nginx/proxy_web/spool/proxy_temp路径下的第二级目录中。基于该配置的一个临时文件的路径可以是:

/nginx/proxy_web/spool/proxy_temp/1/10/00000100101

6.proxy_max_temp_file_size指令
该指令用于配置所有临时文件的总体积大小,存放在磁盘上的临时文件大小不能超过该配置值,这避免了响应数据过大造成磁盘空间不足的问题,其语法结构为:

proxy_max_temp_file_size size;

其中,size为设置的临时文件总体积上限值,默认设置为1024MB。

7.proxy_temp_file_write_size指令
该指令用于配置同时写入临时文件的数据量的总大小,合理的设置可以避免磁盘IO负载过重导致系统性能下降的问题,其语法结构为:

proxy_temp_file_write_size size;

其中,size为设置的数据量总大小上线值,默认设置根据平台的不同,可以为8KB或16KB,一般与平台的内存页大小相同。

Proxy Cache的配置的12个指令

Proxy Cache机制与缓存数据的产生和使用有很大关系。Proxy Cache机制实际上是Nginx服务器提供的Web缓存机制的一部分。刚才的Proxy Buffer和这里的Proxy Cache有什么区别和联系呢?大家可以从含义和功能两方面区分Nginx服务器的这两类机制。
Buffer和Cache虽然都是用于提供IO吞吐效率的,但是它们是一对不同的概念,翻译成中文分别是“缓冲”和“缓存”两个词。Buffer,主要用于传输效率不同步或者优先级别不相同的设备之间传递数据,一般通过对一方数据进行临时存放,再统一发送的办法传递给另一方,以降低进程之间的等待时间,保证速度较快的进程不发生间断,临时存放的数据一旦传送给另一方,这些数据本身也就没有用处了。Cache,主要用于将硬盘上已有的数据在内存中建立缓存数据,提高数据的访问效率,对于过期不用的缓存可以随时销毁,但不会销毁硬盘上的数据。
在Nginx服务器中,Proxy Buffer和Proxy Cache都与代理服务相关,主要用来提供客户端与被代理服务器之间的交互效率。Proxy Buffer实现了被代理服务器响应数据的异步传输,Proxy Cache则主要实现Nginx服务器对客户端数据请求的快速响应。Nginx服务器在接收到被代理服务器的响应数据之后,一方面通过Proxy Buffer机制将数据传递给客户端,另一方面根据Proxy Cache的配置将这些数据缓存在本地硬盘上。当客户端下次要访问相同的数据时,Nginx服务器直接从硬盘检索到响应的数据返回给用户,从而减少与被代理服务器交互的时间。
特别需要说明的是,Proxy Cache机制依赖于Proxy Buffer机制,只有在Proxy Buffer机制开启的情况下Proxy Cache的配置才发挥作用。
在Nginx服务器中还提供了另一种将被代理服务器数据缓存到本地的方法Proxy Store,与Proxy Cache的区别是,它对来自被代理服务器的响应数据,尤其是静态数据只进行简单的缓存,不支持缓存过期更新、内存索引建立等功能,但支持设置用户或用户组对缓存数据的访问权限。

1.proxy_cache指令
该指令用户配置一块公用的内存区域的名称,该区域可以存放缓存的索引数据。这些数据在Nginx服务器启动时由缓存索引重建进程负责建立,在Nginx服务器的整个运行过程中由缓存管理进程负责定时检查过期数据、检索等管理工作。该指令的语法结构为:

proxy_cache zone | off;
  • zone,设置的用于存放缓存索引的内存区域的名称。
  • off,关闭proxy_cache功能,是默认的设置。

2.proxy_cache_bypass指令
该指令用于配置Nginx服务器向客户端发送响应数据时,不从缓存中获取的条件。这些条件支持使用Nginx配置的常用变量。其语法结构为:

proxy_cache_bypass string ...;

其中,string为条件变量,支持设置多个,当至少有一个字符串指令不为空或者不等于0时,响应数据不从缓存中获取。
看一个例子:

proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment $http_pragma $http_authorization;

其中,$cookie_nocache、$arg_nocache、$arg_comment、$http_paragma和$http_authorization都是Nginx配置文件的变量。

3.proxy_cache_key指令
该指令用于设置Nginx服务器在内存中为缓存数据建立索引时使用的关键字,其语法结构为:

proxy_cache_key string;

其中,string为设置的关键字,支持变量。在Nginx 0.7.48之前的版本中默认的设置为:

proxy_cache_key $scheme$proxy_host$request_uri;

如果我们希望缓存数据包含服务器主机名称等关键字,则可以将该指令设置为:

proxy_cache_key  "$scheme$host$request_uri";

在Nginx 0.7.48之后的版本中,通常使用以下的配置:

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

4.proxy_cache_lock指令
该指令用于设置是否开启缓存的锁功能。在缓存中,某些数据项可以同时被多个请求返回的响应数据填充。开启该功能后,Nginx服务器同时只能有一个请求填充缓存中的某一数据项,这相当于给该数据项上锁,不允许其他请求操作。其他的请求如果也想填充该项,必须等待该数据项的锁被释放。这个等待时间由proxy_cache_lock_timeout指令配置。
该指令的语法结构为:

proxy_cache_lock on | off;

该指令在Nginx1.1.2及以后的版本中可以使用,默认情况下,设置为关闭状态。

5.proxy_cache_lock_timeout指令
该指令用于设置缓存的锁功能开启以后锁的超时时间。该指令的语法结构为:

proxy_cache_lock_timeout time;

其中,time为设置的时间,默认为5s。

6.proxy_cache_min_uses指令
该指令用于设置客户单请求发送的次数,当客户端向被代理服务器发送相同的请求达到该指令设定的次数后,Nginx服务器才对该请求的响应数据做缓存。合理设置该值可以有效地减低硬盘上缓存数据的数量,并提高缓存的命中率。该指令的语法结构为:

proxy_cache_min_users numbers;

其中,number为设置的次数。默认设置为1.

7.proxy_cache_path指令
该指令用于设置Nginx服务器存储缓存数据的路径以及和缓存索引相关的内容,其语法结构为:

proxy_cache_path  path  [levels=levels] keys_zone=name:size1 [inactive=time1] [max_size=size2] [loader_files=number] [loader_sleep=time2][loader_threadhold=time3];
  • path,设置缓存数据存放的根路径,该路径应该是预先存在于磁盘上的。
  • levels,设置子啊相对path指定目录的第几级hash目录中缓存数据。levels=1,表示一级hash目录;levels = 1:2表示二级,以此类推。目录的名称是基于请求URL通过哈希算法获取到的。
  • name:size1,Nginx服务器的缓存索引重建进程在内存中为缓存数据建立索引,这一对变量用来设置存放缓存索引的内存区域的名称和大小。
  • time1,设置强制更新缓存数据的时间,当硬盘上的缓存数据在设定的时间内没有被访问时,Nginx服务器就强制从硬盘上将其删除,下次客户端访问该数据时重新缓存。该指令默认设置为10s。
  • size2,设置硬盘中缓存数据的大小限制。我们知道,硬盘中缓存源数据由Nginx服务器的缓存管理进程进行管理,当缓存大小超过该变量的设置时,缓存管理进程将根据最近最少被访问的策略删除缓存。
  • number,设置缓存索引重建进程每次加载的数据元素的数量上限。在重新缓存索引的过程中,进程通过一些列的递归遍历读取硬盘上的缓存数据目录及缓存数据文件,对每个数据文件中的缓存数据在内存中建立对应的索引,我们称没建立一个索引为加载一个数据元素。进程在每次遍历过程中可以同时加载多个数据元素,该值限制了每次遍历中同时加载的数据元素的数量。默认设置为100。
  • time2,设置缓存索引重建进程在一次遍历结束,下次遍历开始之间的暂停时长。默认设置为50ms。
  • time3,设置遍历一次磁盘缓存源数据的时间上限。默认设置为200ms。
    该指令设置比较复杂,一般需要设置前面三个指令的情形比较多,后面的几个变量与Nginx服务器缓存索引重建进程及管理进程的性能相关,一般情况下保持默认设置就可以了。下面是几个简单的配置实例:
proxy_cache_path  /nginx/cache/a levels=1 keys_zone=a:10m;
proxy_cache_path /nginx/cache/b levels=2:2 keys_zone=b:10m;
proxy_cache_path /ngixn/cache/c levels=1:1:2 keys_zone=c:1000m;

注意
该指令和其他指令不同,只能放在http块中。

8.proxy_cache_use_stale指令
如果Nginx在访问被代理服务器过程中出现被代理的服务器无法访问或者访问错误的现象时,Nginx服务器可以使用历史缓存响应客户端的请求,这些数据不一定和被代理服务器上最新的数据一致,但是对弈更新频率不高的后端服务器来说,Nginx服务器的该功能在一定程度上能够为客户端提供不间断访问。该指令用来设置一些状态,当后端被代理的服务器处于这些状态时,Nginx服务器启用该功能。该指令的语法结构为:

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off ...;

该指令可以支持的状态如语法结构中所示。大部分状态和后文中要学习的proxy_next_upstream指令是对应的。
需要注意,upstream状态并不是指被代理服务器在updating状态,而是指客户端请求的数据在Nginx服务器中正好处于更新状态。这一点需要大家留意。
该指令的默认设置为off。

9.proxy_cache_valid指令
该指令可以针对不同的HTTP响应状态设置不同的缓存时间,其语法结构为:

proxy_cache_valid [ code ...] time;
  • code,设置HTTP响应的状态代码。该指令可选,如果不设置,Nginx服务器只为HTTP状态代码为200、301和302的响应数据做缓存。可以使用“any”表示缓存所有该该指令中未设置的其他响应数据。
  • time,设置缓存时间。
    看几个例子:
proxy_cache_valid  200  302  10m;
proxy_cache_valid  301 1h;
proxy_cache_valid any 1m;

该例子中,对返回状态为200和302的响应数据缓存10分钟,对返回状态为301的响应数据缓存1小时,对返回状态为非200、302和301的响应数据缓存1分钟。

10.proxy_no_cache指令
该指令用于配置在什么情况下不使用cache功能,其语法结构为:

proxy_no_cache string ...

其中,string可以是一个或者多个变量。当string的值不为空或者不为“0”时,不启用cache功能。

11.proxy_store指令
该指令配置是否在本地磁盘缓存来自被代理服务器的响应数据。这是Nginx服务器提供的另一种缓存数据的方法,但是该功能相对Proxy Cache简单一些,它不提供缓存过期更新、内存索引建立等功能,不占用内存空间,对静态数据的效果比较好。该指令的语法结构为:

proxy_store on | off | string;
  • on | off,设置是否开启Proxy Store功能。如果使用变量on,功能开启,缓存文件会存放到指定的本地路径下。
  • string,自定缓存文件的存放路径。如果使用变量string,Proxy Store功能开启,缓存文件会存放到指定的本地路径下。
    Proxy Store方法多使用在被代理服务器端发生错误的情况下,用来缓存被代理服务器的响应数据。

12.proxy_store_access指令
该指令用于设置用户或用户组对Proxy Store缓存的数据的访问权限,其语法结构为:

proxy_store_access users:permissions ...;
  • users,可以设置为user,group或者all。
  • permissions,设置权限。
    有关Proxy Store方法的使用,我们通过官方给出的示例加深理解,在该实例中通过注释对配置做了说明:
          location /images/
          {
                   root /data/www;
                   error_page 404 = /fetch$uri;      #定义了404错误的请求页面
          }
          location /fetch/            #配置404错误时的请求
          {
                  proxy_pass    http://backend;
                  proxy_store  on;      #开启Proxy Store方法
                  proxy_store_access  user:rw  group:rw  all:r;
                  root  /data/www;  #缓存数据的路径
          }

相关文章

  • [code.nginx] Nginx服务器的代理服务

    正向代理与反向代理的概念 代理(Proxy)服务,通常也称为正向代理服务,可以使用下图示意, 其中箭头的方向指示访...

  • Nginx+Tomcat 负载均衡的时候遇到了这个权限问题

    访问nginx服务器,无法代理tomcat服务器 注:单独测试tomcat,nginx.都可以访问nginx代理服...

  • 2019-07-22

    概念 负载均衡服务器: 正向代理服务器: 反向代理服务器: Nginx组成 Nginx二进制可执行文件 Nginx...

  • uwsgi+nginx反向代理项目部署

    在linux下用uwsgi+nginx进行反向代理部署 nginx服务器:1.反向代理,代理uwsgi服务器。2....

  • 分布式服务器知识

    1. Nginx :Nginx是一款轻量级的Web 服务器/反向代理服务器 反向代理(Reverse Proxy)...

  • requests深入

    代理 浏览器 --> 服务器反向代理:浏览器 --> nginx --> 服务器正向代理:浏览器 --> 代理 ...

  • nginx

    nginx的概念 正向代理 反向代理 服务器的类型: Nginx的特点 Nginx的基本模块

  • nginx 作高性能反向代理服务器

    nginx 作高性能反向代理服务器 nginx作为高性能的web服务器常常用于各种的反向代理和负载均衡服务器,但是...

  • 借助Nginx搭建反向代理服务器

    借助Nginx搭建反向代理服务器 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器 一、反向代理:We...

  • 00_Nginx的介绍和搭建

    Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 ...

网友评论

本文标题:[code.nginx] Nginx服务器的代理服务

本文链接:https://www.haomeiwen.com/subject/mwnklxtx.html