首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >010.Nginx正反代理

010.Nginx正反代理

作者头像
木二
发布于 2020-07-20 01:59:07
发布于 2020-07-20 01:59:07
1.6K01
代码可运行
举报
文章被收录于专栏:木二天空木二天空
运行总次数:1
代码可运行

一 Nginx代理

1.1 Nginx代理概述

nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器。同时也是一个IMAP、POP3、SMTP代理服务器。nginx可以作为一个HTTP服务器进行网站的发布处理,同时nginx可以作为反向代理进行负载均衡的实现。

1.2 Nginx代理模式

Nginx通常有如下三种代理模式:

  • 正向代理(forward proxy)
  • 反向代理(reverse proxy)
  • 透明代理

1.3 正向代理

正向代理(forward)是一个位于客户端和原始服务器(origin server)之间的服务器,即代理服务器。为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。

场景一:客户端访问本来无法访问的原始服务器的资源

假设最初客户端要访问原始服务器需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障(或存在禁止访问的安全策略等),那么就无法访问原始服务器了。

但是如果客户端让代理服务器去代替自己访问原始服务器,由于代理服务器没有在路由器R1或R2节点中,而是通过其它的路由节点访问的原始服务器,那么客户端就可以得到原始服务器的数据了。

场景二:加速访问原始服务器的资源

假设客户端要访问原始服务器,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而客户端到代理服务器,从代理服务器到原始服务器都是高带宽链路。那么使用正向代理则可以加速访问。

场景三:Cache作用

Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术)。

如上图所示,假设客户端要访问原始服务器某数据A之前,代理服务器已经通过访问原始服务器数据A,那么代理服务器会把数据A保存一段时间,此时再次通过代理服务器访问数据A,那么代理服务器不再访问原始服务器,而把缓存的数据A直接发给客户端。这一技术在Cache中术语就叫Cache命中。

场景四:代理服务器实现授权控制

如上图所示,防火墙作为网关,用来过滤外网对其的访问。假设局域网内部客户端A和客户端B都设置了代理服务器。可通过代理服务器配置客户端A允许访问互联网,而客户端B不允许访问互联网,从而实现不通客户端的访问代理授权控制。

场景五:隐藏客户端踪迹

如上图所示,原始服务器并不知道访问自己的实际的客户端,因为代理服务器代替客户端去直接与原始服务器进行交互,从而对于原始服务器而言,客户端的踪迹被隐藏了。

1.4 反向代理

反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。

场景一:隐藏原始服务器踪迹

客户端始终认为它访问的是原始服务器而不是代理服务器,但实用际上反向代理服务器接受客户端的应答,从原始资源服务器中取得客户端的需求资源,然后发送给客户端。由于防火墙的作用,只允许代理服务器访问原始资源服务器。对于此环境下,防火墙和反向代理的共同作用保护了原始资源服务器,对于客户端而言是透明的。

场景二:负载均衡器

当反向代理服务器存在多个,从而部署为集群,当多个客户端访问原始服务器(原始服务器也可以是集群)的时候,不同的代理服务器应答不同的客户端,然后发送不同的客户端所需的资源,从而实现负载均衡效果。

提示:Nginx基于反向代理实现负载均衡配置参考《012.Nginx负载均衡》。

场景三:Cache作用

同时反向代理服务器类似正向代理服务器一样拥有Cache的作用,可以缓存原始资源服务器的资源,而不是每次都要向原始资源服务器组请求数据,特别对于一些静态的数据,比如图片和普通文件,如果这些反向代理服务器能够做到和客户端来自同一个网络,那么客户端访问反向代理服务器,就会得到很高质量的速度。这正是CDN技术的核心。场景四:正方代理混合场景

实际项目操作时,正向代理和反向代理很有可能会存在在一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。

1.5 透明代理

参考:https://www.cnblogs.com/gbq-dog/p/10653054.html。

1.6 常见代理软件

通常大多数开源代理软件,都能实现正反代理两种方式。开源软件中如squid,既可以做正向代理,也可以实现反向代理。MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,如Nginx。

二 代理配置项

2.1 配置语法

语法:proxy_buffering on | off;

默认值:proxy_buffering on;

可配置段:http, server, location

作用:配置proxy缓冲区。

扩展:

  • proxy_buffer_size:设置缓冲区大小(内存页大小)
  • proxy_buffers:设置缓冲区数量和大小(内存页数量和大小)
  • proxy_busy_buffers_size:设置最大缓冲区大小

