02--nginx代理缓存

前言:比较常用的用法反向代理,和缓存的一些操作,用虚拟环境复刻出来,里面参数不用详细记录,用作复习,使用时直接查找即可。环境搭建过程参考前一篇文章nginx基础

1、基础环境

|-----------------|-------------|------------------------|
| IP | 角色 | 作用 |
| 192.168.189.143 | 编号7:网站服务器 | nginx网站主页liumuquan.com |
| 192.168.189.144 | 编号8:图形客户端 | 图形化安装用于模拟客户访问 |
| 192.168.189.146 | 编号9:代理缓存服务器 | nginx代理缓存配置演示 |

nginx安装过程,域名解析配置,网站部署过程参考前文。

2、代理

2.1、代理概念

正向代理服务器和反向代理服务器是两种常见的代理服务器类型。

正向代理服务器: 正向代理服务器作为位于客户端和目标服务器之间的中间服务器,代表客户端发送请求,并将响应转发给客户端。客户端需要通过配置代理服务器来使用正向代理功能。代理服务器会隐藏客户端的真实IP地址,提供隐私保护和访问控制等功能。类比来说,正向代理就像是一个人在代表其他人进行行动,比如有一个中间人去购买商品并带回来。

反向代理服务器: 反向代理服务器作为位于目标服务器和客户端之间的中间服务器,代表目标服务器接收请求,并将响应转发给客户端。客户端无需知道真实的目标服务器,而是向反向代理发送请求。反向代理服务器可以实现负载均衡、缓存、SSL 终端等功能,提高性能和安全性。类比来说,反向代理就像是一个餐馆的前台,接收客人的请求,将请求传递给后台厨房,并将制作好的菜品送回给客人。

区别:

  1. 定位不同:正向代理服务器定位于客户端和目标服务器之间,而反向代理服务器定位于目标服务器和客户端之间。
  2. 配置方式不同:客户端需要单独配置代理服务器才能使用正向代理,而对于反向代理,客户端无需知道真实的目标服务器,直接发送请求给反向代理服务器即可。
  3. 功能不同:正向代理主要用于提供隐私保护和访问控制,隐藏客户端的真实IP地址;反向代理主要用于负载均衡、缓存和提高性能等。
  4. 部署位置不同:正向代理通常部署在客户端所在的网络中,而反向代理通常部署在目标服务器所在的网络中。

总结比喻: 可以将正向代理比作一个个人助手,代表他人完成任务,比如购买商品。反向代理则类似于一家餐馆的前台,接待客人的请求并将其传递给后台厨房,并将制作好的菜品送回给客人。

2.2、nginx代理配置

模块名称:ngx_http_proxy_module

2.2.1、网站服务器

此小节操作在编号7:网站服务器(143)上完成

配置网站配置

bash 复制代码
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  liumuquan.com;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page  404              /404.html;
    location = /404.html{
	root /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

配置主页显示

html 复制代码
[root@localhost ~]# cat /usr/share/nginx/html/index.html 
<!DOCTYPE html>
<html>
<head>
<title>TEST FROMLIUMUQUAN</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>THIS IS LIUMUQUAN</h1>
<p>this is num7 server</p>
<p>ipaddress is 192.168.189.143</p>
<p>THIS is liumuquan.com</p>
</body>
</html>

2.2.2、客户端访问网站服务器

使用144访问143网站,如下图所示

2.2.3、代理服务器

此小节操作在编号9:代理缓存服务器(146)上完成

安装启动nginx

网络环境配置如下

bash 复制代码
[root@localhost nginx]# systemctl restart nginx
[root@localhost nginx]# systemctl disable firewalld.service 
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@localhost nginx]# systemctl stop firewalld.service 
[root@localhost nginx]# vim /etc/selinux/config 
[root@localhost nginx]# setenforce 0

# 此处关闭所有安全机制,用于演示,生产环境中请勿如此操作

具体nginx反向代理配置如下

bash 复制代码
[root@localhost nginx]# cat /etc/nginx/conf.d/default.conf 
server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / { 

proxy_pass http://192.168.189.143:80;
#定义被代理的服务器地址和端口
proxy_redirect default;
#设置在代理响应中重写与代理服务器相关的头部信息。这里暂时无用,一般用在端口修改后

proxy_set_header Host $http_host;
#设置传递给后端服务器的 HTTP 头部信息,将客户端的 Host 头部信息传递给后端服务器
proxy_set_header   X-Real-IP $remote_addr;
#设置传递给后端服务器的 HTTP 头部信息,将客户端的真实 IP 地址传递给后端服务器
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
#设置传递给后端服务器的 HTTP 头部信息,将客户端的原始 IP 地址传递给后端服务器,可以包含多个 IP 地址

proxy_connect_timeout 30;
#设置与后端服务器建立连接的超时时间,单位为秒
proxy_send_timeout 60;
#设置向后端服务器发送请求的超时时间,单位为秒
proxy_read_timeout 60;
#设置从后端服务器读取响应的超时时间,单位为秒

proxy_buffering on;
#启用或禁用代理缓冲
proxy_buffer_size 32k;
#设置单个缓冲区的大小设置单个缓冲区的大小
proxy_buffers 4 128k;
#设置用于保存响应的内存块数和每块的大小
proxy_busy_buffers_size 256k;
#设置当响应速度慢时,Nginx 使用的最大内存量
proxy_max_temp_file_size 256k;
#设置在代理过程中可以创建的临时文件的最大大小
        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
#把原页面注释掉
    }

2.2.4、客户端访问代理服务器

使用144访问146,显示143网站内容,如下图所示

3、缓存

Nginx 缓存是一种机制,用于在代理服务器上缓存响应内容,以便在后续请求中快速返回相同的内容,从而减轻后端服务器的负担并提高网站性能。

模块名称:ngx_http_proxy_module

3.1、缓存类型

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

3.2、nginx缓存配置

继续使用上面的环境

3.2.1、nginx总文件配置

在146上操作编辑/etc/nginx/nginx.conf

bash 复制代码
[root@localhost nginx]# vim /etc/nginx/nginx.conf 
[root@localhost nginx]# cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {

proxy_cache_path /app/liumuquan/cache levels=1:2 keys_zone=proxy_cache:10m max_size=10g inactive=60m use_temp_path=off;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

配置部分为

proxy_cache_path /app/liumuquan/cache levels=1:2 keys_zone=proxy_cache:10m max_size=10g inactive=60m use_temp_path=off;

参数详解

  1. proxy_cache_path:指令用于定义代理缓存路径,后面紧跟着路径名和选项。

  2. /app/liumuquan/cache :这里指定了代理缓存的路径,即缓存数据将被存储在 /app/liumuquan/cache 目录下。这个路径可以根据实际需求进行修改。

  3. levels=1:2:这个选项指定了缓存目录结构的层次。在这里,表示将缓存数据分散存储在两级目录结构中,这有助于提高文件查找效率。

  4. keys_zone=proxy_cache:10m :通过 keys_zone 选项指定了一个内存区域用来存储缓存键和元数据。proxy_cache 是内存区域的名称,10m 表示分配给这个内存区域的大小为 10MB。(记录url的)

  5. max_size=10g:这个选项指定了缓存的最大大小为 10GB。一旦缓存大小达到设定的最大值,Nginx 将根据缓存策略清理缓存项。(记录网页内容的)

  6. inactive=60m:表示缓存项在指定时间内没有被访问时会被标记为"不活跃",默认为 10 分钟。在本例中,设置为 60 分钟,意味着缓存项在 60 分钟内没有被访问将被认为是不活跃的,会被从内存中删除。

  7. use_temp_path=off :这个选项表示禁用临时路径。默认情况下,Nginx 会使用一个临时路径来存储正在传输的响应数据,然后再将其移动到缓存路径。通过设置为 off,可以直接将响应数据存储在缓存路径中,提高性能。(建议不要开,硬盘存储很慢)

