0


配置 Nginx 缓存

Nginx 缓存

Nginx 不仅仅是一个 Web 服务器,它还可以作为一个缓存服务器使用。通过 Nginx 缓存,可以对一些静态资源或者数据更新频率较低的后端服务做缓存,降低静态资源或后端服务的响应时间,同时也会降低后端的负载。

在这篇文章中,我们将介绍如何通过 Nginx 对一个数据更新频率较低的后端服务做缓存。

操作步骤

  1. 修改 Nginx 配置文件,在 http 上下文中使用 proxy_cache_path 指令创建 keys zone,即创建一块共享内存空间,用于存储缓存数据的 active key;同时,指定一个目录,用于存储缓存的数据。
  2. 在 http、server、location 上下文中,使用 proxy_cache 指令,指定要使用的 keys zone。
  3. 在 http、server、location 上下文中,使用 proxy_cache_valid 指令,指定针对哪些返回码的响应做缓存,以及缓存多长时间。

示例

操作环境:Ubuntu 18.04

假设我们要对一个 6081 端口的后端服务做缓存,Nginx 配置示例如下:

# nginx-cache.conf
# 创建 keys zone —— test-cache,并设置 1MB 的共享内存空间
# 指定缓存数据保存在 /tmp/nginx-cache 目录下
proxy_cache_path /tmp/nginx-cache keys_zone=test-cache:1m use_temp_path=off;

server {
    listen  12345;

    location / {
        proxy_cache  test-cache;
        # 只缓存状态码是 200 的响应,缓存时间为 10 分钟
        proxy_cache_valid 200 10m;

        proxy_pass http://localhost:6081;
    }
}

6081 端口的服务代码(golang)如下:

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    // GET /ping?param=XXX
    r.GET("/ping", func(c *gin.Context) {
        param := c.Query("param")
        c.JSON(http.StatusOK, gin.H{
            "param": param,
        })
    })

    r.Run(":6081")
}

将上述 Nginx 配置文件放到 /etc/nginx/conf.d/ 目录下并 reload nginx 服务,同时运行上面的程序后,可以多次执行如下命令,并查看 6081 端口服务的日志,以确认 nginx cache 是否配置成功:

curl -s http://SERVER-IP:12345/ping?param=778

如果只在第一次运行上述 curl 命令时,6081 端口服务产生访问日志,紧接着的几次 curl 命令,6081 端口服务都没有产生访问日志,则表示 nginx cache 配置成功了。除第一次的 curl 请求到达了 6081 端口的服务,剩余的几次请求都通过 nginx cache 直接返回了。

缓存 POST 请求

上面的 Nginx Cache 配置,只针对 GET、HEAD 请求有效,如果想要缓存 POST 请求的响应的话,还需要在 Nginx 配置中做如下操作:

  1. 在 http、server、location 上下文中使用 proxy_cache_methods 指令,并在该指令中指定 POST 参数。
  2. 在 http、server、location 上下文中使用 proxy_cache_key 指令,并在该指令的参数中添加** $request_uri** 变量

缓存 POST 请求的示例

操作环境:Ubuntu 18.04

假设我们要对一个 6081 的后端服务做缓存,Nginx 配置示例如下:

# nginx-cache-support-post.conf
# 创建 keys zone —— test-cache,并设置 1MB 的共享内存空间
# 指定缓存数据保存在 /tmp/nginx-cache 目录下
proxy_cache_path /tmp/nginx-cache keys_zone=test-cache:1m use_temp_path=off;

server {
    listen  12345;

    location / {
        proxy_cache  test-cache;
        # 只缓存状态码是 200 的响应,缓存时间为 10 分钟
        proxy_cache_valid 200 10m;
        # 缓存 GET、HEAD、POST 方法请求的响应
        proxy_cache_methods GET HEAD POST;
        # 将 $request_body 变量添加到 proxy_cache_key 指令中
        proxy_cache_key "$scheme://$proxy_host$uri$is_args$args|$request_body";

        proxy_pass http://localhost:6081;
    }
}

6081端口的服务代码(golang)如下:

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    // GET /ping?param=XXX
    r.GET("/ping", func(c *gin.Context) {
        param := c.Query("param")
        c.JSON(http.StatusOK, gin.H{
            "param": param,
        })
    })

    // POST /post
    // postvalue=VALUE
    r.POST("/post", func(c *gin.Context) {
        value := c.PostForm("postvalue")
        c.JSON(http.StatusOK, gin.H{
            "postvalue": value,
        })
    })

    r.Run(":6081")
}

将上述 Nginx 配置文件放到 /etc/nginx/conf.d/ 目录下并 reload nginx 服务,同时运行上面的程序后,可以多次执行如下命令,并查看 6081 端口服务的日志,以确认 nginx cache 是否配置成功:

curl -s -d postvalue=123 http://SERVER-IP:12345/post

同样,如果只在第一次运行上述 curl 命令时,6081 端口服务产生访问日志,紧接着的几次 curl 命令,6081 端口服务都没有产生访问日志,则表示 nginx cache 配置成功了。

一如既往,如果你对文章中的内容有任何疑问,或者是发现文章中有任何错误,都可以通过留言告诉我;如果你喜欢我的文章,欢迎点击这里关注我的公众号。

标签: nginx 缓存 运维

本文转载自: https://blog.csdn.net/yuntaoren/article/details/128045932
版权归原作者 TechForGeek 所有, 如有侵权,请联系我们删除。

“配置 Nginx 缓存”的评论:

还没有评论