语法:proxy_redirect default; proxy_redirect off; proxy_redirect redirect replacement;

默认值:proxy_redirect default;

可配置段:http, server, location

作用:配置proxy重定向。

扩展:

语法:proxy_buffering on | off;

默认值:proxy_buffering on;

可配置段:http, server, location

作用:配置proxy缓冲区。

扩展:

语法:proxy_set_header field value;

默认值:proxy_set_header Host $proxy_host; proxy_set_header Connection close;

可配置段:http, server, location

作用:配置proxy头信息。

扩展:

  • proxy_hide_header:设置隐藏头信息字段;
  • proxy_set_body:设置请求体返回信息。

语法:proxy_connect_timeout time;

默认值:proxy_connect_timeout 60s;

可配置段:http, server, location

作用:配置proxy超时。

扩展:

  • proxy_hide_header:设置隐藏头信息字段;
  • proxy_set_body:设置请求体返回信息。

三 配置正向代理

3.1 正向代理配置

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@proxy ~]# vi /etc/nginx/conf.d/reverse.conf
  2 server{
  3     resolver 8.8.8.8;				#配置DNS解析IP地址
  4     resolver_timeout 30s;				#超时时间(5秒)
  5     listen 8080;
  6     access_log  /var/log/nginx/reverse.access.log  main;
  7     error_log   /var/log/nginx/reverse.error.log  warn;
  8     location / {
  9         proxy_pass http://$http_host$request_uri;	#配置正向代理参数
 10         proxy_set_header Host $http_host;		#解决如果URL中带"."后Nginx 503错误
 11         proxy_buffers 256 4k; 			#配置缓存大小
 12         proxy_max_temp_file_size 0;			#关闭磁盘缓存读写减少I/O
 13         proxy_connect_timeout 30;			#代理连接超时时间
 14         proxy_cache_valid 200 302 10m;
 15         proxy_cache_valid 301 1h;
 16         proxy_cache_valid any 1m;			#配置代理服务器缓存时间
 17     }
 18 }
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@proxy ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@proxy ~]# nginx -s reload				#重载配置文件

配置释义:

不能有hostname。

必须有resolver, 即dns,超时时间(30秒)可选。

配置正向代理参数,均是由 Nginx 变量组成。

提示:配置好后,重启nginx,以浏览器为例,若需要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+80即可使用了。

参考文档:https://www.cnblogs.com/gbq-dog/p/10653054.html

四 反向代理配置

4.1 环境预设

主机

作用

备注

proxy2.odocker.com

代理服务器

反向代理服务器

www.landiannews.com

原始服务器

模拟原始服务器

4.2 配置反向代理

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@proxy ~]# vi /etc/nginx/conf.d/forward.conf
  2 server {
  3     listen  80;
  4     server_name  forward.linuxds.com;
  5     access_log  /var/log/nginx/forward.access.log  main;
  6     error_log   /var/log/nginx/forward.error.log  warn;
  7     location / {
  8         proxy_pass https://www.landiannews.com/;
  9         index index.html;
 10         proxy_redirect     off;
 11 #        proxy_set_header   Host             $host;
 12         proxy_set_header   X-Real-IP        $remote_addr;
 13         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 14         client_max_body_size       10m;		#允许客户端请求的最大单文件字节数
 15         client_body_buffer_size    128k;	        #缓冲区代理缓冲用户端请求的最大字节数
 16         proxy_connect_timeout      300;		#nginx跟后端服务器连接超时时间(代理连接超时)
 17         proxy_send_timeout         300;		#后端服务器数据回传时间(代理发送超时)
 18         proxy_read_timeout         300;		#连接成功后,后端服务器响应时间(代理接收超时)
 19         proxy_buffer_size          4k;		#设置代理服务器(nginx)保存用户头信息的缓冲区大小
 20         proxy_buffers              4 32k;	        #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
 21         proxy_busy_buffers_size    64k;		#高负荷下缓冲大小(proxy_buffers*222         proxy_temp_file_write_size 64k;		#设定缓存文件夹大小,大于这个值,将从upstream服务器传
 23     }
 24 }
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@proxy ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@proxy ~]# nginx -s reload				#重载配置文件

配置释义:

proxy_set_header X-Real-IP $remote_addr:把源IP【$remote_addr,建立HTTP连接header里面的信息】赋值给X-Real-IP,从而通过$X-Real-IP来获取源IP;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:在nginx作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来,用【,】隔开。

4.3 测试反向代理

浏览器访问:http://forward.linuxds.com/

参考文档:https://www.runoob.com/w3cnote/nginx-proxy-balancing.html

4.4 其他代理配置语句

proxy_pass:设置代理服务器的地址,可以是主机名称、IP地址加端口号等形式。

proxy_pass URL

提示:

1:当代理的是一组服务器时可以使用 upstream 指令来设置。

2:当URL中含有uri时,(例如 "http://127.0.0.1:8080/"、"http://127.0.0.1:8080/demo.html")不管客户端访问的是地址中的uri是什么,代理服务器都会代理到URL的地址;当URL中不包含uri时(例如:"http://127.0.0.1:8080"),那么当客户端访问服务器时,代理服务器会根据客户端请求的uri来访问具体的URL地址。

proxy_pass_request_body on|off:用于配置是否将客户端请求的请求体发送给代理服务器。

proxy_pass_request_headers on|off:用于配置是否将客户端请求的头信息发送给代理服务器。

proxy_set_header field value:可以更改nginx接收到的客户端请求的请求头信息,然后将新的请求头信息发送给被代理的服务器。

proxy_set_body value:ngin接收到客户端的请求后使用该指令可以修改request中的body体,然后将请求转发给代理服务器。

proxy_connect_timeout time:nginx服务器与被代理服务器之间尝试建立连接的的超时时间,默认为60s。

proxy_read_timeot time:nginx服务器接收被代理服务器数据时最大的等待时间,默认为60s。

proxy_send_timeout time:nginx服务器发送数据至被代理服务器的最大等待时间,例如60s内没有发出一个字节则默认断开连接,默认60s。

proxy_http_version 1.0|1.1:nginx服务器提供代理服务的http协议版本。

proxy_method method:nginx服务器设置请求被代理服务器时使用的请求方法,一般为POST或者GET。

proxy_ignore_client_abort:当客户端中断网络请求时,nginx服务是否中断对代理服务器的请求,默认off。

五 四层代理配置

5.1 四层代理

nginx-1.9.0 开始支持 TCP 代理,即4层代理,编译安装默认不会支持,需要加上 –with-stream 参数编译。

5.2 环境预设

IP:端口

后端RS

备注

172.24.10.21:8888(nginx01)

172.24.10.22:81(nginx02) 172.24.10.23:81(nginx03)

反向代理81端口Web

172.24.10.21:2222(nginx01)

172.24.10.24:22(nginx04)

反向代理ssh

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# mkdir /usr/share/nginx/rs/
  2 [root@nginx02 ~]# echo '<h1>Rs172.24.10.22-81</h1>' > /usr/share/nginx/rs/index.html
  3 [root@nginx02 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
  4 server {
  5     listen  81;
  6     server_name 172.24.10.22;
  7     location / {
  8         root   /usr/share/nginx/rs;
  9         index  index.html;
 10         access_log  /var/log/nginx/rs.access.log  main;
 11         error_log   /var/log/nginx/rs.error.log  warn;
 12     }
 13 }
 14 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@nginx02 ~]# nginx -s reload			#重载配置文件
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx03 ~]# mkdir /usr/share/nginx/rs/
  2 [root@nginx03 ~]# echo '<h1>Rs172.24.10.23-81</h1>' > /usr/share/nginx/rs/index.html
  3 [root@nginx03 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
  4 server {
  5     listen  81;
  6     server_name 172.24.10.23;
  7     location / {
  8         root   /usr/share/nginx/rs;
  9         index  index.html;
 10         access_log  /var/log/nginx/rs.access.log  main;
 11         error_log   /var/log/nginx/rs.error.log  warn;
 12     }
 13 }
 14 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@nginx02 ~]# nginx -s reload			#重载配置文件

5.3 配置四层代理

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# cat >> /etc/nginx/nginx.conf << EOF
  2 stream {
  3     upstream myweb {
  4         server 172.24.10.22:81 weight=5 max_fails=1 fail_timeout=10s;
  5         server 172.24.10.23:81;
  6     }
  7     upstream myssh {
  8         hash $remote_addr consistent;
  9         server 172.24.10.24:22;
 10     }
 11 
 12     server {
 13         listen  8888;
 14         proxy_connect_timeout 2s;
 15         proxy_timeout 900s;
 16         proxy_pass myweb;
 17     }
 18 
 19     server {
 20         listen  2222;
 21         proxy_connect_timeout 2s;
 22         proxy_timeout 900s;
 23         proxy_pass myssh;
 24     }
 25 }
 26 EOF

