Nginx反向代理功能

Nginx反向代理:

            以入口点的方式接受来自客户端的请求,但是本身不存在任何数据,而是交由后端服务器进行处理后,再返回里客户端

请求            客户端发起请求------>代理服务器------------------------------>后端服务器

返回            后端服务器------------->代理服务器------------------------------>客户端

在这个过程客户端是不主动向后端服务器请求的,后端服务器也不直接向客户端返回数据

公司常用:

            1、实现跨地区的代理服务器

               例如:业务服务器在北京,但是有港台的客户需要访问,但是客户直接从港台访问北京的服务器,网络环境很差,这时候就需要用到反向代理功能,作为可以提高网络环境主要有三个要素

               客户只需要保证他到港台服务器的网络性能即可,而真实与北京服务器进行交互的是港台的服务器,服务器之间的网络性能在基础上要比客户直接来访问要好很多,如果是有专线的情况下

               那么网络环境是非常好的。

     2、用于安全考虑

               有的环境需要隐藏后端服务器的真是IP地址,这样的环境使用反向代理,客户访问到的只能是反向代理服务器(域名指向的是反向代理服务器),只能获取到反向代理服务器的ip地址

               而代理服务器上是不存在任何数据

     3、用于负载均衡,配合upstream

 

 

反向代理常用配置参数解释:

Nginx负载均衡反向代理搭建

一、测试站点搭建:

基础环境:

         

主机

域名

访问内容

主机名

192.168.110.40

learn1.proxy.com

learn  proxy   001

learn proxy   002

[root@learn_proxy_40 ~]#,后端服务器

192.168.110.46

learn2.proxy.com

learn proxy  001

learn proxy   002

[root@learn_proxy_46 ~]# ,后端服务器2

192.168.110.47

learn1.proxy.com

learn2.proxy.com

代理服务器

Nginx负载均衡反向代理:

 

192.168.110.40         

[root@learn_proxy_40 ~]#mkdir /data/www/learn1.proxy.com

[root@learn_proxy_40 ~]#echo  "learn1 proxy 001" >/data/www/learn1.proxy.com/learn1.php

[root@learn_proxy_40 ~]#vim /usr/local/nginx/conf/vhost/learn1.proxy.com

server

        {

                listen       80;

                server_name  learn1.proxy.com;

                index index.php  index.html index.htm;

                root  /data/www/learn1.proxy.com;

                error_log  /data/weblogs/learn1_error.log  crit;

                access_log  /data/wwwlogs/learn1.log  access;

           location ~ .php$ {

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

            include        fastcgi.conf;

        }

        }

[root@node2 ~]# curl "http://learn1.proxy.com/learn1.php"

learn proxy 001

[root@learn_proxy_40 ~]#mkdir /data/www/learn2.proxy.com

[root@learn_proxy_40 ~]#echo  "learn1 proxy 002" >/data/www/learn2.proxy.com/learn2.php

[root@learn_proxy_40 ~]#vim /usr/local/nginx/conf/vhost/learn2.proxy.com

server

        {

                listen       80;

                server_name  learn2.proxy.com;

                index index.php  index.html index.htm;

                root  /data/www/learn2.proxy.com;

                error_log  /data/weblogs/learn2_error.log  crit;

                access_log  /data/wwwlogs/learn2.log  access;

           location ~ .php$ {

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

            include        fastcgi.conf;

        }

        }

通过上面的配置,已经可以实现两个站点的正常访问,区分开两个站点是分别不同的两台主机

但是在真是生产环境,它们的内容是相同,只是为了方便测试才这样区分的

192.168.110.46的配置同192.168.110.40配置流程一样,切记配置啊,要不不能出结果了

二、负载均衡反向代理搭建:

 

192.168.110.47,反向代理服务器

[root@proxy_server ~]#vim /usr/local/nginx/conf/vhost/myproxy

upstream  learn_server_proxy  {

         server 192.168.110.46:80  weight=1;

         server 192.168.110.40:80  weight=1;

}

[root@proxy_server vhost]# vim /usr/local/nginx/conf/vhost/learn1-proxy.com

server {

     listen  80;

     server_name   learn1.proxy.com;

     location / {

        proxy_pass  http://learn_server_proxy;

        proxy_set_header Host  $host;

        proxy_set_header  X-Forwarded-For $remote_addr;

      }

}

[root@proxy_server wwwlogs]# vim /usr/local/nginx/conf/vhost/learn2-proxy.com

server {

     listen  80;

     server_name   learn2.proxy.com;

     location / {

        proxy_pass  http://learn_server_proxy;

        proxy_set_header Host  $host;

        proxy_set_header  X-Forwarded-For $remote_addr;

      }

}

测试方法:

         在本地host写入

192.168.110.47  learn2.proxy.com

192.168.110.47  learn1.proxy.com

然后去访问这两个域名,下面 是我测试的截图

 反向代理服务器日志截图

注意看我标注红框的两个位置,左手边的红框内显示的是请求地址,也就是客户端地址。

右手边红框标注的是客户端发起的请求是由后端的那些服务器进行处理的

