@xushengkai
2022-12-26T07:31:57.000000Z
字数 5929
阅读 407
nginx
[TOC]
区分正向代理和反向代理
代理的本质,就是"中介",主要是要搞懂,这个中介在代替client,还是代替server
“替真正的client”,向server申请服务的是正向代理
正向代理是client的行为,目的是为了伪造出"client身份"“替真正的server”,给client提供服务的是反向代理
反向代理是server方的行为,目标是伪造出"server身份"

正向代理
内网客户机通过代理访问互联网,通常要设置代理服务器地址和端口
生活场景
一些什么情况需要伪造client身份呢:比如,想买烟的未成年和不准卖烟给未成年的烟店老板,一个是client,一个是server这个未成年需要买烟的话,就不能以自己的身份来买,所以他需要叫个代跑腿的成年小哥,这个时候这个跑腿小哥就是未成年小伙伪造的"client",属于正向代理
互联网场景
某用户小王,不想要某网站发现他的ip登录过,使用代理ip以后,他在互联网中的所作所为,就好像都是那个代理IP在做的,
代理ip代替着小王,互联网中的各个server们只知道代理ip来过,不知道小王来过
又比如一些网站禁止一个ip访问太频繁,但client方的小李又需要频繁获取这个网站的信息,那么"正向代理"的代理ip就起作用了,小李只需要频繁更换代理ip来伪装是很多client访问网站就行了。
反向代理
外网用户通过访问内网服务器,内网服务无感知
正向代理是伪造的client身份,那么反向代理伪造出"server身份"的场景了
在生产中应用还是比较多的,代理服务器代理目标服务器,负责收发请求,目标服务器对客户端来说是不可见的,不过客户端请求目标服务器和请求代理是一样的效果。比较常见的场景就是nginx的负载均衡
反向代理的应用场景比较多,列举一下反向代理的应用场景:
- 负载均衡
- 隐藏原始资源服务器
- 加密和SSL加速
- 缓存静态内容
- 减速上传
- 安全
- 压缩
- 外网发布
正向代理和反向代理的区别
代理对象不同:正向代理代理的是客户端,客户端访问代理服务器,并且需要指定目标服务器,然后代理服务器会发送请求给目标服务器,响应之后,响应内容由代理服务器返回给客户端;反向代理代理的是目标服务端,客户端请求代理服务器,不需要指定配置什么目标服务器,代理服务器会进行转发到对应目标服务器,对客户端来说,目标服务器是不可见的,不过访问代理服务器和访问目标服务器好像是一样的
用途不同:正向代理是为了在防火墙内的局域网提供访问internet的途径,比如fānqiáng;反向代理是将防火墙后面的服务器提供给internet用户访问,比如负载均衡
模块
ngx_http_proxy_module
语法
1.语法: proxy_pass URL; #代理的后端服务器URL位置:location,if in location,limit_except2.语法:proxy_buffering on | off #代理的缓冲功能默认:proxy_buffering on;位置:http,server,location#proxy_buffering开启的情况下,nginx会把后端返回的内容先放到缓冲区当中,然后在返回给客户端(边收边传,不是全部接受完再传给客户端)3.语法:proxy_buffer_size 大小; #代理的缓冲区大小默认:proxy_buffer_size 4k | 8k;位置:http,server,location4.语法:proxy_busy_buffers number size; #代理的缓冲区数量是多少默认:proxy_busy_buffers 8 4k |8k;位置:http,server,location5.语法:proxy_busy_buffers_size size; #忙碌的缓冲区大小,控制同时传递给客户端的buffer数量默认:proxy_busy_buffers_size 8k | 16k;位置:http,server,location6.语法:proxy_set_header field value; #设置真实客户端地址默认::proxy_set_header Host $proxy_host;proxy_set_header Connection close;位置:http,server,location7.语法:proxy_connect_timeout time; #连接超时时间默认:proxy_connect_timeout 60s;位置:http,server,location8.语法:proxy_read_timeout time;默认:proxy_read_timeout 60s;位置:http,server,location9.语法:proxy_send_time time; #nginx进程向fastcgi进程发送请求整个过程的超时时间默认:proxy_send_time 60s;位置:http,server,location
环境两台nginx服务器,关闭防火墙和selinux,根据nginx官网说明安装nginx
1.nginx-1业务服务器环境
#安装nginx服务[root@192 ~]# yum -y install nginx#在主页上进行修改[root@192 ~]# vim /usr/share/nginx/html/index.html1234<img src="1.jpg" width=300 border=3 /> #添加图片#拷贝图片到主页目录下[root@192 ~]# cd /usr/share/nginx/html/[root@192 html]# rz#重启服务root@192 ~]# systemctl restart nginx#在PC客户端浏览器访问业务服务器,显示1234图片成功。
2.nginx-2代理服务器环境
#安装nginx服务[root@192 ~]# yum -y install nginx#使用默认配置文件,进行修改[root@192 ~]# vim /etc/nginx/conf.d/default.conf7 location / {#注释掉nginx默认页面的位置8 # root /usr/share/nginx/html;9 # index index.html index.htm;#在下面添加以下内容10 proxy_pass http://192.168.200.149; #真实服务器,ip为业务服务器ip11 proxy_redirect default; #代理时使用默认端口1213 proxy_set_header Host $http_host; #代理时设置http头部14 proxy_set_header X-Real-IP $remote_addr; #启动客户端真实IP15 rproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #在转发时,除了把客户机的真实IP告诉服务器用于后期分析,也把转发服务器的自身IP告诉服务器1617 proxy_connect_timeout 60;18 proxy_send_timeout 60;19 proxy_read_timeout 60;2021 proxy_buffering on;22 proxy_buffer_size 32k;23 proxy_buffers 4 128k;24 proxy_busy_buffers_size 256k;25 proxy_max_temp_file_size 256k;#重启服务[root@192 ~]# systemctl restart nginx打开PC客户端浏览器访问代理服务器页面,显示页面和业务服务器页面相同,说明代理服务器已经具备转发能力,将信息传递给了业务服务器。
3.到这里实验已经成功了,观察nginx-1业务服务器的日志
[root@192 ~]# cat /var/log/nginx/access.log192.168.200.146 - - [06/Dec/2022:10:14:48 +0800] "GET /favicon.ico HTTP/1.0" 404 3650 "http://192.168.200.146/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.62" "192.168.200.1"
缓存类型
- 网页缓存(公网)CDN
- 数据库缓存 memcache redis
- 网页缓存 nginx-proxy
- 客户端缓存 浏览器缓存
模块
ngx_http_proxy_module
语法:
#缓存开关语法:proxy_cache zone | off;默认:proxy_cache off;位置:http,server,location#代理缓存语法:proxy_cache_path path [levels=levels] keys_zone=name:size[inactive=time] [max_size=size]位置:http示例:proxy_cache_path /data/nginx/cache levels=1:2 key_zone=one:10m; #缓存的路径放在/data/nginx/cache,下面有两级目录,每一次缓存是一个总目录,下面的内容是2级目录,策略名称是zone,10m空间#缓存维度语法:proxy_cache_key string; #定义缓存唯一key,通过key来进行hash存取,缓存文件名默认:proxy_cache_key $scheme$proxy_host$request_uri;位置:http,server,location#缓存过期语法:proxy_cache_valid [code...] time;位置:http,server,location示例:proxy_cache_valid 200 302 10m; #缓存状态码200,302的,10分钟proxy_cache_valid 404 1m
1.延续上个实验的代理
2.设置nginx-2为缓存服务器
#打开nginx的主配置文件,在http{的下面写入以下内容[root@192 ~]# vim /etc/nginx/nginx.conf12 http {13 proxy_cache_path /app/test/cache levels=1:2 keys_zone=proxy_cache:10m ma x_size=10g inactive=60m use_temp_path=off;
- 参数解释:
- 用于缓存本地的磁盘目录是/app/test/cache,需要单独创建
- levels在/app/test/cache设置了一个两级层次结构的目录,将大量的文件放置在单个目录中会导致文件访问缓慢,所以针对大多数部署,推荐使用两级目录层次结构,如果levels参数没有配置,nginx会将左右的文件放到同一个目录中
- keys_zone设置一个共享内存区,该内存区用于存储缓存键和元数据,有些类似计时器的用途,将键拷贝放入内存可以使nginx在不检索磁盘的情况下快速决定一个请求是“HT”还是“MISS”,这样大大提高的检索速度,一个1MB的内存空间可以存储大约8000个key,那么上面配置的10MB内存空间可以存储差不多80000个key
- max_size设置了缓存的上限(上面配置文件设置了10G),是一个可选项,如果不指定具体值,那就是允许缓存不断增长,占用所有可用空间。当缓存文件达到这个上限,处理器便调用cache manager来移除最近最少被使用的文件,这样把缓存的空间降低至这个限制之下
- inactive指定了项目在不被访问的情况下能偶在内存中保持的时间,在上面的例子中,如果一个文件在60分钟之内没有请求,则缓存管理将会自动将其在内存中删除,不关该文件是否过期,该参数默认值为10分钟(10m)。注意非活动内容有别于过期内容,nginx不会自动删除由缓存控制头部指定的过期内容,过期内容只有在inactive指定时间内没有被访问的情况下才会被删除,如果过期内容被访问了,那么nginx就会将其从原服务器上刷新,并更新对应的inactive计时器
- nginx最初会将注定写入缓存的文件先放入临时存储区域use_temp_path=off;命令指示nginx将在缓存这些文件时将它们写入同一目录下,这里强烈建议各位将参数设置为off,一般情况下不开,来避免在文件系统中不必要的数据拷贝。
#在nginx默认的conf文件[root@192 ~]# vim /etc/nginx/conf.d/default.conf7 location / {8 # root /usr/share/nginx/html;9 # index index.html index.htm;10 #缓存,添加以下内容11 proxy_cache proxy_cache; #前面是代理器缓存命令,后面是名字12 proxy_cache_valid 200 304 12h; #对状态码200,304的缓存12小时13 proxy_cache_valid any 10m; #设置不同状态码的缓存时间,除了上面的,其他的缓存10分钟1415 proxy_cache_key $host$uri$is_args$args; #定义缓存唯一key,通过唯一key来进行哈希值存取16 add_header Nginx-Cache "$upstream_cache_status"; #缓存命中情况如何在http头中体现,以及在nginx日志中查看17 proxy_next_upstream error timeout invalid_header http_500 http_502 http_ 503 http_504; #当业务服务器返回状态码为500,502,503,504出现错误时,会跳过此台服务器#创建目录[root@192 ~]# mkdir /app/test/cache -p#重启nginx[root@192 ~]# systemctl restart nginx
3.测试
在PC机打开浏览器,访问nginx-2代理服务器,在页面上按F12打开开发者模式,在多次刷新页面在开发者模式里网络里查看Nginx-Cache: HIT,即为成功