提示:stream和http同等级,因此如上配置需要追加至主配置文件最后。

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@proxy ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@proxy ~]# nginx -s reload				#重载配置文件

5.4 确认验证

浏览器访问:http://113.31.111.246:8888/。

[root@proxy ~]# ssh -p 2222 172.24.9.247 #测试ssh

提示:更多代理模块细节,参考《附001.Nginx代理相关模块解析》。

六 按类型反向代理配置

6.1 环境预设

主机

IP

备注

nginx01

172.24.10.21

反向代理服务器

nginx02

172.24.10.22

chrmoe类型资源 firefox类型资源

nginx03

172.24.10.23

iPhone类型资源 android类型资源

nginx04

172.24.10.24

IE类型资源

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# mkdir /usr/share/nginx/basebrowser/
  2 [root@nginx02 ~]# echo '<h1>Chrmoe-172.24.10.22</h1>' > /usr/share/nginx/basebrowser/index01.html
  3 [root@nginx02 ~]# echo '<h1>Firefox-172.24.10.22</h1>' > /usr/share/nginx/basebrowser/index02.html
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/basebrowser.conf <<EOF
  2 server {
  3     listen  88;
  4     server_name 172.24.10.22;
  5     location / {
  6         root   /usr/share/nginx/basebrowser;
  7         index  index01.html;
  8         access_log  /var/log/nginx/chrmoebrowser.access.log  main;
  9         error_log   /var/log/nginx/chrmoebrowser.error.log  warn;
 10     }
 11 }
 12 server {
 13     listen  89;
 14     server_name 172.24.10.22;
 15     location / {
 16         root   /usr/share/nginx/basebrowser;
 17         index  index02.html;
 18         access_log  /var/log/nginx/firefoxbrowser.access.log  main;
 19         error_log   /var/log/nginx/firefoxbrowser.error.log  warn;
 20     }
 21 }
 22 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx03 ~]# mkdir /usr/share/nginx/cellphone/
  2 [root@nginx03 ~]# echo '<h1>iPhone-172.24.10.23</h1>' > /usr/share/nginx/cellphone/index01.html
  3 [root@nginx03 ~]# echo '<h1>Android-172.24.10.23</h1>' > /usr/share/nginx/cellphone/index02.html
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/cellphone.conf <<EOF
  2 server {
  3     listen  88;
  4     server_name 172.24.10.23;
  5     location / {
  6         root   /usr/share/nginx/cellphone;
  7         index  index01.html;
  8         access_log  /var/log/nginx/iphone.access.log  main;
  9         error_log   /var/log/nginx/iphone.error.log  warn;
 10     }
 11 }
 12 server {
 13     listen  89;
 14     server_name 172.24.10.23;
 15     location / {
 16         root   /usr/share/nginx/cellphone;
 17         index  index02.html;
 18         access_log  /var/log/nginx/android.access.log  main;
 19         error_log   /var/log/nginx/android.error.log  warn;
 20     }
 21 }
 22 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx04 ~]# mkdir /usr/share/nginx/iebrowser/
  2 [root@nginx04 ~]# echo '<h1>IE Browser-172.24.10.24</h1>' > /usr/share/nginx/iebrowser/index.html
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx04 ~]# cat > /etc/nginx/conf.d/iebrowser.conf <<EOF
  2 server {
  3     listen  88;
  4     server_name 172.24.10.24;
  5     location / {
  6         root   /usr/share/nginx/iebrowser;
  7         index  index.html;
  8         access_log  /var/log/nginx/iebrowser.access.log  main;
  9         error_log   /var/log/nginx/iebrowser.error.log  warn;
 10     }
 11 }
 12 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@nginx02 ~]# nginx -s reload			#重载配置文件
  3 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  4 [root@nginx03 ~]# nginx -s reload			#重载配置文件
  5 [root@nginx04 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  6 [root@nginx04 ~]# nginx -s reload			#重载配置文件
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@client ~]# curl 172.24.10.22:89
  2 <h1>Firefox-172.24.10.22</h1>
  3 [root@client ~]# 
  4 [root@client ~]# curl 172.24.10.22:88
  5 <h1>Chrmoe-172.24.10.22</h1>
  6 [root@client ~]# curl 172.24.10.22:89
  7 <h1>Firefox-172.24.10.22</h1>
  8 [root@client ~]# curl 172.24.10.23:88
  9 <h1>iPhone-172.24.10.23</h1>
 10 [root@client ~]# curl 172.24.10.23:89
 11 <h1>Android-172.24.10.23</h1>
 12 [root@client ~]# curl 172.24.10.24:88
 13 <h1>IE Browser-172.24.10.24</h1>

