Nginx之代理服务及缓存

Nginx之代理服务及缓存

1. Nginx代理简述

1.1 什么是正向代理

正向代理(forward proxy)通常指的是客户端和原始服务器之间的代理服务器。当客户端想要从原始服务器获取相应的资源时,客户端会想代理服务器发送请求报文并指定原始服务器,代理服务器在收到客户端请求后,代替客户端向原始服务器发送请求报文,原始服务器将响应报文返回给代理服务器,代理服务器再返回给客户端。该代理服务器即为正向代理服务器

一般正向代理的使用场景是局域网中的客户端无法上网,却希望上网,就需要通过内网中能上网的代理服务器代替其向因特网获取资源,并由其返回给客户端。

正向代理:客户端 <------> 代理服务器 <------> internet <------> 原始服务器

正向代理的代理对象是客户端

1.2 什么是反向代理

反向代理(reverse proxy)通常指的是以代理服务器来接受来自internet的客户端连接请求,然后将请求转发给内网服务器处理,并将内网服务器返回的结果返回给internet上发送请求的客户端。该代理服务器即为反向代理服务器。

正向代理:客户端 <------> internet <------> 代理服务器 <------> 原始服务器

反向代理的代理对象是服务器

2. Nginx反向代理模块详解

Nginx的反向代理模块是ngx_http_proxy_module。在作为web反向代理服务器时,nginx负责接收客户端请求,并能够根据URI、客户端请求报文、参数或其他处理逻辑将用户的请求调度至上游服务器(upstream server)。Nginx在实现reverse proxy时,最重要的指令便是proxy_pass,它能够将location定义的URI代理至上游服务器上。如下面的示例中,location中的URI被替换至上游服务器的/newuri

location /uri {
    proxy_pass       http://10.241.96.104:8000/newuri;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
}

Nginx的如上反向代理机制有两个例外:

1)第一个例外

如果location使用模式匹配定义URI,那么其URI将直接被传递至上游服务器,而不能指定转换为上游服务器上的另一个URI。如下面示例中/uri将被代理为http://10.241.96.1:8000/uri。

location ~ /uri {
    proxy_pass       http://10.241.96.104:8000;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
}

2)第二个例外

如果在location中的proxy_pass之前使用了rewrite重定向,那么,nginx将使用重定向后的URI处理请求,而不再考虑上游服务器定义的URI。如下面示例中,传递给上游服务器的是/index.php?page=$1,而不是/index

location / {
	rewirte /(.*)$ /index.php?page=$1 break;
    proxy_pass       http://10.241.96.104:8000/index;
    proxy_set_header Host      $host;
}

2.1 反向代理常用指令

官方文档URL:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

1)常用配置指令

proxy模块的可用配置指令非常多,它们分别用于定义proxy模块工作时的诸多属性,如连接超时时长、代理时使用http协议版本等。

  • proxy_connect_timeout

    nginx将一个请求发送至upstream server之前等待的最大时长;

  • proxy_cookie_domain

    将upstream server通过Set-Cookie首部设定的domain属性修改为指定的值,其值可以为一个字符串、正则表达式的模式或一个引用的变量;

  • proxy_cookie_path

    将upstream server通过Set-Cookie首部设定的path属性修改为指定的值,其值可以为一个字符串、正则表达式的模式或一个引用的变量;

  • proxy_hide_header

    设定发送给客户端的报文中需要隐藏的首部;

  • proxy_pass

    指定将请求代理至upstream server的URL路径;

  • proxy_set_header

    将发送至upsream server的报文的某首部进行重写;

  • proxy_redirect

    重写location并刷新从upstream server收到的报文的首部;

  • proxy_send_timeout

    在连接断开之前两次发送至upstream server的写操作的最大间隔时长;

  • proxy_read_timeout

    在连接断开之前两次从接收upstream server接收读操作的最大间隔时长;

如下面的示例:

	proxy_redirect off;
	proxy_set_header Host $host;

	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	client_max_body_size 10m;
	client_body_buffer_size 128k;
	proxy_connect_timeout 30;
	proxy_send_timeout 15;
	proxy_read_timeout 15;

2)常用缓存指令

