[关闭]
@xushengkai 2022-12-26T07:31:57.000000Z 字数 5929 阅读 407

Nginx 高级进阶篇

nginx


[TOC]

一.Nginx Proxy服务器

代理原理

区分正向代理和反向代理

代理的本质,就是"中介",主要是要搞懂,这个中介在代替client,还是代替server

“替真正的client”,向server申请服务的是正向代理
正向代理是client的行为,目的是为了伪造出"client身份"

“替真正的server”,给client提供服务的是反向代理
反向代理是server方的行为,目标是伪造出"server身份"

此处输入图片的描述

正向代理
内网客户机通过代理访问互联网,通常要设置代理服务器地址和端口
此处输入图片的描述

生活场景

  1. 一些什么情况需要伪造client身份呢:
  2. 比如,想买烟的未成年和不准卖烟给未成年的烟店老板,一个是client,一个是server
  3. 这个未成年需要买烟的话,就不能以自己的身份来买,所以他需要叫个代跑腿的成年小哥,
  4. 这个时候这个跑腿小哥就是未成年小伙伪造的"client",属于正向代理

互联网场景
某用户小王,不想要某网站发现他的ip登录过,使用代理ip以后,他在互联网中的所作所为,就好像都是那个代理IP在做的,
代理ip代替着小王,互联网中的各个server们只知道代理ip来过,不知道小王来过
又比如一些网站禁止一个ip访问太频繁,但client方的小李又需要频繁获取这个网站的信息,那么"正向代理"的代理ip就起作用了,小李只需要频繁更换代理ip来伪装是很多client访问网站就行了。


反向代理
外网用户通过访问内网服务器,内网服务无感知
正向代理是伪造的client身份,那么反向代理伪造出"server身份"的场景了
在生产中应用还是比较多的,代理服务器代理目标服务器,负责收发请求,目标服务器对客户端来说是不可见的,不过客户端请求目标服务器和请求代理是一样的效果。比较常见的场景就是nginx的负载均衡
此处输入图片的描述

反向代理的应用场景比较多,列举一下反向代理的应用场景:

  • 负载均衡
  • 隐藏原始资源服务器
  • 加密和SSL加速
  • 缓存静态内容
  • 减速上传
  • 安全
  • 压缩
  • 外网发布

正向代理和反向代理的区别

代理对象不同:正向代理代理的是客户端,客户端访问代理服务器,并且需要指定目标服务器,然后代理服务器会发送请求给目标服务器,响应之后,响应内容由代理服务器返回给客户端;反向代理代理的是目标服务端,客户端请求代理服务器,不需要指定配置什么目标服务器,代理服务器会进行转发到对应目标服务器,对客户端来说,目标服务器是不可见的,不过访问代理服务器和访问目标服务器好像是一样的
用途不同:正向代理是为了在防火墙内的局域网提供访问internet的途径,比如fānqiáng;反向代理是将防火墙后面的服务器提供给internet用户访问,比如负载均衡

Proxy 代理

模块
ngx_http_proxy_module


语法

  1. 1.语法: proxy_pass URL #代理的后端服务器URL
  2. 位置:locationif in locationlimit_except
  3. 2.语法:proxy_buffering on | off #代理的缓冲功能
  4. 默认:proxy_buffering on;
  5. 位置:httpserverlocation
  6. #proxy_buffering开启的情况下,nginx会把后端返回的内容先放到缓冲区当中,然后在返回给客户端(边收边传,不是全部接受完再传给客户端)
  7. 3.语法:proxy_buffer_size 大小; #代理的缓冲区大小
  8. 默认:proxy_buffer_size 4k | 8k;
  9. 位置:httpserverlocation
  10. 4.语法:proxy_busy_buffers number size; #代理的缓冲区数量是多少
  11. 默认:proxy_busy_buffers 8 4k |8k;
  12. 位置:http,server,location
  13. 5.语法:proxy_busy_buffers_size size; #忙碌的缓冲区大小,控制同时传递给客户端的buffer数量
  14. 默认:proxy_busy_buffers_size 8k | 16k;
  15. 位置:http,server,location
  16. 6.语法:proxy_set_header field value; #设置真实客户端地址
  17. 默认::proxy_set_header Host $proxy_host;
  18. proxy_set_header Connection close;
  19. 位置:http,server,location
  20. 7.语法:proxy_connect_timeout time; #连接超时时间
  21. 默认:proxy_connect_timeout 60s;
  22. 位置:httpserverlocation
  23. 8.语法:proxy_read_timeout time;
  24. 默认:proxy_read_timeout 60s;
  25. 位置:http,server,location
  26. 9.语法:proxy_send_time time; #nginx进程向fastcgi进程发送请求整个过程的超时时间
  27. 默认:proxy_send_time 60s;
  28. 位置:http,server,location

启用代理

环境两台nginx服务器,关闭防火墙和selinux,根据nginx官网说明安装nginx


1.nginx-1业务服务器环境

  1. #安装nginx服务
  2. [root@192 ~]# yum -y install nginx
  3. #在主页上进行修改
  4. [root@192 ~]# vim /usr/share/nginx/html/index.html
  5. 1234
  6. <img src="1.jpg" width=300 border=3 /> #添加图片
  7. #拷贝图片到主页目录下
  8. [root@192 ~]# cd /usr/share/nginx/html/
  9. [root@192 html]# rz
  10. #重启服务
  11. root@192 ~]# systemctl restart nginx
  12. #在PC客户端浏览器访问业务服务器,显示1234图片成功。

