nginx(三):反向代理篇

1、nginx反向代理模块

何为反向代理?接收客户端请求,并把请求交给后端服务器处理,后端服务器处理完成后,响应通过反向代理服务器返回给客户端。反向代理可实现局域网中的服务器可被公网中的客户端访问,也可实现多台服务器间做负载均衡。
模块:ngx_http_proxy_module

1.1 proxy_pass

作用域Context: location, if in location, limit_except

syntax:proxy_pass URL;

核心指令,该指令设置被代理服务器地址,URL是主机名称,IP,IP加端口等形式,并且带有传输协议http://https://
需要注意的时,URL中含有与不含有uri,nginx对其处理方式是不同的
配置示例:
情况一:URL不含uri

server {
                    ...
                    server_name www.cutemsyu.com;
                    location /uri/ {
                        proxy_pass http://192.168.100.1:8080;
                    }
                    ...
                }
nginx对于此种情况的处理方式是,将location中的uri传递给后端服务器                
即客户端访问http://www.cutemsyu.com/uri --> http://192.168.100.1:8080/uri

情况二:URL含有uri

server {
                    ...
                    server_name www.cutemsyu.com;
                    location /uri/ {
                        proxy_pass http://192.168.100.1:8080/new_uri/;
                    }
                    ...
                }
nginx对于此种情况的处理方式是,将location中的uri替换成proxy_pass指令中URL含有的uri            
即客户端访问http://www.cutemsyu.com/uri --> http://192.168.100.1:8080/new_uri

情况三:如果location定义的uri使用正则方式,则URL中不可带uri

1.2 proxy_set_header field

作用域Context: http, server, location

syntax:proxy_set_header field value;

设定发往后端服务器的请求报文的请求首部值
使用该指令将客户端IP传递给后端服务器以日志形式记录下来,具体做法如下

proxy_set_header X-Real-IP $remote_addr
更改后端服务器日志记录客户端访问IP字段值为首部X-Real-IP即可

1.3 超时时长指令

作用域Context: http, server, location

  1. proxy_connect_timeout time;
    定义与后端服务器建立连接的超时时长,默认60s

  2. proxy_read_timeout time;
    与keep_alived相关。定义读取来自后端服务器响应间隔的超时时长,不是读取一次完整的响应的时长,如果在这段时间内没有任何传输动作则断开连接,默认60s

  3. proxy_send_timeout time;
    与keep_alived相关。定义向后端服务器发送请求的间隔超时时长,不是发送一次完整请求的时长,如果在这段时间内没有任何传输动作则断开连接,默认60s

1.4 proxy_ignore_client_abort

作用域Context: http, server, location

syntax:proxy_ignore_client_abort on | off;

定义nginx与后端服务器的连接是否中断,如果客户端不等待响应结果中断连接。
该指令默认值是off,如果客户端中断了连接,nginx与后端连接随之中断,nginx记录5XX的错误,一般此种错误很难排查,当值设定为on时,nginx不会提前中断与后端服务器连接,返回的状态码正常记录200等等,nginx日志也不出现怪异的5XX错误。

2、nginx服务器组的配置

模块ngx_http_upstream_module
该模块定义可以被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass 等指令引用的一组服务器。
nginx作为反向代理服务器经常要配置一组服务器,以实现负载均衡。当定义好一组服务器时,默认调度算法为轮询算法,nginx将接收到的请求轮询发送给各个后端服务器处理,也可以根据服务器性能增加权重,或使用其他调度算法。

2.1 upstream配置块

首先在http配置块中创建新的配置上下文upstream并命名:

http{
    ...
    upstream group_name {
        ...
        ...
    }
    ...
}

接下来介绍upstream中可用的指令

2.2 server指令

syntax:server address [parameters...];

server指令为核心指令,定义组成员
address可用表示形式:

  • IP[: PORT]

  • HOSTNAME [ : PORT]

  • unix: /PATH/TO/SOME_SOCK_FILE

parameters可用如下:

  • weight=number
    定义一个server的权重,默认为1。权重高的server优先处理请求,并分配更多的请求,即带权重的轮询调度。

  • max_fails=number
    定义一个server在一段时间内最大的请求失败的次数,超过此值,标记该server为无效停止提供服务

  • fail_timeout=time
    有两层含义:1.此超时时长即为在max_fails提到的一段时间。2.一旦某server标记为无效后,在这段时间内不再检测。默认值为10s

  • backup
    标记server为备用服务器,只有当其他服务器不可用时才启用该服务器

  • down
    标记server为无效。一般在升级服务时使用,采用灰度模型将服务器逐个从线上脱离。

2.3 几个调度算法

除了默认的轮询调度算法,还可以采用以下算法,使用方法很简单——直接添加在upstream中。

  1. least_conn
    定义一组服务器的调度算法为最少连接数调度。根据server已建立的活动连接的数量来分配请求,拥有最少连接的server优先分配。此算法权重有效

  2. ip_hash
    源地址hash调度算法,来自同一IP的请求总是分配到同一server上。该算法可在较粗的粒度上实现会话粘性,实现会话保持功能,但一般不采用。

  3. hash key [ consistent ];
    基于指定的key的hash表来实现对请求的调度,将同一类请求发往同一server上,key可以为文本,变量或是二者组合。

可选consistent参数,指一致性hash算法,启用此参数可避免一组服务器增减可用server时导致hash对应表发生巨大变动,减少影响范围。
示例:

hash $request_uri consistent; #hash请求uri来调度请求,并选择一致性hash算法

