Linux学习116 nginx实现反向代理配置与实战

一、概述

  1、nginx架构

    

  2、ngx_http_proxy_module模块

    

    

    

  3、ngx_http_proxy_module模块中相应参数

    a、proxy_set_header field value (与我们下面4中的add_header类似,不过add_header是发往客户端的响应报文中添加相应的IP,此处是在发往后端服务器的报文首部添加相应的IP)

      (1)、设定发往后端主机的请求报文的请求的首部的值;Context:http,server,location

      (2)、proxy_set_header X-Real-IP $remote_addr #即自己定义真正IP,即自己定义客户端地址,我们使用$remote_addr表示把真正客户端的IP传递给后端服务器。

        

      (3)、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;将我们代理服务器的IP附加在首部后面,因为有可能会有多级代理,因此每一级代理都会将自己的IP信息加到首部后面。而不是重新设置代理IP的值的。   

    b、proxy_cache_path

      定义可用于proxy功能的缓存;Context: http中

[root@www ~]# cat /etc/nginx/nginx.conf|grep -E "^http|proxy_cache"
http {
    proxy_cache_path    /data/nginx/cache levels=1:1:1 keys_zone=pcache:10m max_size=2g; #levels=1:1:1表示指明他是几级子目录,此处我们表示使用三级子目录,第一级和第二级和第三级都使用1个字符,我们如
果只用两级也没问题,keys_zone=pcache:10m表示在内存中给其分多大空间来保存哈希表,pcache表示键区域的名字,10m表示使用10兆的内存大小。max_size=2g表示我们/data/nginx/cache这个磁盘空间最大只能有2g。

    c、proxy_cache  zone | off;(这个就调用上述定义的proxy_cache_path)

      指明要调用的缓存,或关闭缓存机制;Context:http,server,location

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    
    proxy_cache pcache; #调用缓存至少需要三个参数,需要先存后用,哪些内容能存,存进去多长时间,我们需要自己定义。哪些内容不能存,哪些方法不检查缓存我们也需要自己定义。


    location /admin/ {
        proxy_pass http://192.168.10.14:80/; 
        proxy_set_header X-Real-IP $remote_addr;
        add_header X-Via $server_addr;
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80; #当我们使用正则表达式模式的时候我们是不允许在后面补任何路径的,因为他不知道该怎么替换,因为他只能将匹配到的整个URL内容补到后面,比如
        }
}

    d、proxy_cache_key string

      缓存中用于“键”的内容

      默认值:proxy_cache_key $scheme$proxy_host$request_url #即协议,主机,和请求的url

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    
    proxy_cache pcache; #调用缓存至少需要三个参数,需要先存后用,哪些内容能存,存进去多长时间,我们需要自己定义。哪些内容不能存,哪些方法不检查缓存我们也需要自己定义。
    proxy_cache_key $request_uri; #我们此处只缓存uri,不加协议也不加主机名,这样我们命中的可能性更大一些,如果你的多个域名都是指向同一个站点的时候这样用比指向同一个站点更有效。


    location /admin/ {
        proxy_pass http://192.168.10.14:80/; 
        proxy_set_header X-Real-IP $remote_addr;
        add_header X-Via $server_addr;
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80; #当我们使用正则表达式模式的时候我们是不允许在后面补任何路径的,因为他不知道该怎么替换,因为他只能将匹配到的整个URL内容补到后面,比如
        }
}

      还可以定义哪些请求方法可以缓存