nginx做为反向代理时,能够将来自upstream的响应缓存至本地,并在后续的客户端请求同样内容时直接从本地构造响应报文。

  • proxy_cache zone|off

    定义一个用于缓存的共享内存区域,其可被多个地方调用;缓存将遵从upstream服务器的响应报文首部中关于缓存的设定,如 “Expires”、“Cache-Control: no-cache”、 “Cache-Control: max-age=XXX”、“private"和"no-store” 等,但nginx在缓存时不会考虑响应报文的"Vary"首部。为了确保私有信息不被缓存,所有关于用户的私有信息可以upstream上通过"no-cache" or "max-age=0"来实现,也可在nginx设定proxy_cache_key必须包含用户特有数据如$cookie_xxx的方式实现,但最后这种方式在公共缓存上使用可能会有风险。因此,在响应报文中含有以下首部或指定标志的报文将不会被缓存。
    ​ Set-Cookie
    ​ Cache-Control containing “no-cache”, “no-store”, “private”, or a “max-age” with a non-numeric or 0 value
    ​ Expires with a time in the past
    ​ X-Accel-Expires: 0

  • proxy_cache_key

    $uri设定在存储及检索缓存时用于“键”的字符串,可以使用变量为其值,但使用不当时有可能会为同一个内容缓存多次;另外,将用户私有信息用于键可以避免将用户的私有信息返回给其它用户;

  • proxy_cache_lock

    启用此项,可在缓存未命令中阻止多个相同的请求同时发往upstream,其生效范围为worker级别;

  • proxy_cache_lock_timeout

    proxy_cache_lock功能的锁定时长;

  • proxy_cache_min_uses

    某响应报文被缓存之前至少应该被请求的次数;

  • proxy_cache_path

    定义一个用记保存缓存响应报文的目录,及一个保存缓存对象的键及响应元数据的共享内存区域(keys_zone=name:size),其可选参数有:
    ​ levels:每级子目录名称的长度,有效值为1或2,每级之间使用冒号分隔,最多为3级;
    ​ inactive:非活动缓存项从缓存中剔除之前的最大缓存时长;
    ​ max_size:缓存空间大小的上限,当需要缓存的对象超出此空间限定时,缓存管理器将基于LRU算法对其进行清理;
    ​ loader_files:缓存加载器(cache_loader)的每次工作过程最多为多少个文件加载元数据;
    ​ loader_sleep:缓存加载器的每次迭代工作之后的睡眠时长;
    ​ loader_threashold:缓存加载器的最大睡眠时长;
    ​ 例如:

			proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;
			proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;
			proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;
  • proxy_cache_use_stale

    在无法联系到upstream服务器时的哪种情形下(如error、timeout或http_500等)让nginx使用本地缓存的过期的缓存对象直接响应客户端请求;其格式为:
    ​ proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off

  • proxy_cache_valid [ code …] time

    用于为不同的响应设定不同时长的有效缓存时长,例如:proxy_cache_valid 200 302 10m;

  • proxy_cache_methods [GET HEAD POST]

    为哪些请求方法启用缓存功能;

  • proxy_cache_bypass string

    设定在哪种情形下,nginx将不从缓存中取数据;例如:

  proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
  proxy_cache_bypass $http_pragma $http_authorization;
  • proxy_connect_timeout

    定义与后端服务器建立连接的超时时长;默认为60s,不建议超出75s;

  • proxy_send_timeout

    把请求发送给后端服务器的超时时长;默认为60s;

  • proxy_read_timeout

    等待后端服务器发送响应报文的超时时长;

3. Nginx正向代理配置

server {
    listen       80;

    resolver 10.241.96.7 ipv6=off;
    location / {
        proxy_pass http://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

//客户端使用SwitchySharp浏览器插件配置正向代理

4. Nginx反向代理配置

上游服务器是zabbix server:10.241.96.121,并且上游服务器是LAMP的站点架构,nginx作为代理服务器如下场景配置

示例配置一

        location / {
            proxy_pass http://10.241.96.121;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

访问测试

[root@lbserver ~]# curl -I http://10.241.96.103:82/zabbix/
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 02 Jan 2019 15:09:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Set-Cookie: zbx_sessionid=214c8aed8456c9514b4791e9957d13ca; httponly
Set-Cookie: PHPSESSID=4ctmt8j12978sj7cmh4v3ao110; path=/zabbix/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

在这里插入图片描述

示例配置二

        location / {
            root html;
            index index.html index.htm;
        }

        location ~ /zabbix {
            proxy_pass http://10.241.96.121;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

访问测试

[root@lbserver ~]# curl -I http://10.241.96.103:82/zabbix/
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 02 Jan 2019 15:07:09 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Set-Cookie: zbx_sessionid=80f7add490643c5c6935885fc7ca6bd1; httponly
Set-Cookie: PHPSESSID=60bp2ejd7hujgd1vgvsjttc8n7; path=/zabbix/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

在这里插入图片描述

示例配置三

        location / {
            rewrite /(.*)$ /$1 break;
            proxy_pass http://10.241.96.121/test;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;

        }

访问测试:

[root@lbserver ~]# curl -I http://10.241.96.103:82/zabbix/
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Wed, 02 Jan 2019 15:05:15 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.4.16
Set-Cookie: zbx_sessionid=016f5b6155f1d4b1deeeab732caec000; httponly
Set-Cookie: PHPSESSID=lepogt22l0b9rpgrou6r6trig3; path=/zabbix/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

在这里插入图片描述

5. Nginx反向代理缓存配置

## 缓存配置
[root@lbserver ~]# cat /etc/nginx/nginx.conf
http {
	...
	
    proxy_cache_path	/cache/mycache levels=2:2 keys_zone=mycache:32m inactive=24h max_size=1g;
	
	...

    server {
        listen       82;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://10.241.96.121;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;

            proxy_cache		mycache;
            proxy_cache_valid	200 1h;
            proxy_cache_valid	301 302 10m;
            proxy_cache_valid	any 1m;
            proxy_cache_use_stale	error timeout invalid_header updating http_500 http_502 http_503 http_504;

            proxy_connect_timeout	30s;
            proxy_send_timeout		30s;
            proxy_read_timeout		30s;
        }
	}
}

## 创建缓存目录,并修改属主属组为nginx
[root@lbserver nginx]# mkdir /cache/mycache -pv
mkdir: created directory ‘/cache’
mkdir: created directory ‘/cache/mycache’
[root@lbserver nginx]# chown -R nginx:nginx /cache/

访问测试之后,/cache/mycache目录已经缓存响应的缓存文件;

[root@lbserver nginx]# tree /cache/mycache/
/cache/mycache/
├── 5d
│   └── e9
│       └── e3853a16eef4c318c1884f98799fe95d
├── 60
│   └── 12
│       └── 726a69a4bd5162f9852731cf461f1260
├── 65
│   └── e0
│       └── 108e280ae84be248571aa76b26bde065
├── 6a
│   └── 0c
│       └── 11ec30c52554d28a6f8df373e5710c6a
├── 93
│   └── 31
│       └── 2b3c006ae7de6f499050603ab7d93193
└── ea
    └── 23

注意:对于动态内容,一般情况下,需要开发自行定义需要缓存哪些页面;因为某些动态页面是需要不停的更新的,如果缓存后,用户访问的可能是旧的数据。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值