2.4 服务器组保持空闲连接数

syntax:keepalive connections;

该指令设定每个worker进程为一个服务器组保持的空闲连接数量上限。connections为设定的数量,该数量不宜过大,防止新网络连接的建立
该指令使用还是有些麻烦的,参考官网例子如下

#http类型服务器组启用时,添加版本1.1,清空Connection首部值
upstream http_backend {
    server 127.0.0.1:8080;

    keepalive 16;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

#FastCGI服务器组时,需设定fastcgi_keep_conn为on
upstream fastcgi_backend {
    server 127.0.0.1:9000;

    keepalive 8;
}

server {
    ...

    location /fastcgi/ {
        fastcgi_pass fastcgi_backend;
        fastcgi_keep_conn on;
        ...
    }
}

3、nginx代理缓冲

proxy buffer启用之后,nginx会以异步形式将后端服务器返回的数据传递给客户端。
nginx首先尽量接收来自后端服务器的一次响应数据,保存到缓冲区中,如果接收数据超出缓冲区大小,则保存到本地定义的临时文件中。当一次数据接收完或者缓冲区已装满数据则向客户端发送数据。每个buffer装满数据之后向客户端发送数据直到发送完成,buffer处于busy状态,期间对它进行任何其他操作都会失败。
以下指令作用域Context: http, server, location

3.1 proxy_buffering

syntax: proxy_buffering on | off;

代理缓冲控制指令,默认开启

3.2 proxy_buffers

syntax: proxy_buffers number size;

该指令配置用于一个与后端服务器连接上的buffer数量,每个buffer大小。通常size为内存分页大小。接受一次后端服务器数据缓冲总大小为 number*size

3.3 proxy_busy_buffers_size

syntax: proxy_busy_buffers_size size;

该指令设置同时处于busy状态的buffer总大小。默认为proxy_buffers 中定义的size的两倍。

3.4 proxy_temp_path

syntax: proxy_temp_path path [level1 [level2 [level3]]];

该指令配置用于接收后端服务器响应大体积数据的临时文件的存储路径
Example:

proxy_temp_path /spool/nginx/proxy_temp 1 2;

3.5 proxy_max_temp_file_size

syntax: proxy_max_temp_file_size size;

该指令设置临时文件占用空间的总大小

4、 nginx代理缓存

nginx不是专业的缓存服务器,varnish等服务更加高效,但nginx的缓存功能在某些场景也可发挥不错的效果。
在上一小节中我们讲到了nginx缓冲,缓冲是为了协调不同传输效率的设备之间的传输,降低效率高的一方的等待时间。而本节将的缓存则是为了提高响应客户端速度,将经常访问的数据缓存到本地,当客户端访问同一资源时直接将本地存储的内容响应给客户端,减少对后端服务器的压力提高响应速度。
同时nginx的缓冲功能依赖nginx缓冲

4.1 proxy_cache

syntax: proxy_cache zone|off;

该指令配置一块公用的缓存区域名称或者关闭缓存功能。缓存区域存放缓存的索引数据。

4.2 proxy_cache_key

syntax: proxy_cache_key string;

定义用于建立索引的“键”
默认值为proxy_cache_key $scheme$proxy_host$request_uri;

4.3 proxy_cache_path

特别指出该指令作用域Context: http

syntax:proxy_cache_path path [levels=levels]  keys_zone=name:size;

该指令定义缓存数据的存储路径及缓存索引的有关内容。指令比较复杂上面的用法是缩减版,保留需要配置的参数,其他保持默认值即可。
参数含义:

  • path 定义存储根路径

  • levels=levels 定义在相对与path路径下的第几级hash路径下缓存数据

  • keys_zone=name:size 定义缓存索引存放的区域和使用大小

4.4 proxy_cache_min_uses

syntax: proxy_cache_min_uses number;

该指令定义一个资源最少被访问多少次将其缓存,默认值为1

4.5 proxy_cache_use_stale

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

该指令定义如果nginx访问后端服务器过程中出现无法访问,或者是访问错误等情况时,允许哪些状态下nginx使用缓存数据来响应此次客户端请求。虽然缓存的数据有可能已经过期,但是对于网站可用性来讲意义重大。默认值为off。

4.6 proxy_cache_valid

syntax:proxy_cache_valid [code...] time;

该指令针对不同http响应状态来设置缓存时长

4.7 proxy_no_cache

syntax:proxy_no_cache sting;

该指令定义哪些情况下不缓存响应数据。在string中定义的值可以是多个,当它们中的值有一个为非空或非0,此时不缓存数据。string值通常为http协议中的缓存控制类首部

4.8 一个配置样例

http {
    ...
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=ncache:256m ;
    ...
}

location / {
    ...
    proxy_cache ncache;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    proxy_no_cache $cookie_nocache;
    ...
}

5、nginx 的fastcgi模块

nginx可以反向代理fastcgi协议的请求,本节通过一个例子讲解具体使用

location ~* .php$ { #首先是匹配php动态请求

                fastcgi_pass   127.0.0.1:9000;   #设置后端服务器地址
                fastcgi_index  index.php;          #设置默认引导页面
                fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;   #传递php资源路径给fastcgi服务器
                include        fastcgi_params; #使用nginx默认已配置好的其他参数
            }

6、结束语

到此为止nginx三篇文章结束,欢迎大家收藏关注。

    原文作者:cutemsyu
    原文地址: https://segmentfault.com/a/1190000008149544
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