<!-- review: finished -->

<a id="http-memcached"></a>

# Memcached

该模块用于从 memcached 服务器获取响应。键在 [$memcached_key](#v-memcached-key) 变量中设置。响应应该通过 Angie 外部的方式预先放入 memcached。

<a id="configuration-example-29"></a>

## 配置示例

```nginx
server {
    location / {
        set            $memcached_key "$uri?$args";
        memcached_pass host:11211;
        error_page     404 502 504 = @fallback;
    }

    location @fallback {
        proxy_pass     http://backend;
    }
}
```

<a id="directives-30"></a>

## 指令

<a id="index-0"></a>

<a id="memcached-bind"></a>

### memcached_bind

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_bind` address [`transparent`] | `off`;   |
|--------------------------------------------------------------------------------------|-----------------------------------------------------|
| 默认值                                                                                  | —                                                   |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                              |

使到 memcached 服务器的出站连接源自指定的本地 IP 地址和可选端口。参数值可以包含变量。特殊值 `off` 取消从上一配置级别继承的 memcached_bind 指令的效果,允许系统自动分配本地 IP 地址和端口。

`transparent` 参数允许到 memcached 服务器的出站连接源自非本地 IP 地址,例如来自客户端的真实 IP 地址:

```nginx
memcached_bind $remote_addr transparent;
```

为了使此参数生效,通常需要以 [超级用户](https://cn.angie.software//angie/docs/configuration/modules/core.md#user) 权限运行 Angie 工作进程。在 Linux 上不需要这样做,因为如果指定了 `transparent` 参数,工作进程会从主进程继承 CAP_NET_RAW 能力。

#### NOTE
需要配置内核路由表以拦截来自 memcached 服务器的网络流量。

<a id="index-1"></a>

<a id="memcached-buffer-size"></a>

### memcached_buffer_size

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_buffer_size` size;   |
|--------------------------------------------------------------------------------------|---------------------------------|
| 默认值                                                                                  | `memcached_buffer_size 4k|8k;`  |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location          |

设置用于读取从 memcached 服务器接收的响应的第一部分的缓冲区大小。响应在接收后立即同步传递给客户端。

<a id="index-2"></a>

<a id="memcached-connect-timeout"></a>

### memcached_connect_timeout

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_connect_timeout` time;   |
|--------------------------------------------------------------------------------------|-------------------------------------|
| 默认值                                                                                  | `memcached_connect_timeout 60s;`    |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location              |

定义与 memcached 服务器建立连接的超时时间。需要注意的是,此超时时间通常不能超过 75 秒。

<a id="index-3"></a>

<a id="memcached-gzip-flag"></a>

### memcached_gzip_flag

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_gzip_flag` flag;   |
|--------------------------------------------------------------------------------------|-------------------------------|
| 默认值                                                                                  | —                             |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location        |

启用对 memcached 服务器响应中标志存在的测试,如果设置了该标志,则将 `Content-Encoding` 响应头字段设置为 "gzip"。

<a id="index-4"></a>

<a id="memcached-next-upstream"></a>

### memcached_next_upstream

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_next_upstream` `error` | `timeout` | `invalid_response` | `not_found` | `off` ...;   |
|--------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------|
| 默认值                                                                                  | `memcached_next_upstream error timeout;`                                                        |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                                                                          |

指定在哪些情况下应将请求传递给 [上游池](https://cn.angie.software//angie/docs/configuration/modules/http/http_upstream.md#http-upstream) 中的下一个服务器:

| `error`            | 与服务器建立连接、向其传递请求或读取响应头时发生错误;   |
|--------------------|-------------------------------|
| `timeout`          | 与服务器建立连接、向其传递请求或读取响应头时发生超时;   |
| `invalid_response` | 服务器返回空响应或无效响应;                |
| `not_found`        | 在服务器上未找到响应;                   |
| `off`              | 禁用将请求传递给下一个服务器。               |

#### NOTE
应该记住,只有在尚未向客户端发送任何内容时,才可能将请求传递给下一个服务器。也就是说,如果在传输响应的过程中发生错误或超时,则无法修复此问题。

该指令还定义了什么被视为与服务器通信的 [失败尝试](https://cn.angie.software//angie/docs/configuration/modules/http/http_upstream.md#max-fails)。

| `error`、`timeout`、`invalid_response`   | 始终被视为失败尝试,即使未在指令中指定   |
|----------------------------------------|-----------------------|
| `not_found`                            | 从不被视为失败尝试             |

将请求传递给下一个服务器可以受到 [尝试次数](#memcached-next-upstream-tries) 和 [时间](#memcached-next-upstream-timeout) 的限制。

<a id="index-5"></a>

<a id="memcached-next-upstream-timeout"></a>

### memcached_next_upstream_timeout

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_next_upstream_timeout` time;   |
|--------------------------------------------------------------------------------------|-------------------------------------------|
| 默认值                                                                                  | `memcached_next_upstream_timeout 0;`      |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                    |

限制可以将请求传递给 [下一个](#memcached-next-upstream) 服务器的时间。

| `0`   | 关闭此限制   |
|-------|---------|

<a id="index-6"></a>

<a id="memcached-next-upstream-tries"></a>

### memcached_next_upstream_tries

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_next_upstream_tries` number;   |
|--------------------------------------------------------------------------------------|-------------------------------------------|
| 默认值                                                                                  | `memcached_next_upstream_tries 0;`        |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                    |

限制将请求传递给 [下一个](#memcached-next-upstream) 服务器的可能尝试次数。

| `0`   | 关闭此限制   |
|-------|---------|

<a id="index-7"></a>

<a id="memcached-pass"></a>

### memcached_pass

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_pass` address;   |
|--------------------------------------------------------------------------------------|-----------------------------|
| 默认值                                                                                  | —                           |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | location, if in location    |

设置 memcached 服务器地址。地址可以指定为域名或 IP 地址以及端口:

```nginx
memcached_pass localhost:11211;
```

或作为 UNIX 域套接字路径:

```nginx
memcached_pass unix:/tmp/memcached.socket;
```

如果域名解析为多个地址,则所有地址都将以轮询方式使用。此外,地址可以指定为 [服务器组](https://cn.angie.software//angie/docs/configuration/modules/http/http_upstream.md#http-upstream)。

#### NOTE
If `memcached_pass` is placed in a `location` whose prefix ends with a slash
(for example, `location /name/`),
and the [auto_redirect](https://cn.angie.software//angie/docs/configuration/modules/http/index.md#auto-redirect) directive is set to `default`,
requests without a trailing slash will be redirected (`/name -> /name/`).

<a id="index-8"></a>

<a id="memcached-read-timeout"></a>

### memcached_read_timeout

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_read_timeout` time;   |
|--------------------------------------------------------------------------------------|----------------------------------|
| 默认值                                                                                  | `memcached_read_timeout 60s;`    |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location           |

定义从 memcached 服务器读取响应的超时时间。超时仅在两次连续的读取操作之间设置,而不是用于整个响应的传输。如果 memcached 服务器在此时间内未传输任何内容,则连接将关闭。

<a id="index-9"></a>

<a id="memcached-send-timeout"></a>

### memcached_send_timeout

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_send_timeout` time;   |
|--------------------------------------------------------------------------------------|----------------------------------|
| 默认值                                                                                  | `memcached_send_timeout 60s;`    |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location           |

设置向 memcached 服务器传输请求的超时时间。超时仅在两次连续的写入操作之间设置,而不是用于整个请求的传输。如果 memcached 服务器在此时间内未接收任何内容,则连接将关闭。

<a id="index-10"></a>

<a id="memcached-socket-keepalive"></a>

### memcached_socket_keepalive

| [语法](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)   | `memcached_socket_keepalive` `on` | `off`;   |
|--------------------------------------------------------------------------------------|----------------------------------------------|
| 默认值                                                                                  | `memcached_socket_keepalive off;`            |
| [上下文](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)  | http, server, location                       |

配置到 memcached 服务器的出站连接的 "TCP keepalive" 行为。

| `off`   | 默认情况下,套接字使用操作系统的设置。        |
|---------|----------------------------|
| `on`    | 为套接字启用 SO_KEEPALIVE 套接字选项。 |

<a id="built-in-variables-4"></a>

## 内置变量

<a id="v-memcached-key"></a>

### `$memcached_key`

定义用于从 memcached 服务器获取响应的键。
