黄宽的blog

宁可十年不将军,不可一日不拱卒



nginx反向代理和后端服务器获取真实ip

        nginx反向代理是什么(有人叫它动静分离)?以前看到这些个词脑袋是懵的,网上也有很多解释,普遍认为这个名字有点装了。为了提高吞吐量,有些服务器是专门跑程序用的,有些服务器是跑静态资源的,你可能访问一个网页,里面有图片,而这个图片并不是你访问的这个网页的服务器,也叫前端服务器,而是你的图片请求被Nginx转发到了一台后端服务器,由后端服务器提供给前端服务器再返回到客户端的。我这台nginx的配置非常细致,有nginx.conf,在这个配置中包含了两个文件夹,一个是sites-available,一个是sites-enabled,nginx.cof一般用来做整个nginx的配置,域名配置段在sites-avaliable下,然后建立一个软连接到sites-enabled下去。反向代理就写在域名配置段里,客户端通过访问服务器,服务器将请求分配按照server段里的则正匹配,将请求按照fastcgi发送到php-fpm通过分配再到我们的程序。反向代理一样,也需要通过正则来捕捉到用户的请求。

location ~ \.(jpg|jpeg|png|gif)$ {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://服务器地址:端口号;
    }

        server段里多加以上这一条,前端的反向代理的工作就完成了。(当然要开启反向代理在nginx.conf里)以上捕捉到图片格式结尾的就将这种请求转发到服务器地址,后端服务器只要监听这个端口将root指向资源目录就行了。当这一切做完后会发现,后端服务器获取到的并不是用户的ip地址而是前端服务器的ip(通过nginx的访问日志),这是正常的,本来就是前段请求的,但是可以通过proxy_set_header段将用户的真实ip带到后端服务器去,而后端服务器需要接收传过来的这个参数,日志的格式默认情况下是不接收这种参数的,日志格式在nginx.conf里面定义,默认没有定义,自己加上去就可以了。

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
                        ‘$status $body_bytes_sent “$http_referer” ‘
                        ‘”$http_user_agent” $http_x_forwarded_for’;
 access_log /var/log/nginx/access.log main;

        这就是日志的格式,可以自己添加和修改,上面主要描述的是定义一个格式这个格式的名字为main,这个格式里包含了哪些东西顺序是怎样的,定义访问成功的日志的路径,使用main格式来进行写入。

        改完后,前端服务器nginx -s reload,后端服务器nginx -s reopen。反向代理就是这样。有反向代理,当然也有正向代理了,也很简单。


作者  :  黄宽

不耻最后,即使慢,驰而不息,纵会落后,纵令失败



About ME

about me

黄宽

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

友情链接