nginx(三):反向代理篇

一、nginx反向代理模块

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

1.1 proxy_pass

做用域Context: location, if in location, limit_excepthtml

syntax:proxy_pass URL;

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

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, locationcookie

  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错误。

二、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;
        ...
    }
}

三、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;

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

四、 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;
    ...
}

五、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默认已配置好的其余参数
            }

六、结束语

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

相关文章
相关标签/搜索