Nginx反向代理和缓存

admin2024-04-03  0

一、Nginx反向代理

1.调度和代理的区别:

1.调度基于内核层面,代理基于应用层面

2.代理必须实现一手托两家

3.调度不需要监听任何端口,不需要工作任何应用程序,代理需要工作和上游服务器一模一样的进程

4.调度没有并发上限,代理最高65535

5.调度只实现报文转发,代理必须实现重构报文

6.通常情况下代理会关联缓存,调度不会(haproxy不支持缓存)

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

1.正向代理:为客户端提供服务的代理,实现访问控制;明确知道访问的是代理服务器

2.反向代理:为服务端提供服务的代理;客户端不知道访问的是代理服务器

3.透明代理:通过某些技术手段nat转换,或者通过某些应用程序修改你的浏览器,让你不察觉你访问的是代理服务器,但是一样可以为客户端提供代理服务。如:squid

Nginx反向代理和缓存,第1张

2.代理经典架构体系图:

Nginx反向代理和缓存,第2张

ht_core:web服务器模块,实现自身web服务器功能;基于kv存储的方式缓存到磁盘中,k缓存到内存区、v是以hash码存储到磁盘区。

ht_upstream:集群模块,代理的集群功能,应用程序服务器(python:uwsgi);本质:调用ht_proxy模块,实现代理后台多个web服务器资源达到负载均衡

ht_proxy:普通代理模块,普通代理功能

ht_fastcgi:异构代理模块 ,关联后台php、Python

工作进程走的是事件驱动、复用I/O模型、异步非阻塞I/O模型(用户缓存)

【注】:代理服务器副作用非常大,错误也会缓存,但是可以基于修剪缓存工具进行修剪(本质就是把hash码删除);也可以把缓存时间设置短一些。

3.Nginx集群

①Nginx除了是一个强大的静态web服务器,也是强大的负载均衡器,它通过应用层完成负载均衡,构建成负载均衡集群的架构。Nginx的集群本质上是基于反向代理来实现。

②:基于应用层完成负载--->nginx  proxy

③:upstream server:上游服务器,即被代理服务器所连接的后台真实服务器

nginx缺点:算法少

4.Nginx的代理模块

 upstream模块(ngx_http_upstream、ngx_stream_proxy_module)   

 fastcgi模块(ngx_http_fastcgi)   

 uwsgi模块(ngx_http_uwsgi)  

 proxy模块(ngx_http_proxy):用于单台代理

Nginx反向代理和缓存,第3张

【注】:反向代理可以实现全根代理(完全放弃自己web服务器功能,完全代理后台),也可以实现半根代理 

①:proxy模块

        proxy模块(ngx_http_proxy)

        server {

            listen

            server_name

            location / {

                proxy_pass //粘性工具

            }

        }

以proxy模块配置反向代理,格式:

    location /uri {

        proxy_pass http://upstream_server:port/newuri;       #(可以代理全根,Nginx也可以自己作为web服务器对客户提供服务)

}

例:Nginx反向代理和缓存,第4张

【注】:①如果在代理区域使用正则表达式,代理的的地址不能承接URI,否则为语法错误。

               ②只要能被正则表达式能匹配到,都会将请求调度到对应的代理服务器的URI

                无需考虑前端URI的资源,只需考虑重写后的结果URI

               ③若后端web服务设置主机名虚拟主机,代理转发不会将请求头部进行转发,而是默认                        中心主机代理(解决方案:proxy_set_header Host $http_host;)

               ④上述代理方式,在上游US日志的记录上,之后记录请求的地址,不会记录源客户端的                    IP地址,无法完成用户日志的精准分析。于是需要引用remote_addr这个变量来进行记              录基于源客户端的IP地址的日志,使用proxy_set_header配置方法,来定义remote_addr。

                多层代理记录  X-Forwarder-For $proxy_add_x_forwarded_for

二、Nginx中配置缓存

1.缓存的简介

缓存:缓存数据在内存空间,以kv对进行存储,以hash码进行定位指引。

缓存路径的目录由proxy_cache_path来定义   (定义在httpd上下文)

 优先级:浏览器、代理、服务器

2.定义缓存路径配置方式

定义格式:

proxy_cache_path PATH levels=levels keys_zone=name:size [interactive=time] [max_size=#k|M|G]

定义详解:PATH:缓存路径

                  前Level:级层目录

                  后level:目录名称的字符量

                   Keys_zone:定义键名字和大小

                   Levels=1:2:4

例如:

proxy_cache_path /data/caches levels=1:2 keys_zone=xxhf123_cdn:100m inactive=30m max_size=100m;

代表缓存目录在这个路径下,允许出现二级子目录,一级子目录名称为单个字符,二级子目录为双位字符。

Keys_zone键存储的名称为one和大小为10M。

【注】:缓存目录属主属组必须是nginx

缓存文件示例:/cache/nginx/b/02/c649288d058e4b67c2b30bfbbcf5500b

3.在http段中定义缓存,定义完后在http、server、location中使用proxy_cache进行调用。

(1)定义缓存的其他属性

定义触发缓存的最少访问次数:(默认一次)

格式:proxy_cache_min_uses number;

例如:proxy_cache_min_uses 5;

(2)定义客户端请求缓存的方法

格式:proxy_cache_methods GET |HEAD POST...

默认为GET和HEAD

(3)定义缓存修剪管理

proxy_cache_purge:   编译的时候添加--add-module=/root/ngx_cache_purge-2.3

缓存后过期后重新校验:

proxy_cache_revalidate on | off

跟后端服务器交互发生错误情况下,使用过期的缓存内容响应请求错误请求

proxy_cache_use_stale error timeout | invalid_header | http_500 ......

跟后端服务器交互连接超时情况下,使用过期缓存响应请求

proxy_commect_timeout;

自定义缓存时长

Proxy_cache_valid [code ...] time;

添加代理服务器的地址到首部

add_header X-Via $server_addr;

添加缓存命中状态到报文首部

add_header X_cache_hit $upstream_cache_status;

例:

Nginx反向代理和缓存,第5张

三、 Nginx基于反向代理实现负载均衡

1.upstream负载均衡模块

  【注】:只能定义在http配置段中

配置语法:

        upstream name {

            [ip_hash]    #源地址hash绑定

            server backend1.example.com [weight=5];(权重)

            server 127.0.0.1:8080    max_fails=3 fail_timeout=30s;(表示如果请求上游发生错误3次,超时30s,将连接不上的上游节点下线)

            server backup1.example.com   backup|down;(备份节点,如果需要可以顶上 | 永久下线)

例:表示加权轮询上游被调度的服务器10.10 和10.20

Nginx反向代理和缓存,第6张

【注】: 定义upsteam后,上游服务器在proxy_pass中需要改成upsteam命名的名称

Nginx反向代理和缓存,第7张

 

2. Nginx的调度算法(方法)

rr  wrr(定义upsteam_server的weight)

Ip_hash: 源地址hash,实现session绑定

3.基于sticky实现Session绑定的

ip_hash的源地址绑定方式有很大的副作用,因此通常基于sticky方式来实现绑定。

①:cookie

    upstream backend {

        server backend1.example.com;

        server backend2.example.com;

        sticky cookie srv_id expires=1h domain=.example.com path=/;

        }

4.fastcgi模块(ngx_http_fastcgi)

Nginx默认无法以模块的方式连接php,Fastcgi实现代理不属于http协议,而是必须基于fastcgi协议的默认9000端口进行代理。

我们可以以fpm的方式进行调度fastcgi请求,同时定义PHP自己的fpm工作模式,进行参数设定。

fastcgi模块对应常见配置

①fastcgi pass     将fastcgi请求代理给指定的主机

fastcgi_pass address;(定义在location或者if location配置段中)

例如:fastcgi_pass localhost:9000;

②fastcgi_index    基于fastcgi请求的默认索引页

例如:fastcgi_index index.php

③fastcgi_param    向后端传递的参数

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

④fastcgi请求超时时长 

fastcgi_connect_timeout time;(在http   server   location中定义)

例如:fastcgi_connect_timeout 60s;   #通常不要超过75s

5.定义fastcgi缓存

fastcgi_cache(需要配置在http配置段)

例如:fastcgi_cache_path  /data/nginx/cache levels=1:2 keys_zone=fcgicache:10m inactive=3m max_size=1g;

定义fastcgi缓存页面缓存属性

fastcgi_cache_valid [code ...] time; (可设置在http server location中)

例:

Nginx反向代理和缓存,第8张

 

使用ab压力测试,动态页面缓存未开启和开启之后的对比效果

例如:ab -n 10 -c 2 http://192.168.10.100/index.php

通常情况下,在企业生产环境中,动态网页是否缓存由程序内部代码去定义

 四、LNMP架构搭建 

Nginx和apache不同之处在于,nginx对动态资源的处理能力非常差,并且无法向apache一样以模块装载的方式进行勾连php,

Nginx需要以fpm方式进行连接php,来完成LNMP架构的部署。   LNAMP

部署过程:

①:fastcgi的相关配置:

    LNMP:php启用fpm模型前提,需要Nginx以代理的方式将PHP动态资源的请求交给fastcgi的9000端口进行处理

    fastcgi由单独fpm模块进行处理。在主配置文件中的虚拟主机中,定义fastcgi区域

②:安装php和mysql

③:安装php依赖组件

④:配置php-mysql的勾连

⑤:部署应用验证结构

配置Nginx和Apache的动静分离

①:在企业级web服务应用中,通常Nginx用于纯静态的web服务,部分情况下也可以实现Nginx和apache进行结合,前台静态资源由Nginx进程处理,后台有Apache和PHP进行处理,各司其职,形成Nginx和Apache的动静分离   --->  LNAMP  (目前不常用)

②:Nginx和Apache本质上Nginx作为前端纯静态服务器,Apache作为后端服务器,结合使用PHP,动静分离,实质上实现的是Nginx的反向代理

配置思路:

①:先构建一台nginx的静态web服务器,以代理的方式,基于正则表达式定向到后台的动态apache-php服务器。  LNAMP

如图所示:

Nginx反向代理和缓存,第9张

proxy_pass表示代理给后台的192.168.22.13主机

②:构建一台LAMP架构的主机(步骤略)

③:在LAMP架构内配置动态页面和静态页面,浏览器分别访问静态服务器的动态资源和动态服务器的静态资源,验证动静分离结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!