6.2 反向代理配置

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# mkdir /usr/share/nginx/type/
  2 [root@nginx01 ~]# echo '<h1>Type-172.24.10.21</h1>' > /usr/share/nginx/type/index.html
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/type.conf
  2 upstream chrome {
  3     server 172.24.10.22:88;
  4 }
  5 upstream firefox {
  6     server 172.24.10.22:89;
  7 }
  8 upstream iphone {
  9     server 172.24.10.23:88;
 10 }
 11 upstream android {
 12     server 172.24.10.23:89;
 13 }
 14 upstream iebrowser {
 15     server 172.24.10.24:88;
 16 }
 17 
 18 server {
 19     listen  80;
 20     server_name  type.linuxds.com;
 21     access_log  /var/log/nginx/type.access.log  main;
 22     error_log   /var/log/nginx/type.error.log  warn;
 23     proxy_set_header   Host             $host;
 24     proxy_set_header   X-Real-IP        $remote_addr;
 25     proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
 26     client_max_body_size       10m;	#允许客户端请求的最大单文件字节数
 27     client_body_buffer_size    128k;	#缓冲区代理缓冲用户端请求的最大字节数
 28     proxy_connect_timeout      300;	#nginx跟后端服务器连接超时时间(代理连接超时)
 29     proxy_send_timeout         300;	#后端服务器数据回传时间(代理发送超时)
 30     proxy_read_timeout         300;	#连接成功后,后端服务器响应时间(代理接收超时)
 31     proxy_buffer_size          4k;		#设置代理服务器(nginx)保存用户头信息的缓冲区大小
 32     proxy_buffers              4 32k;	#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
 33     proxy_busy_buffers_size    64k;	#高负荷下缓冲大小(proxy_buffers*234     proxy_temp_file_write_size 64k;	#设定缓存文件夹大小,大于这个值,将从upstream服务器传
 35     location / {
 36         root  /usr/share/nginx/type/;
 37         index index.html;
 38 
 39         if ($http_user_agent ~* "chrome"){
 40                 proxy_pass http://chrome;
 41                 }
 42         if ($http_user_agent ~* "firefox"){
 43                 proxy_pass http://firefox;
 44                 }
 45         if ($http_user_agent ~* "android"){
 46                 proxy_pass http://android;
 47                 }
 48         if ($http_user_agent ~* "iphone"){
 49                 proxy_pass http://iphone;
 50                 }
 51         if ($http_user_agent ~* "MSIE"){
 52                 proxy_pass http://iebrowser;
 53                 }
 54     }
 55 }
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload			#重载配置文件

6.3 确认验证

不同浏览器分别访问:http://type.linuxds.com/

七 反向代理及缓存

7.1 环境预设

主机

IP

备注

nginx01

172.24.10.21

反向代理及缓存服务器

nginx02

172.24.10.22

后端RS01

nginx03

172.24.10.23

后端RS01

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# mkdir /usr/share/nginx/cache/
  2 [root@nginx02 ~]# echo '<h1>Cache-172.24.10.22</h1>' > /usr/share/nginx/cache/index.html
  3 
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/cache.conf <<EOF
  2 server {
  3     listen  90;
  4     server_name 172.24.10.22;
  5     location / {
  6         root   /usr/share/nginx/cache;
  7         index  index.html;
  8         access_log  /var/log/nginx/cache.access.log  main;
  9         error_log   /var/log/nginx/cache.error.log  warn;
 10     }
 11 }
 12 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx02 ~]# ll /usr/share/nginx/cache
  2 total 16K
  3 -rw-r--r-- 1 root root  28 Jun 23 22:33 index.html
  4 -rw-r--r-- 1 root root 11K Jun 23 22:34 nginx.jpg	#上传一张测试图片
  5 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  6 [root@nginx02 ~]# nginx -s reload			#重载配置文件
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx03 ~]# mkdir /usr/share/nginx/cache/
  2 [root@nginx03 ~]# echo '<h1>Cache-172.24.10.23</h1>' > /usr/share/nginx/cache/index.html
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/cache.conf <<EOF
  2 server {
  3     listen  90;
  4     server_name 172.24.10.23;
  5     location / {
  6         root   /usr/share/nginx/cache;
  7         index  index.html;
  8         access_log  /var/log/nginx/cache.access.log  main;
  9         error_log   /var/log/nginx/cache.error.log  warn;
 10     }
 11 }
 12 EOF
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx03 ~]# ll /usr/share/nginx/cache
  2 total 16K
  3 -rw-r--r-- 1 root root  28 Jun 23 22:33 index.html
  4 -rw-r--r-- 1 root root 11K Jun 23 22:34 nginx.jpg	#上传一张测试图片
  5 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  6 [root@nginx03 ~]# nginx -s reload			#重载配置文件

7.2 配置代理及缓存

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# mkdir -p /data/cache			#创建缓存目录
  2 [root@nginx01 ~]# mkdir -p /data/cache_temp		#创建缓存临时目录
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# vi /etc/nginx/nginx.conf		#追加如下代码日志记录
  2 ……
  3 log_format  main  '[$remote_addr]-[$remote_user]-[$time_local]-["$request"]'
  4                       '[$status]-[$body_bytes_sent]-["$http_referer"]'
  5                       '["$http_user_agent"]-["$http_x_forwarded_for"]';
  6                       '[$upstream_addr]-[$upstream_status]-[$request_time]-[$upstream_response_time]'
  7 ……
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/cache.conf
  2 upstream cache {
  3 server 172.24.10.22:90;
  4 server 172.24.10.23:90;
  5     }
  6 
  7 proxy_temp_path /data/cache_temp;
  8 proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:20m max_size=10g inactive=60m use_temp_path=off;
  9 
 10 server {
 11     listen          80;
 12     server_name     cache.linuxds.com;
 13     access_log  /var/log/nginx/cache.access.log  main;
 14     error_log   /var/log/nginx/cache.error.log  warn;
 15 
 16     location / {
 17         expires 3d;
 18         add_header  Nginx-Cache "$upstream_cache_status";	#增加一个头信息
 19 
 20         proxy_cache mycache;			        #调用定义的cache zone
 21         proxy_pass  http://cache;		                #配置反向代理
 22         proxy_set_header  Host      $host;
 23         proxy_set_header  X-Real-IP $remote_addr;
 24         proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 25 
 26         proxy_cache_valid  200 302 304 2h;	               #200302304头信息过期时间为2小时
 27         proxy_cache_valid  any 10m;		               #其他过期时间10分钟
 28         proxy_cache_key    $host$request_uri$uri$is_args$args;	#定义缓存的key
 29         proxy_cache_bypass $cookie_nocache $arg_comment;	        #配置不缓存
 30         proxy_no_cache $arg_nocache;				#配置不缓存
 31         proxy_cache_lock on;
 32         proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;	#一个服务报错请求下一个
 33     }
 34     location ~ /purge(/.*) {
 35         allow       127.0.0.1;
 36         allow       172.24.10.0/24;
 37         deny        all;
 38         proxy_cache_purge mycache $1$is_args$args;
 39     }
 40 }
代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
  2 [root@nginx01 ~]# nginx -s reload			#重载配置文件

配置释义:

proxy_cache_path:配置缓存目录,文件目录层级2级,空间名字20m大小,目录最大大小10g(超过启动nginx自己的淘汰规则),在60分钟的时间内没有被访问就会被清理,并且不使用临时目录。

proxy_no_cache:部分不设置缓存,cookie_nocache上面配置的参数,cookie_nocache不为0或者空,那么是不会进行缓存的。

proxy_cache_lock on:如果多个客户端请求的文件不在缓存(MISS),只有第一个这些请求是通过原始服务器的。

提示:proxy_no_cache和proxy_cache_bypass类似,其差异是proxy_no_cache用于控制什么情况下响应不被缓存。比如配置“proxy_no_cache$args_nocache”,如果带的nocache参数值至少有一个不为空或者为0,则响应将不被缓存。而proxy_cache_bypass,控制什么情况不使用缓存的内容,而是直接到后端获取最新的内容。如果命中,则$upstream_cache_status为BYPASS。

延伸:

upstream_cache_status状态如下:

  • MISS:未命中缓存,即在缓存中找不到响应,因此从原始服务器获取响应。然后缓存响应;
  • HIT:命中缓存,响应将直接来自有效的缓存;
  • EXPIRED:缓存已经过期,响应包含来自原始服务器的新内容;
  • STALE:命中了陈旧的缓存,因为源服务器未正确响应但proxy_cache_use_stale已配置。
  • UPDATING:内容陈旧,因为条目当前正在更新以响应先前的请求,并且proxy_cache_use_stale updating已配置;
  • REVALIDATED:Nginx验证了陈旧的内容依然有效;
  • BYPASS:响应是从原始服务器获得。

注意:使用proxy_cache_purge清除缓存,必须提前安装ngx_cache_purge模块,安装模块必须基于编译安装的Nginx。

7.3 确认验证

客户端访问测试:

代码语言:javascript
代码运行次数:0
运行
复制
  1 [root@client ~]# curl -I http://cache.linuxds.com/nginx.jpg

结论:第一次访问会出现MISS,没有命中缓存,第二次访问即可直接命中缓存。

参考文档:https://blog.csdn.net/h13140995776/article/details/101174283。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
scrapy框架
scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider qiubai www.qiushibaike.com)
全栈程序员站长
2022/09/07
1.7K0
scrapy框架
爬虫之scrapy框架
  何为框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。scrapy框架是一个为了爬取网站数据,提取数据的框架,我们熟知爬虫总共有四大部分,请求、响应、解析、存储,scrapy框架都已经搭建好了。scrapy是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架,scrapy使用了一种非阻塞的代码实现并发的,结构如下:
