美文网首页http
Nginx 反向代理知识要点

Nginx 反向代理知识要点

作者: _千树一木_ | 来源:发表于2017-09-20 20:51 被阅读31次

    Nginx反向代理知识要点

    (官网示例)

    ngx_http_proxy_module   模块

    server  {

           listen

          server_name

       location   /   {

                proxy_pass   http://IP:80/;

             }

    }

    (代理转发至后端IP机的80端口)

    1.  格式:

              location    /url   {

                         rewrite

                         proxy_pass   http://back_server:port/newurl;

             }

             /url—> /newurl

            location这种后端转发非常的灵活

    2.  正则示例:

              location   ~*\.(jpg|png|gif)   {

                        proxy_pass    http://IP;

             }

             这里有这注意的要点,对于正则匹配的,不能进行后端url的替换,即匹配的都会加在proxy_pass后面的url后面。正则匹配情况下,proxy_pass后面的url不加任何自定义的url,否则语法错误。

             例如   http://www.testnginx.com/1.jpg—(转发格式)—>   http://IP/1.jpg

                                                                                            client<—— 

                       http://www.testnginx.com/images/1.jpg—(转发格式)—>http://IP/images/1.jpg

                                                                                                            client<——

    (将所有.jpg|png|gif图片格式,都转发给后端IP机)

    代理向后端发送需要的值(日志中)

    proxy_set_header   定义TCP首部

    常用配置参数如下:

    server    {

                  listen80;

                  server_name    www.testnginx.com;

                  access_log    /home/work/log/nginx/www.testnginx.com.logmilog

                  location   /   {

                                          proxy_set_header   Host    www.testnginx.com;

                                          proxy_set_header     X-Forwarded-For$proxy_add_x_forwarded_for;

                                          proxy_pass    http://www.testnginx.com.real_backend;

                        }

        }

    其实$remoad_addr是没有proxy_add_x_forwarded_for准确的,proxy_add_x_forwarded_for记录的是准确的client的IP,而$remoad_addr记录的准确是代理机的ip,并且多次代理他们直接也有差异。

    官网给出的解释是:

    英文版:

    proxy_ssl_ciphers     等用来支持代理机到物理机之间的加密数据的传输,即内网环境下密码等信息的安全传输。

    代理缓存(定义如何管理缓存空间缓存条目)

    proxy_cache    zone | off

    (调用缓存)

    缓存实则即为键值对。

    proxy_cache_path    path

    (定义缓存的路径,只能用在http段)

           官网实例:

                        levels‘:’表示几个子目录,如图所示,表示两个

                        levels的数字1,2表示子目录的目录名字符数,一级子目录名字字符数为1个,二级子目录名字字符数为2。

                        keys_zone:表示键存储的位置,大小为10m与proxy_cache的zone进行匹配,被prixy_cache调用

                  上图的实用实例:

    proxy_cache_methods    GET | HEAD;

    (仅在客户端使用某种方法时缓存,默认GET,HEAD,其实还有POST等,但是没比较缓存提交的信息,大部分情况,不用定义)

    proxy_cache_min_uses    number;

    (缓存生效的最小次数,默认为1)

    proxy_cache_purge    string;

    (管理缓存空间中的缓存条目,如果某个缓存没到期,也没满,但是后端真实服务器数据更改了,那么可以在对应缓存条目上增加该项,等用户再次拿到缓存的时候会删掉该缓存。注意权限管理,具体配置方式请详见官网)

    proxy_cache_revalidate    on | off;

    (当缓存到期了,询问后端服务器缓存数据是否改变,若没改变则修改缓存时间,继续使用原缓存,即过期后重新校验)

    proxy_cache_use_stale    error | timeout |invalid_header | updating | http_500 | http_502 …| off...

    (缓存过期时并且后端服务器处于类似宕机或服务更新等以上后面参数的各种情况下,是否可以继续给客户端响应缓存内容,详见官网)

    proxy_cache_valid    [code …] time;

    (按时间定义不同响应码的缓存时间)

    proxy_cache_pypass    string;

                           $cookie_nocache$arg_nocache $http_authorization

    (设置在指定情况下nginx不会在cache中取数据)

    proxy_connect_timeout;

    (后端服务器连接的超时时间_发起握手等候响应超时时间)

    proxy_hide_header;

    (隐藏由Proxy响应客户端时响应的首部)

    但是在生产环境好像是没有启用关于nginx cache的任何参数

    ngx_http_upstream_module    模块

    模块的主要功能:定义可由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令引用的服务器组。

    示例:

             upstream   testnginx_backend   {

                             server   IP1/Domain:Portweight=[number]   max_fails=[number]   fails_timeout=30s;

                            server   IP2/Domain:Port weight=[number]  max_fails=[number]   fails_timeout=30s;

             }

       (生产环境,一般server后面跟的是自己的内网ip)

             server    {

                      listen        80;

                      server_name       www.testnginx.com;

                          …

             location   /   {

                      proxy_pass    http://testnginx_backend;

                      …

                      }

         }

    (调用方式,‘…’省略其它配置)

    weight:表示权重,默认为1

    max_fails:用作健康检查,表示fails_timeout(超时时间规定)情况出现几次,则将server从upstream队列中剔除。

    fails_timeout:设定超时时间的长度,即规定超过多长时间未响应则判断为请求失败。

    down:可以手动调为永久不可用,(类似情景用于灰度测试),通常和ip_hash一起使用

    backup:可以标记为备用机使用,即当所有主服务器都不用时,启用这台服务器。

    (等更多信息详见官网)

    情景:由于用户在进行网站数据访问时的请求与数据返回一致性问题上,传统的ip_hash方式会造成某一台机器连接数巨大,并不利于upstream调度。所有引进cookie这中方式,根据tcp报文序列进行后端调度,这样基于cookie保证数据一致性,由于ip_hash这种基于单一机器的方式。

    sticky    cook name[expires=time] [domain=domain ] [httponly][secure] [path=path];

    sticky    route $variable…

    sticky    learn create=$variable lookup=$variable zone=name:size[timeout=time] [header];

    (启用会话关联,致使来自同一客户端的请求被传递到一组服务器中的同一服务器)

                       cookie

                                                    (官网示例,详见官网)

                        route

                                                   (官网示例,详见官网)

                      learn

                                                  (官网示例,详见官网)

    least_conn

    (调度方法,最少链接)

    keepalive    connections;

    (后端专用存储情况下,例如sql查询等,可以使用该方法保持与后端的连接,减少连接次数,提升效率。http模式的话,一般不建议使用)

                                 (官网示例,详见官网)

    upstream    还有几个内建模块,详见官网说明

    ngx_http_headers_module    模块

    (主要与自定义响应报文首部有关)

    add_header    name value[always];

    (自定义响应报文首部)

          例子:add_headerX-via$server_addr

        (在浏览器中发起请求后返回的报文首部信息中,加上server的ip地址)

         例子:add_headerX-Cache  $upstream_cache_status;

        (查看保持访问响应缓存的状态,状态可以是“MISS(未命中)”,“BYPASS”,“EXPIRED”,“HIT(命中)”,“STALE(过期)”等,查看缓存状态需要将cache功能启用,不然没有这个头部信息)

    还有各种自定义的首部可自行官网学习

    关于fastcgi使用来代理php页面的,暂时没有接触,请自行学习

    一个nginx在生产环境中的完整案例:

    user    nobody    nobody

    worker_processes    4;#进程数

    worker_rlimit_nofile       51200;#所能够同时打开的文件数

    error_log       logs/error.lognotice;

    pid          /var/run/nginx.pid

    events  {

         use    epoll;

         worker_connections          51200;#每一个进程承载的最大连接数

    }

    http {

         server_tokens     off;#禁止版本号显示

         include     mime.type;

         proxy_redirect    off;

         proxy_set_header     Host     $host;

         proxy_set_header     X-Real-IP      $remote_addr

         proxy_set_header     X-Forwarded-For      $proxy_add_x_forwarded_for;

         client_max_body_size     20m;#每个用户报文body大小

         client_boby_buffer_size     256k;#每个用户Nignx处理时在nginx中开辟的内存大小

         proxy_connect_timeout      90;#连接建立的超时时间

         proxy_send_timeout     90;#向后端服务器发送报文的超时时间

         proxy_read_timeout     90;#响应报文的超时时间

         proxy_buffer_size     128k;

         proxy_buffers      464k;

         proxy_busy_buffers_size      128k;

         proxy_temp_file_write_size     128k;

         default_type     application/octet-stream;

         charset     utf-8;

         client_body_temp_path     /var/tmp/client_body_temp1 2;                 #这几个都是临时存储

         proxy_temp_path     /var/tmp/proxy_temp1 2;                               #或代理文件的路径

         fastcgi_temp_path     /var/tmp/fastcgi_temp 1 2;

         uwsgi_temp_path     /var/tmp/uwsgi_temp 1 2;

         scgi_temp_path     /var/tmp/scgi_temp 1 2;

         ignore_invalid_headers     on;                               #忽略无法理解的报文信息

         server_names_hash_max_size           256;                     #server_name进行hash

         server_names_hash_bucket_size         64;

         client_header_buffer_size        8k;

         large_client_header_buffers       432k;

         connection_pool_size       256;

         request_pool_size       64k;

         output_buffers       2128k;

         postpone_output      1460;

         client_header_timeout      1m;

         client_body_timeout      3m;

         send_timeout      3m;

         log_format_main        ‘$remote_addr- $remote_user [$time_local] “$host|$request”’

                                       ‘$status $body_bytes_sent“$http_referer”’

                                      ‘”http_user_agent” “$http_x_forwarded_for”“$request_time” “$upstream_response_time”’;

         open_log_file_cache      max=1000       inactive=20s      min_uses=1      valid=1m;

         access_log            logs/access.logmain;

         log_not_found           on;

         sendfile                    on;

         tcp_nodelay            on;

         tcp_nopush              off;

         reset_timeout_connection              on;

         keepalive_timeout              105;

         keepalive_requests             100;

         gzip              on;

         gzip_http_version            1.1;

         gzip_vary                 on;

         gzip_proxied             any;

         gzip_min_length             1024;

         gzip_comp_level             6;

         gzip_buffers                168k;

         gzip_proxied                         expired  no-cache  no-store  private  auth no_last_modified  no_eetag;

         gzip_types                        text/plain  application/x-javascipt  text/cssapplication/xml  application/json;

         gzip_disable                   “MSIE [1-6]\.(?l.*SV1)”;

         #其实从这一下的文件都可以使用include path;path是指定的所以server的文件目录,因为一般工作都需要有非常多的域名进行维护

         upstream     tomcat8080;   {

                  ip_hash

                  server        172.18.100.101:8080      weight=1     max_fails=2;

                  server        172.18.100.102:8080      weight=1     max_fails=2;

                  server        172.18.100.103:8080      weight=1     max_fails=2;

    }

    server     {

            listen      80;

            server_name      www.testnginx.com

            root          /data/webapp/htdocs;

            access_log            /var/logs/webapp.access.logmain;

            error_log               /var/logs/webapp.error.lognotice;

            location     /     {

                           location   ~*^.*/favicon.ico$   {

                                    root            /data/webapps;

                                    expires            180d;             #图片缓存时长

                                    break;

                            }  

                          if(!-f$request_filename)  {

                                     proxy_pass        http://tomcat8080;

                                     break;

             }  

    }

                          error_page          500  502  503  504           /50x.html

                               location   =   /50x.html   {

                               root             html;

          }

    }

    server           {

            listen          8088;

            server_name              nginx_status;

                           location        /     {

                                               access_log            off;

                                               deny             all;

                                               return         503;

                                    }

                         location     /status    {

                                              stub_status          on;

                                              access_log          off;

                                              allow                   127.0.0.1;

                                              allow                   127.18.100.70;

                    }

            }

    }

    Tengine了解

    tengine.taobao.org

    相关文章

      网友评论

        本文标题:Nginx 反向代理知识要点

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