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

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

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/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指令的配置改为:

#不指明http

...
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  {
...
    server_name www.myweb.name;
    resolver 8.8.8.8;

listen 82;
location /server/ {
    ...
    proxy_pass http://192.168.1.1;
  }
}

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

..
server {
    ...
    server_name www.myweb.name;
    resolver 8.8.8.8;

listen 82;
location /server/ {
    ...
    proxy_pass http://192.168.1.1/loc;
  }
}

在该配置实例中,proxy_pass指令的URI包含了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的uri变量

location /

{

...

#配置1 proxy_pass http://192.168.1.1;

#配置2 proxy_pass http://192.168.1.1/;

}

}

  在该配置中,location块使用“/”作为uri变量的值来匹配不包含URI的请求URL。由于请求URL中不包含URL,因此配置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的uri变量

location /server/

{

...

#配置1 proxy_pass http://192.168.1.1;

#配置2 proxy_pass http://192.168.1.1/;

}

}

在该配置中,location块使用“/server/”作为uri变量的值来匹配包含的URI“/server/”的请求URL。这时,使用配置1和配置2的转向结果就不相同了。使用配置1和配置2的转向效果就不相同了。使用配置1时候,proxy_pass指令中的URL变量不包含URI,Nginx服务器将不改变原地址的URI,使用配置2的时候,proxy_pass指令中的URL变量包含URI“/”,Nginx服务器会将原地址的URI替换为"/"。

比如客户端的请求URI为“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;

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;           #将目前Host头域的值填充成客户端的地址

proxy_set_header Host $$host;               #将当前location块的server_name指令填充到Host头域

proxy_set_header Host $$host:$proxy_port;   #listener指令值一起填充到Host头域.

7.proxy_set_body指令

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

proxy_set_body_value;

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

8.proxy_bind指令

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

proxy_bind adress;

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

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_write_timeount 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_header指令

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

proxy_ignore_header field ...;

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

16.proxy_redirect指令

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

proxy_redirect redirect replacement

proxy_redirect default;

proxy_redirect off;

redirect,匹配“Location”头域值的字符串,支持变量的使用和正则表达式。

replacement,用于替换redirect变量内容的字符串,支持变量的使用。

该指令的用法我们通过几个配置实例来解释。

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

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

该指令设置为:

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

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指令配置。

在Nignx配置中,不仅能够配置整个哈希表的大小上限,对大部分内容项,也可以配置其大小上限,比如server_names_hash_max_size指令和server_names_hash_bucket_size指令用来设置服务器名称的字符数长度。

19.proxy_headers_hash_bucket_size指令

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

proxy_headers_hash_bucket_size size;

20.proxy_next_upstream指令

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

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 

 

posted @ 2023-01-04 16:37  谢端阳  阅读(142)  评论(0编辑  收藏  举报