2.nginx-2代理服务器环境

  1. #安装nginx服务
  2. [root@192 ~]# yum -y install nginx
  3. #使用默认配置文件,进行修改
  4. [root@192 ~]# vim /etc/nginx/conf.d/default.conf
  5. 7 location / {
  6. #注释掉nginx默认页面的位置
  7. 8 # root /usr/share/nginx/html;
  8. 9 # index index.html index.htm;
  9. #在下面添加以下内容
  10. 10 proxy_pass http://192.168.200.149; #真实服务器,ip为业务服务器ip
  11. 11 proxy_redirect default; #代理时使用默认端口
  12. 12
  13. 13 proxy_set_header Host $http_host; #代理时设置http头部
  14. 14 proxy_set_header X-Real-IP $remote_addr; #启动客户端真实IP
  15. 15 rproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #在转发时,除了把客户机的真实IP告诉服务器用于后期分析,也把转发服务器的自身IP告诉服务器
  16. 16
  17. 17 proxy_connect_timeout 60;
  18. 18 proxy_send_timeout 60;
  19. 19 proxy_read_timeout 60;
  20. 20
  21. 21 proxy_buffering on;
  22. 22 proxy_buffer_size 32k;
  23. 23 proxy_buffers 4 128k;
  24. 24 proxy_busy_buffers_size 256k;
  25. 25 proxy_max_temp_file_size 256k;
  26. #重启服务
  27. [root@192 ~]# systemctl restart nginx
  28. 打开PC客户端浏览器访问代理服务器页面,显示页面和业务服务器页面相同,说明代理服务器已经具备转发能力,将信息传递给了业务服务器。

3.到这里实验已经成功了,观察nginx-1业务服务器的日志

  1. [root@192 ~]# cat /var/log/nginx/access.log
  2. 192.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"

Proxy 缓存

缓存类型

  • 网页缓存(公网)CDN
  • 数据库缓存 memcache redis
  • 网页缓存 nginx-proxy
  • 客户端缓存 浏览器缓存

模块

ngx_http_proxy_module


语法:

  1. #缓存开关
  2. 语法:proxy_cache zone | off;
  3. 默认:proxy_cache off;
  4. 位置:http,server,location
  5. #代理缓存
  6. 语法:proxy_cache_path path [levels=levels] keys_zone=name:size[inactive=time] [max_size=size]
  7. 位置:http
  8. 示例:proxy_cache_path /data/nginx/cache levels=1:2 key_zone=one:10m; #缓存的路径放在/data/nginx/cache,下面有两级目录,每一次缓存是一个总目录,下面的内容是2级目录,策略名称是zone,10m空间
  9. #缓存维度
  10. 语法:proxy_cache_key string; #定义缓存唯一key,通过key来进行hash存取,缓存文件名
  11. 默认:proxy_cache_key $scheme$proxy_host$request_uri;
  12. 位置:http,server,location
  13. #缓存过期
  14. 语法:proxy_cache_valid [code...] time;
  15. 位置:http,server,location
  16. 示例:proxy_cache_valid 200 302 10m; #缓存状态码200,302的,10分钟
  17. proxy_cache_valid 404 1m

启动缓存

1.延续上个实验的代理


2.设置nginx-2为缓存服务器

  1. #打开nginx的主配置文件,在http{的下面写入以下内容
  2. [root@192 ~]# vim /etc/nginx/nginx.conf
  3. 12 http {
  4. 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,一般情况下不开,来避免在文件系统中不必要的数据拷贝。
  1. #在nginx默认的conf文件
  2. [root@192 ~]# vim /etc/nginx/conf.d/default.conf
  3. 7 location / {
  4. 8 # root /usr/share/nginx/html;
  5. 9 # index index.html index.htm;
  6. 10 #缓存,添加以下内容
  7. 11 proxy_cache proxy_cache; #前面是代理器缓存命令,后面是名字
  8. 12 proxy_cache_valid 200 304 12h; #对状态码200,304的缓存12小时
  9. 13 proxy_cache_valid any 10m; #设置不同状态码的缓存时间,除了上面的,其他的缓存10分钟
  10. 14
  11. 15 proxy_cache_key $host$uri$is_args$args; #定义缓存唯一key,通过唯一key来进行哈希值存取
  12. 16 add_header Nginx-Cache "$upstream_cache_status"; #缓存命中情况如何在http头中体现,以及在nginx日志中查看
  13. 17 proxy_next_upstream error timeout invalid_header http_500 http_502 http_ 503 http_504; #当业务服务器返回状态码为500,502,503,504出现错误时,会跳过此台服务器
  14. #创建目录
  15. [root@192 ~]# mkdir /app/test/cache -p
  16. #重启nginx
  17. [root@192 ~]# systemctl restart nginx

3.测试

在PC机打开浏览器,访问nginx-2代理服务器,在页面上按F12打开开发者模式,在多次刷新页面在开发者模式里网络里查看Nginx-Cache: HIT,即为成功

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注