3.3.2、默认网页文件配置

bash 复制代码
[root@localhost nginx]# vim /etc/nginx/conf.d/default.conf  
[root@localhost nginx]# cat /etc/nginx/conf.d/default.conf  
server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {

proxy_pass http://192.168.189.143:80;
proxy_redirect default;

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;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;

proxy_cache proxy_cache;   #使用前面定义的proxy_cache的对应缓存配置
proxy_cache_valid 200 304 12h; #状态码为 200 和 304 的请求,缓存的有效期为 12 小时
proxy_cache_valid any 10m;  #除了 200 和 304,缓存的有效期为 10 分钟

proxy_cache_key $host$uri$is_args$args;
#请求的缓存的关键字定义方式为 主机 请求地址 传递的参数 参数的变量

add_header  Nginx-Cache "$upstream_cache_status";  
#追加头部,用来返回到浏览器的cache属性是否缓存告知信息来源

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
#如果出现连接错误、超时、无效头部或者特定的 HTTP 状态码(如 500、502、503、504),Nginx 将会尝试向下一个后端服务器发起请求,而不是中断连接


        #root   /usr/share/nginx/html;
        #index  index.html index.htm;
    }

3.3.3、建立缓存文件夹

bash 复制代码
[root@localhost nginx]# mkdir -p /app/liumuquan/cache
[root@localhost nginx]# systemctl restart nginx


配置完成后重启报错可以查看日志或使用nginx -t 排错

3.3.4、客户端访问缓存服务器

首先在网页主目录建立一个全新的文档,保证不可能出现缓存,此操作在编号7:网站服务器(143)上完成

bash 复制代码
[root@localhost ~]# cp 1.jpg /usr/share/nginx/html/
[root@localhost ~]# ls /usr/share/nginx/html/
1.jpg  404.html  404.jpg  50x.html  index.html

使用客户端144访问缓存服务器,查看nginx-cache属性

第一次访问如下图所示

第二次访问如下图所示

3.3、缓存清理

清理 Nginx 缓存通常是通过删除缓存文件或者利用 Nginx 提供的相关指令来实现的。以下是几种常见的清理 Nginx 缓存的方法:

  1. 手动删除缓存文件

    • 手动删除 Nginx 缓存目录中的文件是一种简单直接的方法。你可以通过文件管理器或者命令行操作来删除指定目录下的缓存文件。缓存目录的位置通常在 Nginx 配置文件中定义的 proxy_cache_path 指令中。
    • 例如,如果缓存路径是 /app/liumuquan/cache,你可以通过执行命令 rm -rf /app/liumuquan/cache/* 来删除该目录下的所有缓存文件。
  2. 使用 Nginx 提供的 proxy_cache_purge 模块

    • Nginx 的 proxy_cache_purge 模块可以用于通过 HTTP 请求方式清理缓存。要使用该模块,首先需要在 Nginx 配置中启用该模块,并配置允许的 IP 地址。
    • 然后,在需要清理缓存的地方,你可以发送特定的 HTTP 请求来触发 Nginx 清理缓存。例如,可以使用 curl 命令发送一个 PURGE 请求,指定需要清理缓存的 URI。
  3. 定期清理策略

    • 可以设置定期任务(例如 cron 任务),周期性地清理 Nginx 缓存。这可以通过在系统中设置一个定时任务,定期执行清理缓存的命令来实现。
    • 例如,可以创建一个 cron 任务,在每天的凌晨执行清理缓存的命令,以确保缓存文件保持在合理的大小。

无论采用哪种方法,都需要谨慎操作,以免误删重要文件或者造成不必要的性能问题。最好在生产环境中进行缓存清理操作前进行测试,以确保其不会对系统造成不良影响。

相关推荐
正在走向自律1 小时前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl1 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
青木沐1 小时前
Jenkins介绍
运维·jenkins
WTT00112 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
了一li2 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
码农君莫笑3 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio