Nginx 反向代理知识要点

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,537评论 21 356
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,828评论 0 3
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,959评论 0 9
  • 时光荏苒,如白驹过隙,我们每天穿梭在一线城市里,整天忙忙碌碌,已不再是哪个大男孩的年龄了,现在才发现内心的恐惧,和...
    树叶叶阅读 136评论 0 1
  • 春熏暖燕京 古殿尽琉璃 哪得君如故 沉吟已至今
    晨曦山鸡阅读 304评论 3 1