Nginx 教程

Nginx 教程 Nginx 简介 Nginx 源码架构分析 Nginx 编译安装 Nginx(Tengine) 编译安装 Nginx(OpenResty) 编译安装 Nginx 配置简述 Nginx Docker 容器化配置

Nginx 核心配置指令

Nginx 核心配置指令 Nginx 配置文件 Nginx 进程配置指令 Nginx 端口监听:listen Nginx 主机名server_name Nginx 处理HTTP请求 Nginx 路由匹配规则:localhost Nginx 重定向配置:rewrite Nginx 根目录配置:root Nginx 访问路径别名:alias Nginx 文件判断:try_files Nginx 零复制:sendfile Nginx 日志记录配置

Nginx HTTP模块

Nginx 镜像模块 Nginx 请求头控制模块 Nginx IP访问控制模块 Nginx 用户cookie模块 Nginx 并发连接数限制模块 Nginx 首页处理模块 Nginx 请求频率限制模块 Nginx 页面缓存时间配置 Nginx gzip压缩及相关配置

Nginx Web服务

Nginx 静态资源服务器搭建 Nginx 文件下载服务器搭建 Nginx 伪动态SSI服务器 Nginx HTTPS服务器搭建 Nginx FastCGI模块配置简述 Nginx PHP服务器环境搭建 Nginx 基于FastCGI负载均衡 Nginx CGI网关接口 Nginx uWSGI模块配置 Nginx Python项目部署 Nginx 伪流媒体服务器搭建 Nginx HTTP2模块配置简述 Nginx WebDAV模块配置简述

Nginx 代理服务器

Nginx HTTP代理服务器 Nginx stream模块简述 Nginx TCP/UDP代理简述 Nginx 基于SSL的TCP代理服务器 Nginx gRPC代理服务器

Nginx 缓存

Nginx Web缓存配置 Nginx 代理缓存配置 Nginx Memcached 缓存模块 Nginx 反向代理缓存服务器配置 Nginx 客户端缓存控制

Nginx 负载均衡

Nginx 负载均衡模块 Nginx 负载均衡策略 Nginx 长连接负载均衡 Nginx upstream容错机制 Nginx upstream动态更新 Nginx TCP/UDP负载均衡

Nginx 日志管理监控

Nginx 日志分析简述 Nginx 访问日志配置 Nginx 错误日志配置 Nginx 日志归档配置 Nginx 日志分析工具 ELK Nginx 监控工具 Prometheus

Nginx 集群

LVS(Linux虚拟服务器)简介 Keepalived 配置简述 Nginx 集群负载搭建 Nginx 集群配置管理规划 Nginx 配置归档工具GitLab Nginx 配置修改工具Ansible Jenkins 安装与配置简述 Nginx 集群配置管理实例

Nginx 在 k8s 的应用

Kubernetes(k8s)系统简述 Kubernetes(k8s)集群部署 Kubernetes(k8s)网络通信 Nginx Ingress 简介 Nginx Ingress 安装部署 Nginx Ingress 配置映射 Nginx Ingress 注解


Nginx Memcached缓存模块简述

Nginx 的 ngx_http_memcached_module 模块本身并没有提供缓存功能,它只是一个将用户请求转发到 Memcached 服务器的代理模块。

在以 Memcached 服务器为缓存应用的方案中,Memcached 作为内容缓存的存储服务器,用户通过 URL 为 Memcached 的 key 将 Web 请求数据缓存到 Memcached 服务器中,在客户端发起请求时,Nginx 通过一致的 URL 为 key,快速地从 Memcached 服务器中将缓存的内容作为用户的请求响应数据返回给客户端。

Memcached 是一个开源、高性能的内存对象缓存系统,使用 Memcached 服务器作为缓存存储服务器,充分利用了 Memcached 的高效缓存功能,减少了 Nginx 服务器磁盘 I/O 的操作,也可以通过 upstream 指令对多台 Memcached 做分布式集群负载,以便整体提升 Nginx 缓存服务器的性能。