咱们刚开始要实现的就是负载均衡的反向代理,通过日志我们可以看到,从192.168.110.168发出的请求,会由

           server 192.168.110.46:80  weight=1;

     server 192.168.110.40:80  weight=1;

           这两台主机同时处理,轮询算法。

          后端服务器日志截图

左手边的红框是客户端的ip地址,而右手边的红框是代理服务器的ip地址,日志显示方式做个处理下面会说

后端服务器日志格式配置:

  

log_format  access  '$http_x_forwarded_for  - $remote_user [$time_local] "$request" '

              '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" "$remote_addr" '

              '"$request_time" "$upstream_response_time" "$upstream_addr" ';

 

我是将$remote_add和$http_x_forwarded_for互换了一下位置,$http_x_forwarded_for这个参数是配置可以让nginx获取到真实的ip地址

TCP反向代理配置

       首先需要准备一个可以测试的代码,这么没办法提供,只能自己想办法了。

       

Nginx代理服务器配置

安装扩展模块

1、首先查看现在已经编译的模块

[root@proxy_server package]#/usr/local/nginx/sbin/nginx -V    #查看nginx已经编译好的参数,后面也需要将这些模块重新编译

configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

2、下载需要编译的模块

[root@proxy_server package]#wget https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip 

[root@proxy_server package]# unzip master.zip

 

新模块:--add-module=/data/package/nginx_tcp_proxy_module-master/ #模块存放路径

3、进入nginx安装目录

进行重新编译,需要加上之前已经编译过的参数

[root@proxy_server package]# tar  zxvf tengine-2.0.3.tar.gz

[root@proxy_server package]# cd /data/package/tengine-2.0.3

[root@proxy_server package]# patch -p1 < /data/package/nginx_tcp_proxy_module/tcp.patch

[root@proxy_server package]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with- http_stub_status_module --with-http_ssl_module --add-module=/data/package/nginx_tcp_proxy_module-master/

[root@proxy_server package]# make

切勿进行make install这样就重新安装了

4、替换nginx二进制文件

[root@proxy_server package]#cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak #先备份

[root@proxy_server package]#cp -rfp /data/package/tengine-2.0.3/objs/nginx /usr/local/nginx/sbin/ 替换

5、重载

[root@proxy_server package]#make upgrade

6、验证

[root@proxy_server package]# /usr/local/nginx/sbin/nginx -V

configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/data/package/nginx_tcp_proxy_module-master/   ##添加成功

配置Nginx配置文件

user  www www;

worker_processes 4;

events

        {

                use epoll;

                worker_connections 1204;

        }

http

        {

                include       mime.types;

                default_type  application/octet-stream;

                sendfile on;

                tcp_nopush     on;

                keepalive_timeout 60;

                tcp_nodelay on;

                server_tokens off;

                #log format

                log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '

              '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" "$http_x_forwarded_for" '

              '"$request_time" "$upstream_response_time" "$upstream_addr" ';

             #upstream myfastcgi  {       

             #          server  192.168.110.40:9000 weight=1 max_fails=2 fail_timeout=30;

             #          server  192.168.110.46:9000 weight=1 max_fails=2 fail_timeout=30;

             # }

}

#tcp区块开始

tcp {

  timeout 1d;

  proxy_read_timeout 10d;          #设置Nginx从代理的后端服务器获取信息的时间,Nginx等待代理后端服务器的超时时间

  proxy_send_timeout 10d;          #代理后端服务器的数据回传时间,即在规定时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接

  proxy_connect_timeout 30;     #表示反向代理服务器与后端节点服务器连接的超时时间,及发起握手等候响应的超时时间

  include ./vhost/*;                    #应用./host/目录下的所有文件

  }

#tcp区块结束

主要是增加了tcp区块的配置

tcp区块不允许配置在http区块和server区块中

upstream  配置

[root@proxy_server vhost]# vim /usr/local/nginx/conf/vhost/loadblance.tcp

upstream  tcp8888  {

         server 192.168.110.40:8888 weight=1;                                     #后端服务器的tcp    ip:port

         check interval=10000 rise=3 fall=2 timeout=1000;          #健康检查机制

}

interval:向后端发送健康检查包的间隔

rise:如果连续成功次数达到rise配置的参数,服务器被认定为up

fall:如果连续失败粗疏达到fall配置的参数,服务器被认定为down

timeout:后端健康请求的超时时间

因为我测试的tcp连接是tcp 8888端口所以我是这么写的,具体测试端口自行修改

虚拟主机配置文件配置

vim /usr/local/nginx/conf/vhost/tcp_proxy.tcp

server {

     listen  8888;                                                                                           #监听端口

           server_name   chat.proxy.com;                                                  #访问域名

                 access_log /data/weblogs/nginx/tcp8888.access.log;   #日志记录

        proxy_pass  tcp8888;                                                                     #应用upstream定义池名称

                 so_keepalive on;                                                                              #心跳检测开启 

                 tcp_nodelay on;                                                                                #有效提高数据的实时响应性

}

测试方法:

        在客户端写入host

        192.168.110.47  chat.proxy.com

        访问chat.proxy.com域名

         http://chat.proxy.com:8888/

原文地址:https://www.cnblogs.com/bazingafraser/p/8505052.html