nginx(三)--实现反向代理与动静分离负载均衡

一、实现反向代理

nginx反向代理示意图。
在这里插入图片描述

ngx_http_proxy_module模块:
转发请求至另一台主机
1、 proxy_pass URL;
Context:location, if in location, limit_except
注意: proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机

 server {
   ...
   server_name HOSTNAME;
     location /uri/ {
     proxy_pass http://host[:port]; 最后没有/
   }
    ...
}

上面示例: http://HOSTNAME/uri --> http://host/uri
如果上面示例中有 /,即: http://host[:port]/
意味着: http://HOSTNAME/uri --> http://host/ 即置换

nginx服务器反向代理配置配置

[root@centos7 conf.d]# vim a.com.conf 

server {
    listen 80 default_server;
    server_name www.a.com;
    root /data/sitea/;
    error_page 404 =200 /404.html;
    location /404.html {
        root /data/sitea/error/;
    }
    location / {
       proxy_pass http://192.168.147.129/;
    }
}

后端http服务器页面信息

[root@centos7 html]# cat index.html 
welcome to cwj.com

客户端访问,访问的是外部的地址。
在这里插入图片描述
查看后端服务器访问日志,发现是中间的代理服务器发起的请求。
在这里插入图片描述
前端代理服务器记录了客户端的访问记录
在这里插入图片描述

二、实现动静分离

动静分离示意图
在这里插入图片描述
静态页面的服务器页面

[root@centos7 html]# ls 
 images  index.html 

动态页面的服务器配置
1、安装http+php-fpm+php-mysql+mysql。后端动态服务器配置成fastcgi模式,具体配置详解fastcgi模式配置

[root@centos7 ~]# yum install httpd php-fpm php-mysql mysql
server {
    listen 80 default_server;
    server_name www.a.com;
    root /data/sitea/;
    error_page 404 =200 /404.html;
    location /404.html {
        root /data/sitea/error/;
    }
    location ~ \.php$ {
       proxy_pass http://192.168.147.131;
    }
    location / {
       proxy_pass http://192.168.147.129/;
    }

}
                                                                                                                                                                              

静态页面
在这里插入图片描述
动态页面
在这里插入图片描述

三、反向代理相关配置项

1、proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值

  Context: http, server, location

示例:

  1.proxy_set_header X-Real-IP $remote_addr;
  2.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  ##解决多层代理问题

请求报文的标准格式如下:

    X-Forwarded-For: client1, proxy1, proxy2

$remote_addr
客户端地址

$proxy_add_x_forwarded_for

“ X-Forwarded-For”客户端请求标头字段中附加了$remote_addr变量,并用逗号分隔。 如果客户端请求标头中不存在“ X-Forwarded-For”字段(没有多层代理),则$proxy_add_x_forwarded_for变量等于$remote_addr变量。

添加请求报文首部之前的抓包情况
在这里插入图片描述

在发往后端主机的请求报文首部中添加远程客户端IP地址字段

server {
    listen 80 default_server;
    server_name www.a.com;
    root /data/sitea/;
    error_page 404 =200 /404.html;
    location /404.html {
        root /data/sitea/error/;
    }
    location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_pass http://192.168.147.129/;
    }
 }

再次访问并抓包,发现后端主机的请求报文的首部字段中含有自定义添加的X-Real-IP字段。
在这里插入图片描述

在这里插入图片描述

修改后端主机的日志格式,默认记录的是中间nginx代理服务器的地址。

日志记录的地址是192.168.147.135,即中间代理服务器的地址
在这里插入图片描述
修改后端主机的日志格式,把自定义的报文头部字段加入新的日志格式中。

[root@centos7 html]# vim /etc/httpd/conf/httpd.conf 
<IfModule log_config_module>
.....

    # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
     LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
.....
     CustomLog "logs/access_log" combined
.....
</IfModule>

后端的日志信息,可以记录到了真实的客户端IP。
在这里插入图片描述
多层代理场景
在这里插入图片描述
第一层代理的配置

[root@centos7 conf.d]# cat a_proxy.conf 
server {
    listen 80;
    location / {
       #proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.147.135/;
    }
}

第二层代理配置