Memcached 缓存模块配置指令如下表所示。

指令名称 指令值格式 默认值 指令说明
memcached_bind address[transparent]
或 off
-- 设置从指定的本地 IP 地址及端口与 Memcached 服务器建立连接,指令值可以是变量。指令值参数为 transparent 时,允许将客户端的真实 IP 透传给被代理服务器,并以客户端真实 IP 为访问被代理服务器的源 IP,指令值为 off 时,则取消上一层指令域同名指令的配置
memcached_buffer_size size 4k 或 8k 设置用于读取 Memcached 服务器,读取响应数据缓冲区的大小,当 Nginx 收到响应数据后,将同步传递给客户端
memcached_connect_timeout time 60s Nginx 与 Memcached 服务器建立连接的超时时间,通常不应超过 75s
memcached_force_ranges on 或 off off 启用来自 Memcached 服务器的缓存和未缓存响应的 byte-range 请求支持,而不考虑这些响应头中的 Accept-Ranges 字段
memcached_gzip_flag flag -- 启用对 Memcached 服务器缓存数据 fags 的测试,flags 为客户端写入缓存时的自定义标记,此处用以判断缓存数据是否被压缩存储,如果数据被压缩存储,则将响应头字段 Content-Encoding 设置为 gzip
memcached_next_upstream error、timeout、
invalid_header、
not found 或 off...
error timeout 当出现指令值中指定的条件时,将未返回响应的客户请求传递给 upstream 中的下一个服务器
memcached_next_upstream_timeout time 0 设置将符合条件的客户端请求传递给 upstream 中下一个服务器的超时时间。0 为不做超时限制,遍历完所有上游服务器组中的服务器为止
memcached_next_upstream_tries number 0 设置符合条件的客户端请求传递给upstream中下一个服务器的尝试次数,包括第一次失败的次数。0为不做尝试次数限制,遍历完所有上游服务器组中的服务器为止
memcached_pass address -- 设置 Memcached 服务器的地址及端口,地址可以是 IP、域名或 UNIX 套接字
memcached_read_timeout time 60s 在连续两个从 Memcached 服务器接收数据的读操作之间的间隔时间超过设置的时间时,将关闭连接
memcached_send_timeout time 60s 在连续两个发送到 Memcached 服务器的写操作之间的间隔时间超过设置的时间时,将关闭连接
memcached_socket_keepalive on 或 off off 设置 Nginx 与 Memcached 服务器的 TCP keepalive 行为的心跳检测机制,默认使用操作系统的 socket 配置,若指令值为 on,则开启 SO_KEEPALIVE 选项进行心跳检测

配置样例如下:
server {
    location / {
        set            $memcached_key "$uri?$args";  # 设置Memcached缓存key
        memcached_pass 127.0.0.1:11211;              # 设置被代理Memcached地址
        error_page     404 502 504 = @fallback;      # 返回状态码404、502、504时跳入内部请求
    }

    location @fallback {
        proxy_pass     http://backend;               # 将请求转发给后端服务器
    }
}

Memcached 缓存应用

为了提高动态网站的响应速度,有时会采用将动态网站转换成静态化文件的方式进行优化,而相对于磁盘存储,使用 Memcached 进行静态文件的存储则可以进一步提升网站的响应速度。Memcached 是基于内存的高性能对象缓存系统,因为存储数据都是在内存中的,所以减少了系统的 I/O 操作,从而避免了因磁盘性能带来的影响。

使用 Memcached 作为缓存存储服务器,可以直接利用 Memcached 缓存的过期机制实现缓存的自动化过期管理,且利用 Nginx 的负载机制和 Memcached 分布式特性,可以非常方便地横向扩展,以提升处理性能。Memcached 缓存应用场景如下图所示。

Memcached 缓存应用
图:Memcached 缓存应用