server {
    listen 80;
    server_name www.wohaoshuai1.com;
    
    proxy_cache pcache; #调用缓存至少需要三个参数,需要先存后用,哪些内容能存,存进去多长时间,我们需要自己定义。哪些内容不能存,哪些方法不检查缓存我们也需要自己定义。
    proxy_cache_key $request_uri; #我们此处只缓存uri,不加协议也不加主机名,这样我们命中的可能性更大一些,如果你的多个域名都是指向同一个站点的时候这样用比指向同一个站点更有效。
    proxy_cache_methods GET HEAD;


    location /admin/ {
        proxy_pass http://192.168.10.14:80/; 
        proxy_set_header X-Real-IP $remote_addr;
        add_header X-Via $server_addr;
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80; #当我们使用正则表达式模式的时候我们是不允许在后面补任何路径的,因为他不知道该怎么替换,因为他只能将匹配到的整个URL内容补到后面,比如
        }
}

    e、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{...};

        

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    
    proxy_cache pcache; #调用缓存至少需要三个参数,需要先存后用,哪些内容能存,存进去多长时间,我们需要自己定义。哪些内容不能存,哪些方法不检查缓存我们也需要自己定义。
    proxy_cache_key $request_uri; #我们此处只缓存uri,不加协议也不加主机名,这样我们命中的可能性更大一些,如果你的多个域名都是指向同一个站点的时候这样用比指向同一个站点更有效。
    proxy_cache_methods GET HEAD;
    proxy_cache_valid 200 302 10m; #定义200和302状态的页面缓存10分钟。
    proxy_cache_valid 404    1m; #定义404状态的页面缓存1分钟。


    location /admin/ {
        proxy_pass http://192.168.10.14:80/; 
        proxy_set_header X-Real-IP $remote_addr;
        add_header X-Via $server_addr;
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80; #当我们使用正则表达式模式的时候我们是不允许在后面补任何路径的,因为他不知道该怎么替换,因为他只能将匹配到的整个URL内容补到后面,比如
        }
}

    f、proxy_cache_use_stale #即什么情况下可以使用本地的缓存来响应。比如后端服务器出现了error,超时,非法首部等我们就用本地缓存来响应。如果使用off就表示一定不能用本地缓存来响应。

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    
    proxy_cache pcache; #调用缓存至少需要三个参数,需要先存后用,哪些内容能存,存进去多长时间,我们需要自己定义。哪些内容不能存,哪些方法不检查缓存我们也需要自己定义。
    proxy_cache_key $request_uri; #我们此处只缓存uri,不加协议也不加主机名,这样我们命中的可能性更大一些,如果你的多个域名都是指向同一个站点的时候这样用比指向同一个站点更有效。
    proxy_cache_methods GET HEAD;
    proxy_cache_valid 200 302 10m; #定义200和302状态的页面缓存10分钟。
    proxy_cache_valid 404    1m; #定义404状态的页面缓存1分钟。
    proxy_cache_use_stale http_502; #即响应码为502的错误的时候能响应。


    location /admin/ {
        proxy_pass http://192.168.10.14:80/; 
        proxy_set_header X-Real-IP $remote_addr;
        add_header X-Via $server_addr;
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80; #当我们使用正则表达式模式的时候我们是不允许在后面补任何路径的,因为他不知道该怎么替换,因为他只能将匹配到的整个URL内容补到后面,比如
        }
}

    g、proxy_cache_methods GET|HEAD|POST ...;

    h、proxy_hide_header field;

    i、proxy_connect_timeout time; #定义面向服务器端一侧的超时时间是多少秒,默认为60s。最长为75s。

       默认为60s。

    j、proxy_read_timeout time;我们两次重传时间的时间间隔

    k、proxy_send_timeout time;用来设置向被代理服务端发请求报文时的请求的超时时长,即服务端太忙了,给其发请求报文时他不接。

  4、nginx_http_headers_module模块

二、实验

  1、规划:

    反向代理服务器: 192.168.10.13

    后端web服务器:192.168.10.14,192.168.10.15

  2、在192.168.10.13上配置反代

    a、配置单个反代

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf 
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    location / {
        proxy_pass http://192.168.10.14:80; #这个加/和不加/差别很大
        }
}
[root@www ~]# curl www.wohaoshuai1.com/test1.html
<h1>RS1,192.168.100.14</h1>

    b、我们来配置访问图片时代理到192.168.10.15上去

      (1)、在192.168.10.13上配置

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    location / {
        proxy_pass http://192.168.10.14:80; #这个加/和不加/差别很大
        }
    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80;
        }
}

      (2)、在192.168.10.15上的配置

[root@rs2 vhost1]# cat /etc/nginx/conf.d/vhost1.conf 
server {
    listen 80;
    server_name www.wohaoshuai3.com;
    root /data/nginx/vhost1;
    location / {
        #root /data/nginx/vhost2; 
        allow all;
}
    location ~*.(jpg|png)$ {
        deny 192.168.10.14;
        allow all;
}
    location ^~ /images/ {
        alias /data/pictures/;
}
    error_page 404 =200 /notfound.html;
    location = /notfound.html {
        root /data/nginx/error_pages;
}
}

  3、我们在proxy_pass后的URL后是否加/的区别

    a、这个加/和不加/差别很大,如果不加斜线的话表示访问时location 后面匹配到的他就将相应的匹配到的URL补在我们这个链接后面,但是如果加了斜线,就意味着他会将你请求的内容替换成我们的这个URL。

    b、示例

      (1)、我们后面不加斜线时

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    location / {
        root /data/nginx/html;
    }

    location /admin/ {
        proxy_pass http://192.168.10.14:80; #这个意思意味着访问www.wohaoshuai1.com/admin/ 就会被代理成http://192.168.10.14:80/admin/ 
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80;
        }
}

      (2)、我们后面加斜线时

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    location / {
        root /data/nginx/html;
    }

    location /admin/ {
        proxy_pass http://192.168.10.14:80/; #这个意思是你访问www.wohaoshuai1.com/admin/的时候他会将你的URL替换成http://192.168.10.14:80/ 这个URL 
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80;
        }
}

      (3)、我们使用正则表达式时

[root@www ~]# cat /etc/nginx/conf.d/proxy.conf
server {
    listen 80;
    server_name www.wohaoshuai1.com;
    location / {
        root /data/nginx/html;
    }

    location /admin/ {
        proxy_pass http://192.168.10.14:80/; 
        }

    location ~* .(jpg|jpeg|png)$ {
        proxy_pass http://www.wohaoshuai3.com:80; #当我们使用正则表达式模式的时候我们是不允许在后面补任何路径的,因为他不知道该怎么替换,因为他只能将匹配到的整个URL内容补到后面
        }
}
原文地址:https://www.cnblogs.com/Presley-lpc/p/13225258.html