py3study
2020/01/17
1.3K0
scrapy全站爬取
需求:爬取站长素材的高清图片的爬取https://sc.chinaz.com/tupian/
用户8447427
2022/08/18
8580
scrapy全站爬取
python爬虫–scrapy(再探)
— 图片:xpath解析出图片src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据。
全栈程序员站长
2021/04/21
6870
python爬虫–scrapy(再探)
Python Scrapy框架之CrawlSpider爬虫
一般写爬虫是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request。
Python知识大全
2020/02/13
6030
Python Scrapy框架之CrawlSpider爬虫
Scrapy Crawlspider的详解与项目实战
回顾上一篇文章,我们大多时间都是在寻找下一页的url地址或者是内容的url地址上面,我们的大体思路是这样的:
咸鱼学Python
2019/10/09
2.1K0
Python爬虫之scrapy框架学习
scrapy安装步骤 pip install wheel 下载twisted : 地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted (选择对应的版本) 安装twisted : pip install aiohttp-3.8.1-cp38-cp38-win_amd64.whl pip install pywin32 pip install scrapy 测试终端输入: scrapy 创建工程 终端输入: scrapy startproject fi
shaoshaossm
2022/12/26
7400
Scrapy入门案例——腾讯招聘(CrawlSpider升级)
需求和上次一样,只是职位信息和详情内容分开保存到不同的文件,并且获取下一页和详情页的链接方式有改动。
100000860378
2018/09/13
8190
Scrapy入门案例——腾讯招聘(CrawlSpider升级)
Scrapy框架的使用之Scrapy通用爬虫
通过Scrapy,我们可以轻松地完成一个站点爬虫的编写。但如果抓取的站点量非常大,比如爬取各大媒体的新闻信息,多个Spider则可能包含很多重复代码。 如果我们将各个站点的Spider的公共部分保留下来,不同的部分提取出来作为单独的配置,如爬取规则、页面解析方式等抽离出来做成一个配置文件,那么我们在新增一个爬虫的时候,只需要实现这些网站的爬取规则和提取规则即可。 本节我们就来探究一下Scrapy通用爬虫的实现方法。 一、CrawlSpider 在实现通用爬虫之前,我们需要先了解一下CrawlSpider
崔庆才
2018/06/25
2.7K0
Scrapy爬虫框架Spiders爬虫脚本使用技巧
我们都知道Scrapy是一个用于爬取网站数据、提取结构化数据的Python框架。在Scrapy中,Spiders是用户自定义的类,用于定义如何爬取某个(或某些)网站,包括如何执行爬取(即跟踪链接)以及如何从页面中提取结构化数据(即爬取项)。至于如何定义Spiders爬虫逻辑和规则可以看看我下面总结的经验。
华科云商小徐
2025/06/03
1640
普通爬虫有啥意思,我写了个通用Scrapy爬虫
除了钱,大家还比较喜欢什么?当然是全能、万能和通用的人或事物啦,例如:全能、什么都会的员工、万能钥匙、通用爬虫等等。今天我们学习Scrapy通用爬虫,利用Scrapy通用爬虫来获取美食杰网站[1]。
Python进击者
2022/01/11
1.2K0
普通爬虫有啥意思,我写了个通用Scrapy爬虫
Scrapy框架-CrawlSpider
它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合
py3study
2020/01/17
6540
python爬虫入门(八)Scrapy框架之CrawlSpider类
CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpider是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。 CrawSpider源码详细解析 class CrawlSpider(Spider)
zhang_derek
2018/04/11
2.3K0
python爬虫入门(八)Scrapy框架之CrawlSpider类
爬虫系列(13)Scrapy 框架-CrawlSpider、图片管道以及下载中间件Middleware。
首先在说下Spider,它是所有爬虫的基类,而CrawSpiders就是Spider的派生类。对于设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。
野原测试开发
2019/07/10
1.4K0
三、scrapy后续 LinkExtractorsrules Logging发送POST请求内置设置参考手册
CrawlSpiders 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com 我们通过正则表达式,制作了新的url作为Request请求参数,现在我们可以用这个... class scrapy.spiders.CrawlSpider 它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制
酱紫安
2018/04/16
2.1K0
CrawlSpider(规则爬虫)和Spider版爬虫
1.规则爬虫--scrapy genspider -t crawl Question wz.sun0769.com
用户2337871
2019/07/19
6530
Scrapy框架中crawlSpider的使用——爬取内容写进MySQL和拉勾网案例
Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。该案例采用的是CrawlSpider类实现爬虫进行全站抓取。
菲宇
2019/06/13
1.3K0
Python爬虫之分布式爬虫
搭建分布式机群,让其对一组资源进行分布式联合爬取 提升爬取效率 实现分布式: pip install scrapy-redis scrapy-redis 组件的作用: 给原生的scrapy框架提供可以被共享的管道和调度器 ---- 分布式爬虫 实现步骤: scrapy startproject firstdemo scrapy genspider -t crawl xxx [www.xxx.com](http://www.xxx.com/) 修改当前爬虫文件 导包 : from scrapy_r
shaoshaossm
2022/12/26
5041
爬虫课堂(二十八)|Spider和CrawlSpider的源码分析
我在爬虫课堂(二十五)|使用CrawlSpider、LinkExtractors、Rule进行全站爬取章节中说将对CrawlSpider的源码进行一个讲解,这篇文章就是来还账的,你们如果觉得好请点个赞。 一、Spider源码分析 在对CrawlSpider进行源码分析之前,先对Spider源码进行一个分析。 1.1、Spider介绍及主要函数讲解 Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(是否跟进链接)以及如何从网页的内容中提取结构化数据(提取Item)。 Spider就是定义爬取的
黄小怪
2018/05/21
1.9K0
Python:CrawlSpiders
上一个案例中,我们通过正则表达式,制作了新的url作为Request请求参数,现在我们可以换个花样...
Lansonli
2021/10/09
3750
推荐阅读
相关推荐
scrapy框架
更多 >
目录
  • 一 Nginx代理
    • 1.1 Nginx代理概述
    • 1.2 Nginx代理模式
    • 1.3 正向代理
    • 1.4 反向代理
    • 1.5 透明代理
    • 1.6 常见代理软件
  • 二 代理配置项
    • 2.1 配置语法
  • 三 配置正向代理
    • 3.1 正向代理配置
  • 四 反向代理配置
    • 4.1 环境预设
    • 4.2 配置反向代理
    • 4.3 测试反向代理
    • 4.4 其他代理配置语句
  • 五 四层代理配置
    • 5.1 四层代理
    • 5.2 环境预设
    • 5.3 配置四层代理
    • 5.4 确认验证
  • 六 按类型反向代理配置
    • 6.1 环境预设
    • 6.2 反向代理配置
    • 6.3 确认验证
  • 七 反向代理及缓存
    • 7.1 环境预设
    • 7.2 配置代理及缓存
    • 7.3 确认验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档