[root@centos7 conf.d]# cat a.com.conf 
server {
    listen 80 default_server;
    server_name www.a.com;
    root /data/sitea/;
    error_page 404 =200 /404.html;
    location /404.html {
        root /data/sitea/error/;
    }
    location / {
       #proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://192.168.147.129/;
    }
}

访问并抓包测试
在这里插入图片描述
这是第一层代理服务器发往第二层代理服务器的请求报文头部信息,此时携带上了客户端地址
在这里插入图片描述
这是第二层代理服务器到后端应用服务器的请求报文首部,此时携带了客户端和第一层代理服务器的两个地址
在这里插入图片描述
再次修改后端应用服务器日志格式

[root@centos7 html]# vim /etc/httpd/conf/httpd.conf 
 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

后端的日志也显示了客户端和第一层代理服务器的地址
在这里插入图片描述
注意:两台代理服务器都要设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;才能把中间的代理服务器地址记录上,若只在第一层(即靠近客户端那层设置)则只记录客户端地址。

3、proxy_cache_path;
定义可用于proxy功能的缓存,建议启用;

 Syntax:	proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size 
                                  [inactive=time] [max_size=size] [min_free=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];
 Default:	—
 Context:	http

4、 proxy_cache zone | off;
默认off,指明调用的缓存,或关闭缓存机制;

     Context:http,server, location

5、 proxy_cache_key string;
缓存中用于“键”的内容
默认值: proxy_cache_key $scheme$proxy_host$request_uri;

    Context: http, server, location

6、 proxy_cache_valid [code …] time;
定义对特定响应码的响应内容的缓存时长

    Context: http, server, location

示例:

  proxy_cache_valid 200 302 10m;
  proxy_cache_valid 404 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

      proxy_cache_methods  GET | HEAD | POST ...;

对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

缓存示例:
在http配置定义缓存信息

[root@centos7 nginx]# vim nginx.conf

user nginx;
worker_processes auto;
#worker_cpu_affinity 0001;
#worker_priority -10;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;

    proxy_cache_path /var/cache/nginx/proxy_cache
                     levels=1:2 keys_zone=proxycache:20m  
                     inactive=120s max_size=1g;  

    sendfile            on;
    tcp_nopush          on;

......

说明:
proxycache:20m proxycache是定义的缓存格式名称,20m是指内存中缓存的大小,主要用于存放key和metadata(如:使用次数)
max_size=1g 指磁盘存入文件内容的缓存空间最大值

根据上面的定义创建缓存目录,只需创建父目录即可

[root@centos7 nginx]# mkdir /var/cache/nginx
[root@centos7 nginx]# ll -d /var/cache/nginx 
drwxr-xr-x 2 root root 6 10月 30 23:54 /var/cache/nginx

调用缓存功能,需要定义在相应的配置段中,如在反向代理的虚拟主机的server{…}段中调用。

server {
    listen 80 default_server;
    server_name www.b.com;
    root /data/siteb/;
    access_log /var/log/nginx/b_access.log main;
    proxy_cache proxycache;  ##调用上面定义的缓存,通过名称来调用
    proxy_cache_key $request_uri;  ##请求的URL被定为key
    proxy_cache_valid 200 302 301 1h;  ##对200 302 301响应的内容缓存1个小时
    proxy_cache_valid any 5m;  ##其他内容缓存5分钟
    location / {
       proxy_pass http://192.168.239.130/;
    }
}

访问测试
在这里插入图片描述

此时缓存数据已经存放到缓存目录下

[root@centos7 nginx]# ls  /var/cache/nginx 
proxy_cache
[root@centos7 nginx]# ls  /var/cache/nginx/proxy_cache/
9
[root@centos7 nginx]# tree   /var/cache/nginx/proxy_cache/
/var/cache/nginx/proxy_cache/
└── 9
    └── 7d
        └── 6666cd76f96956469e7be39d750cc7d9

2 directories, 1 file

查看缓存内容,就是访问的页面内容

[root@centos7 ~]# cat  /var/cache/nginx/proxy_cache/9/7d/6666cd76f96956469e7be39d750cc7d9 
𛝜ڜ_曟ՒҹX["e-5b2ef1f1be554"
KEY: /
HTTP/1.1 200 OK
Date: Sat, 31 Oct 2020 04:20:21 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 31 Oct 2020 03:29:32 GMT
ETag: "e-5b2ef1f1be554"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/html; charset=UTF-8

www.baidu.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值