您的位置:新葡亰496net > 服务器网络 > 新葡亰496net:使用Nginx后如何在web应用中获取用户

新葡亰496net:使用Nginx后如何在web应用中获取用户

发布时间:2019-06-22 18:24编辑:服务器网络浏览(129)

    Nginx常见现象代理转载配置,nginx场景转载

    小心:本文出自 “阿飞”的博客 ,假诺要转发本文章,请与小编联系! 并注解来源: 

    在这里享受的不是nginx的计划文件表明,而是nginx常用的中间转播代理配置(比方线上多域名配置,后端种种转载代理配置以及比较复杂的代理转载配置),其余还有可能会对常用的转会代理参数配置举办求证。

    nginx配置文件注解请参见:

    1)

    2)

    一、代理转载

    nginx的代办转发首如若在server部分进行布署。假诺转正到制定域名或子域名,则要求在godaddy、Ali云等域名剖判中先行安插(子)域名并钦定IP。本文中第一描述通配符域名的计划,那样更兼具通用性。

    server部分配置为:

    server {
            listen       80;
            server_name  *.yourdomain.com;
    ......
    

    借使是https则修改listen部分就可以:

    listen       443 ssl;
    

    * https配置还亟需独自布置ssl部分的内容,证书不一样等,配置方式也是有差距,这里不做牵线。

    相似景况下,大家会有如下常见的两种要求

    1)指向到同盟社官网或任何产品网(一级域名)
    各种域名单独安插贰个server就可以,如HTTPS的配置如下:

        server {
            listen          443 ssl;
            server_name     www.yourdomain.com; #修改为需要的一级域名即可
    
            access_log      logs/ssl.access.log;
            error_log       logs/ssl.error.log crit;
    
            include ssl_params;
    
            location / {
                    index  index.html index.htm index.php;
                    index  proxy_set_header Host $host;
                    index  proxy_set_header X-Real-IP $remote_addr;
                    index  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass http://server_cluster; #后端服务器,具体配置upstream部分即可
            }
    
        }
    

    2)指向到信用合作社内处系统等等(二级域名)

    同1)部分的铺排,只要求修改server_name部分就可以:

    server_name     二级域名.yourdomain.com; #修改为需要的二级域名即可
    

    3)二级域名下多少个劳务转向

    比如:

    ...

    此后端服务也许会配备在不一致的server容器中,比如tomcat、php-fpm/fastcgi、第三方服务...

    server部分要求先配备第2)点有的内容,然后再配备该server下的location转载,常见location配置场景如下:

    a)转载到后端Tomcat

          location /location名称/ {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://127.0.0.1:8080/服务名/;
          }
    

    tomcat的倒车是很简短的了,这里无需多说。

    b)转发到php-fpm

    将有着php页面包车型客车央浼转给php-fpm管理:

          location ~ .php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(. .php)(/. )$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
          }
    

    fastcgi_params配置:

    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;
    
    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  HTTPS              $https if_not_empty;
    
    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    #fastcgi_param  SERVER_SOFTWARE    nginx;
    fastcgi_param  SERVER_SOFTWARE    nginx;
    
    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;
    
    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    200;
    

    注意!

    配置不抱有通用性,必要依赖本身服务器及实际工作要求张开安顿和调治。

    此间的布局仅提供参照他事他说加以考察。

    d)转载到第三方域名(第三方接口服务)

    举例做开采时,内部系统须要通过代办转载到银联支付接口:

    location /unionpay/ {
             proxy_set_header Host gateway.银联.com;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_pass https://gateway.银联.com/;
    }
    

    这里的proxy_set_header Host必须配备。

    4)强制http转https访问

    80端口部分server配置:

    server {
            listen  80;
            server_name     api.yourdomain.com;
            location / {
                    rewrite ^/(.*) https://api.yourdomain.com/$1 permanent ;
                    break;
            }
            error_page 497 https://$host:$server_port$request_uri;
        }
    

    当用户通过HTTP 80造访时,nginx将强制转变为HTTPS 443走访。

    443端口部分server配置:

    server {
            listen       443 ssl;
            server_name  api.yourdomain.com;
    
            access_log logs/ssl.api_access.log;
            error_log  logs/ssl.api_error.log crit;
    
            include ssl_params;
    
            location / {
                    proxy_pass http://tomcat_servers/$2;
                    proxy_set_header Host $host:443;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
            location /v1.0/ {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://tomcat_servers/v1.0/;
                proxy_cookie_path /v1.0/ /;
                proxy_redirect off;
            }
    
    }
    

    5)后缀名定向

    举例说,有USportageL:www.abc.com/register/user.do,供给将U揽胜极光L定向为uuu.abc.com/register/user.do。则能够在WWW.ABC.COM节点中如此布置:

    location / {
            rewrite ^(/register)/user(.*)..*$  break;

            index  index.html index.htm;
            proxy_set_header Host $host:443;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto  $scheme;
            proxy_pass ;
    }

    6)在location中通过if-else分支,依照需要参数使用不一样的proxy_pass实行转载。如:

    例如url为:

    故此,Nginx中得以对location进行if判定,化解方案如下:

    location /test/ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            if ($arg_n ~* "web01") {
                      proxy_pass ;
                      break;
            }

            if ($arg_n ~* "web02") {
                      proxy_pass ;
                      break;
            }

            .......

    }

    其中,$arg_n表示url中的n参数,$arg_p表示url中的p参数。

    聊起底,特别要专注的是!proxy_pass 后的url不能够有与要求的url后的门径,如proxy_pass

    7)Nginx支持websocket的配置

    只必要丰裕北京蓝字体部总局署就能够:

    location /drsws/ {
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        ........

    }

    二、参数表明

    1)proxy_set_header    X-real-ip $remote_addr;

    在web服务器端得到用户的忠实ip。

    但是,实际上要获取用户的真正ip,不是唯有那四个措施,上面大家接二连三看。

     

    2)proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;

    大家先看看这里有个X-Forwarded-For变量,那是二个squid开拓的,用于识别通过HTTP代理或负载平衡器原始IP三个连连到Web服务器的客户机地址的非rfc标准,倘诺有做X-Forwarded-For设置的话,每一次经过proxy转载都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开分离种种地方,由于他是非rfc规范,所以暗中认可是从未有过的,需求强制增加,在暗许景况下通过proxy转载的伸手,在后端看来远程地址都以proxy端的ip 。也正是说在暗中同意境况下大家接纳request.getAttribute("X-Forwarded-For")获取不到用户的ip,借使我们想要通过这几个变量获得用户的ip,我们须要本身在nginx增添如下配置:

    proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

    乐趣是扩张一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是充实,而不是覆盖,当然是因为私下认可的X-Forwarded-For值是空的,所以大家总以为X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际受骗您搭建两台nginx在分裂的ip上,并且都施用了这段配置,那你会意识在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和率先台nginx的ip。

    那么$proxy_add_x_forwarded_for又是何等?

    $proxy_add_x_forwarded_for变量包涵客户端须要头中的"X-Forwarded-For",与$remote_addr两部分,他们中间用逗号分开。

    举个例证,有二个web应用,在它在此以前经过了八个nginx转载,www.linuxidc.com 即用户访问该web通过两台nginx。

    在首先台nginx中,使用

    proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

    现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以唯有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值正是用户的真正的ip地址了。

    到了第二台nginx,使用

    proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;

    现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分含有的是用户的诚实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过那几个赋值未来未来的X-Forwarded-For的值就改成了“用户的真人真事ip,第一台nginx的ip”,那样就知晓了啊。

     

    末段大家看出还会有一个$http_x_forwarded_for变量,这些变量正是X-Forwarded-For,由于事先大家说了,默许的那些X-Forwarded-For是为空的,所以当我们一向利用proxy_set_header            X-Forwarded-For$http_x_forwarded_for时会发掘,web服务器端使用request.getAttribute("X-Forwarded-For")获得的值是null。要是想要通过request.getAttribute("X-Forwarded-For")获得用户ip,就务须先利用proxy_set_header            X-Forwarded-For$proxy_add_x_forwarded_for;那样就能够取得用户实际ip。

    此部分内容出自:

    三、小结

    1)通过本文,应该相比清楚的叙说了一级、二级域名的配备;

    2)通过各样气象,应该描述清楚了location各样境况的转折配置;

    3)引用别的小说,疏解了有的参数的含义

    4)各个复杂的情景,还亟需基于实际的业务及须要开始展览配置,这里的例子绝对都相比轻松。


    0


    0

    查阅商量

    注意:本文出自 “阿飞”的博客 ,纵然要转发本小说,请与作者联系! 并表明来源: ...

    标题背景:

    原文:

     

    1.正向代理:

    在实际应用中,大家或许要求获得用户的ip地址,比方做异地登入的推断,只怕计算ip访问次数等,平日情状下大家运用request.getRemoteAddr()就足以获取到客户端ip,但是当大家使用了nginx作为反向代理后,使用request.getRemoteAddr()获取到的就径直是nginx服务器的ip的地点,这那时应该怎么办?

    server {

    1.正向代理:

    正向代理类似二个跳板机,代理访问外界能源。

    part1:消除方案

            listen       80;

      正向代理类似四个跳板机,代理访问外界能源。

    新葡亰496net 1

    自己在查看资料时,有一本名称为《实战nginx》的书,小编张晏,那本书上有那样一段话“经过反向代理后,由于在客户端和web服务器之间扩大了中间层,由此web服务器无法直接得到客户端的ip,通过$remote_addr变量获得的将是反向代理服务器的ip地址”。那句话的乐趣是说,当你采用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),猎取的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是不得已获得用户的真实性ip的,可是,nginx是能够获得用户的真实ip的,也便是说nginx使用$remote_addr变量时得到的是用户的真正ip,若是大家想要在web端获得用户的因时制宜ip,就亟须在nginx这里作一个赋值操作,如下:

            server_name  localhost;

    新葡亰496net 2

    规范应用:为在防火墙内的局域网客户端提供访问Internet的路线如:IE例外设置代理服务器

    proxy_set_header            X-real-ip $remote_addr;

            location /{

    独立应用:为在防火墙内的局域网客户端提供访问Internet的路线    如:IE例外设置代理服务器

    新葡亰496net 3

    其间那么些X-real-ip是一个自定义的变量名,名字能够随便取,那样做完现在,用户的实际ip就被放在X-real-ip那些变量里了,然后,在web端能够如此获取:

                root   html;

    新葡亰496net 4

    正向代理配置实例:为不影响暗许配置:增加三个虚拟主机:

    request.getAttribute("X-real-ip")

                index  index.html index.htm;

    正向代理配置实例:为不影响默许配置:增加叁个虚拟主机:

    include vhosts/*.conf;

    如此就了解了吧。

                                proxy_pass                  ; 

        include        vhosts/*.conf;

    vi proxy.conf

     

               proxy_redirect              off;

    vi proxy.conf

    server{

    part2:原理介绍

               proxy_set_header            Host $host;

     

    resolver 8.8.8.8;

    此处我们将nginx里的相关变量解释一下,平时大家会看到有这么一些安顿

               proxy_set_header            X-real-ip $remote_addr;

    server{
    resolver 8.8.8.8;
    resolver_timeout 30s;
    listen 8090;
    server_name proxy.qinyj.top;
    location / {
    proxy_pass ;
    proxy_set_header Host $http_host;
    proxy_buffers 256 4k;
    proxy_max_temp_file_size 0;
    proxy_connect_timeout 30;
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 301 1h;
    proxy_cache_valid any 1m;
    }
    }

    新葡亰496net:使用Nginx后如何在web应用中获取用户ip及原理解释,Nginx正向代理与反向代理。resolver_timeout 30s;

    server {

               proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

     2.反向代理:

    listen 8090;

            listen       88;

                         # proxy_set_header            X-Forwarded-For $http_x_forwarded_for;

      反向代理(Reverse Proxy)实际运汇兑势是指以代理服务器来经受internet上的连接央浼,然后将呼吁转载给内部互联网上的服务器,并将从服务器上取得的结果回到给internet上呼吁连接的客户端,此时期理服务器对外就呈现为二个服务器。标准用途是将 防火墙前面包车型大巴服务器提须求Internet用户访问

    server_name proxy.qinyj.top;

            server_name  localhost;

            }

       nginx支持配置反向代理,通过反向代理达成网址的载重均衡。这一部分先写三个nginx的配备,后续再深入钻研nginx的代理模块和负载均衡模块。

    location / {

            #charset koi8-r;

     

    nginx通过proxy_pass 配置代理站点,upstream模块达成http负载均衡。

    proxy_pass ;

            #access_log  logs/host.access.log  main;

    方案1

     server {

    proxy_set_header Host $http_host;

            location /{

    nginx这里作二个赋值操作,如下:

       ........

    proxy_buffers 256 4k;

                root   html;

    proxy_set_新葡亰496net,header            X-real-ip $remote_addr;

        upstream qinyujie { #概念负载均衡站点名称  
            server 192.168.0.161:80;
            server 192.168.0.162:80;    #后端真实ip一般指内网  
          }

    proxy_max_temp_file_size 0;

                index  index.html index.htm;

    内部这些X-real-ip是三个自定义的变量名,名字可以随便取,那样做完事后,用户的忠实ip就被放在X-real-ip那么些变量里了,然后,在web端可以那样获取:

            location / {
                proxy_pass ;    #陈设代理站点或后端真实ip
                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;
          }

    proxy_connect_timeout 30;

                                proxy_pass                  ; 

    request.getAttribute("X-real-ip")

     }

    proxy_cache_valid 200 302 10m;

               proxy_redirect              off;

     

     3.反向代理用做内网域名转载

    proxy_cache_valid 301 1h;

               proxy_set_header            Host $host;

    方案2

    编辑反向代理服务器配置文件:

    proxy_cache_valid any 1m;

               proxy_set_header            X-real-ip $remote_addr;

    proxy_set_header           X-Forwarded-For    $proxy_add_x_forwarded_for;

    vim /usr/local/nginx/conf/reverse-proxy.conf

    }

               proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

    $proxy_add_x_forwarded_for的值是何许的啊?分上面三种情景

     

    }

                         # proxy_set_header            X-Forwarded-For $http_x_forwarded_for;

    如果$http_x_forwarded_for为空:  $proxy_add_x_forwarded_for = $http_x_forwarded_for  ',' $remote_addr

    server

    2.反向代理:

            }

    如果$http_x_forwarded_for不为空: $proxy_add_x_forwarded_for = $remote_addr

    {

    反向代理(Reverse Proxy)实际运转方式是指以代理服务器来经受internet上的连年诉求,然后将必要转载给内部网络上的服务器,并将从服务器上收获的结果回到给internet上呼吁连接的客户端,此时期理服务器对外就展现为三个服务器。典型用途是将 防火墙前面的服务器提须要Internet用户访问

    咱俩来一条条的看

    其中$http_x_forwarded_for便是nginx接受到的http request header中的X-Forwarded-For的值,http request header中并未有X-Forwarded-For那些header,那$http_x_forwarded_for为空

        listen 80;

      nginx援助配置反向代理,通过反向代理达成网址的负荷均衡。那部分先写叁个nginx的配置,后续再浓密研商nginx的代办模块和负载均衡模块。

    1. proxy_set_header    X-real-ip $remote_addr;

    $remote_addr是一直与nginx通讯的这台主机的ip。

        server_name xxx123.tk;

    nginx通过proxy_pass 配置代理站点,upstream模块落成http负载均衡。

    那句话在此之前曾经表明过,有了那句就能够在web服务器端得到用户的实事求是ip

     

        location / {

    server {

    但是,实际上要获得用户的真实ip,不是唯有那一个办法,下边大家一连看。

            proxy_redirect off;

    ........

    2.  proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header Host $host;

    upstream qinyujie { #概念负载均衡站点名称  

    咱俩先看看这里有个X-Forwarded-For变量,这是二个squid开辟的,用于识别通过HTTP代理或负载平衡器原始IP贰个连连到Web服务器的客户机地址的非rfc标准,假诺有做X-Forwarded-For设置的话,每回经过proxy转发都会有记录,格式正是client1, proxy1, proxy2,以逗号隔绝各样地点,由于他是非rfc规范,所以暗中同意是不曾的,要求强制增添,在私下认可景况下通过proxy转载的呼吁,在后端看来远程地址都以proxy端的ip 。也正是说在暗许情状下大家选用request.getAttribute("X-Forwarded-For")获取不到用户的ip,假若大家想要通过这么些变量得到用户的ip,大家须求协和在nginx增添如下配置:

            proxy_set_header X-Real-IP $remote_addr;

    server 192.168.0.161:80;

    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    server 192.168.0.162:80; #后端真实ip一般指内网  

    情趣是加多三个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增添,而不是覆盖,当然是因为默许的X-Forwarded-For值是空的,所以大家总以为X-Forwarded-For的值就至极$proxy_add_x_forwarded_for的值,实际上当您搭建两台nginx在差异的ip上,并且都使用了这段配置,那您会开掘在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和率先台nginx的ip。

            proxy_pass 

    }

    那么$proxy_add_x_forwarded_for又是怎么着?

        }

    location / {

    $proxy_add_x_forwarded_for变量包蕴客户端伏乞头中的"X-Forwarded-For",与$remote_addr两有个别,他们中间用逗号分开。

        access_log logs/xxx123.tk_access.log;

    proxy_pass ;   #铺排代理站点或后端真实ip

    举个例证,有二个web应用,在它从前经过了三个nginx转载,www.linuxidc.com 即用户访问该web通过两台nginx。

    }

    proxy_redirect off;

    在第一台nginx中,使用

     

    proxy_set_header Host $host;

    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header X-Real-IP $remote_addr;

    现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以唯有$remote_addr,而$remote_addr的值是用户的ip,于是赋值将来,X-Forwarded-For变量的值正是用户的望文生义的ip地址了。

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    到了第二台nginx,使用

    }

    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

    }

    现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分含有的是用户的忠实ip,$remote_addr部分的值是上一台nginx的ip地址,于是通过那些赋值以往今后的X-Forwarded-For的值就成为了“用户的真实性ip,第一台nginx的ip”,那样就精通了呢。

    3.反向代理用做内网域名转发

    聊起底我们看到还或然有一个$http_x_forwarded_for变量,那几个变量正是X-Forwarded-For,由于事先大家说了,私下认可的这些X-Forwarded-For是为空的,所以当大家直接选拔proxy_set_header            X-Forwarded-For $http_x_forwarded_for时会开采,web服务器端使用request.getAttribute("X-Forwarded-For")拿到的值是null。要是想要通过request.getAttribute("X-Forwarded-For")获得用户ip,就非得先采取proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;那样就足以获取用户真正ip。

    编写反向代理服务器配置文件:

    ps:变量名太长,本身认为看着好晕,打字打地铁本人眼睛都花了,希望解释清楚了,借使有疑难能够和本人沟通,共同学习。

    vim /usr/local/nginx/conf/reverse-proxy.conf

    新葡亰496net 5

    server

    {

    listen 80;

    server_name xxx123.tk;

    location / {

    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;

    proxy_pass

    }

    access_log logs/xxx123.tk_access.log;

    }

    • Nginx
    • 防火墙
    • Vi
    • Vim

    本文由新葡亰496net发布于服务器网络,转载请注明出处:新葡亰496net:使用Nginx后如何在web应用中获取用户

    关键词: