草庐IT

配置 Nginx 缓存

TechForGeek 2024-04-26 原文

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 缓存的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  5. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  8. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  9. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

  10. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

随机推荐