Web 服务器将动态文件以请求 URI 作为 Memcached 的 key 初始化到 Memcached 服务器中;Nginx 将用户请求转发到 Memcached 服务器中,并将以请求 URI 作为 Memcached key 的数据返回给用户;当 Memcached 的请求失败后,则将请求转发给后端 Web 服务器的接口动态生成对应的静态文件,返回响应数据并更新 Memcached。

Memcached 的安装非常简单,在 CentOS 7 系统下使用 yum 安装即可,安装方法如下:

yum -y install memcached

cat /etc/sysconfig/memcached
PORT="11211"                  # 端口
USER="memcached"
MAXCONN="1024"          # 最大连接数
CACHESIZE="64"              # 使用内存大小为64M
OPTIONS=""

systemctl start memcached

Nginx 服务器配置样例如下:
upstream backend {
    server 192.168.2.145:8190;                              # 后端PHP服务器IP
}

upstream memcached {
    hash $host$request_uri consistent;                      # 一致性hash
    server 192.168.2.145:11211;                             # Memcached服务器IP
    server 192.168.2.109:11211;                             # Memcached服务器IP
}

server {
    listen       8181;
    access_log logs/mem_access.log;
    set $memcached_key $host$request_uri;                   # 设置Memcached的key
    location / {
        memcached_connect_timeout 5s;             # 与Memcached建立连接超时时间为5s
        memcached_read_timeout 2s;                # 连续两次读的超时时间为2s
        memcached_send_timeout 2s;                # 连续两次写的超时时间为2s
        memcached_pass memcached;                 # 代理到Memcached集群
        add_header X-Cache-Satus HIT;             # 显示缓存命中状态
        add_header Content-Type 'text/html; charset=utf-8'; # 强制响应数据格式为html
    }

    error_page     404 502 504 = @fallback;

    location @fallback {
        proxy_set_header   X-Memcached-Key $memcached_key;  # 将memecached key传递
                                                            # 给PHP服务器
        proxy_pass     http://backend;                      # PHP服务器
    }
}
为了方便演示 Memcached 的使用方法,在此处提供了一段简单的 PHP 测试代码。在测试代码中,使用了 PHP 模块 Memcached 与 Nginx 兼容的一致性哈希算法实现分布式 Memcached 集群的支持。
  1. <?php
  2. // 测试数据
  3. $html = file_get_contents('https://www.baidu.com');
  4.  
  5. if ($_SERVER['REQUEST_METHOD'] != 'GET' || !isset($_SERVER['HTTP_X_MEMCACHED_KEY']) || !$_SERVER['HTTP_X_MEMCACHED_KEY']) {
  6. echo $html;
  7. exit();
  8. }
  9.  
  10. $memcachedKey = $_SERVER['HTTP_X_MEMCACHED_KEY'];
  11.  
  12. // 初始化Memcached
  13. $memcached = new Memcached();
  14.  
  15. // 配置分布式hash一致性算法,兼容Nginx的Ketama算法
  16. $memcached->setOptions(array(
  17. Memcached::OPT_DISTRIBUTION=>Memcached::DISTRIBUTION_CONSISTENT,
  18. Memcached::OPT_LIBKETAMA_COMPATIBLE=>true,
  19. Memcached::OPT_REMOVE_FAILED_SERVERS=>true,
  20. Memcached::OPT_COMPRESSION=>false
  21. ));
  22.  
  23. // 添加Memcached服务器
  24. $memcached->addServers(array(
  25. array('192.168.2.145', 11211),
  26. array('192.168.2.109', 11211)
  27. ));
  28.  
  29. // 存储到Memcached,缓存有效期1天
  30. $memcached->set($memcachedKey, $html, 86400);
  31.  
  32. //调试用
  33. header('X-Cache-Status: MISS');
  34. header('X-Cache-Key: ' . $memcachedKey);
  35.  
  36. //输出静态文件
  37. print $html;
  38.  
  39. ?>