今天在复习的时候发现Nginx实现反向代li的具体操作很多都忘了,为此特意又做了一下相应配置。
原理:反向代li常常和正向代li做比较,实际原理非常简单。正向代li所代li的是客户端,反向代li所代li的是服务端,这样理解起来就很简单啦
准备两台服务器
10.50.2.129 这个作为后端服务器,我用Apache来做web服务
10.50.2.133 这个作为代li服务器,也就是Nginx做反向代li
安装完后启动两个服务器的服务,并保证物理机可以访问这2个服务(注意防火墙需关闭或设置允许访问)
访问后端服务器Apache是这样的
图片说明
后面要是能成功访问就说明成功
然后我们看一下代li相关的服务,这里借用之前学习的笔记和其他博客文章的笔记,https://blog.csdn.net/sd4493091/article/details/81191747

ngx_http_proxy_module模块:
1.proxy_pass URL;
proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;
proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;
2.proxy_set_header field value;
设定发往后端主机的请求报文的值
3.proxy_cache_path
定义可用于proxy功能的缓存
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
4.proxy_cache zone | off;
指定要缓存的区域或关闭缓存功能
5.proxy_cache_key string;
指定缓存中用于“键”的内容
6.proxy_cache_valid [code ...] time;
对特定响应码的响应内容缓存的时长
定义在http{...}中;
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
定义在需要调用缓存功能的配置段,例如server{...};
proxy_cache pxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
7.proxy_cache_use_stale
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...
8.proxy_cache_methods GET | HEAD | POST ...;
请求报文包括列在此处的请求方法是,响应报文使用缓存
9.proxy_hide_header field;
指定nginx将来自被代li服务器响应报文中需要隐藏的报文首部内容
10.proxy_connect_timeout time;
指定nginx与被代li服务器建立连接的超时时间
11.proxy_read_timeout time;
指定读取被代li服务器响应报文的超时时间
12.proxy_send_timeout time;
指定将请求发送给被代li服务器的超时时间
信息量好像很多,但我现在只做主要部分,配置这样

 server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
           # root   html;
          #  index  index.html index.htm index.php;
            proxy_pass  http://10.50.2.129;
        }
}

嗯,就把location内的配置注释掉,并且添加proxy_pass参数来指向我们要的后端服务器,然后访问一下这个服务器的ip地址
图片说明
果然成功了,然后我们看一下后端服务器Apache的日志

[root@localhost logs]# tail access_log 
10.50.2.1 - - [23/Jul/2019:17:06:43 +0800] "GET / HTTP/1.1" 200 45
10.50.2.1 - - [23/Jul/2019:17:06:48 +0800] "GET /favicon.ico HTTP/1.1" 404 209
10.50.2.1 - - [23/Jul/2019:17:29:32 +0800] "GET / HTTP/1.1" 200 61
10.50.2.1 - - [05/Aug/2019:16:21:20 +0800] "GET / HTTP/1.1" 200 61
10.50.2.1 - - [05/Aug/2019:16:21:26 +0800] "GET /favicon.ico HTTP/1.1" 404 209
10.50.2.1 - - [12/Nov/2019:22:49:45 +0800] "GET / HTTP/1.1" 200 61
10.50.2.1 - - [12/Nov/2019:22:49:57 +0800] "GET /favicon.ico HTTP/1.1" 404 209
10.50.2.1 - - [12/Nov/2019:22:50:09 +0800] "GET / HTTP/1.1" 304 -
10.50.2.133 - - [12/Nov/2019:23:01:05 +0800] "GET / HTTP/1.1" 200 61
10.50.2.133 - - [12/Nov/2019:23:18:23 +0800] "GET / HTTP/1.0" 200 61

咦,访问的地址是10.50.2.133,也就是Nginx服务器来发送的报文。
然而事实上原因是Nginx
时会封装原来的报文头,所以发送给后端时源地址是自己的ip地址
若想在日志里面看见真实客户端的地址可做如下参数

location / {
           # root   html;
          #  index  index.html index.htm index.php;
            proxy_pass  http://10.50.2.129/;
         #   proxy_set_header Host ¥host;
            proxy_set_header X-real ¥remote_addr;

        }

增加的目的是在发送给后端服务器时在头部添加客户端的地址,¥remote_addr是客户端的地址
X-real是名字可以随便取,然后后端服务器应去识别一下这个¥remote_addr
在Apache的配置文件中作如下改变

    <IfModule log_config_module>
    LogFormat "%{XRealIP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%{XRealIP}i %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%{XRealIP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" common
</IfModule>

%{X-real}i就是我改的,原来是%h,这样日志就可以获取到真实客户端ip地址了,这里我卡了很久,就是有重定义头部不生效的问题,但后来我解决了,具体可以看我另外的文章,原来有可能好几种