如何设置 memcached 以使用 unix 套接字?

如何设置 memcached 以使用 unix 套接字?

虽然我可以在 Debian 上使用 memcached 来使用默认的 11211 端口,但是在设置 Unix 套接字时遇到了很大的困难。

从我读过的内容中,我知道我需要创建memcache.socket并添加:

-s /path/to/memcache.socket
-a 0766

/etc/memcached.conf注释掉默认的连接端口和IP,即

-p 11211 
-l 127.0.0.1

然而,当我重新启动 memcached 时,Drupal 网站上出现了内部服务器错误。

我正在尝试实现 unix 套接字以避免 TCP/IP 开销并提高整体 memcached 性能,但不确定通过这种调整可以带来多少性能提升。

我感谢您提供的提示或可能的配置来解决这个问题。

答案1

您可能会发现仅设置套接字路径不起作用。Memcached 在创建套接字之前会放弃权限,但在写入其 PID 之后。通常会将套接字放入/var/run(例如 mysql 所做的那样),但只有 root 可以在那里写入,因此请创建/var/run/memcached并将其 chown 为 nobody,然后将其设置/var/run/memcached/memcached.sock为套接字路径。将其写入/tmp也可以,但就其本质而言,这可能会被破坏;将其保留下来/var/run会更持久一些。

您可以使用 netcat 连接它来检查它是否正常工作:

nc -U /var/run/memcached/memcached.sock

只需在空白提示符下输入stats;如果它有效,您将获得大量的输出。

答案2

我认为套接字需要是全局可执行的,而不是可写的。如果您看到包含以下内容的 PHP 通知消息:errno=32 管道损坏,调整 Memcached 访问掩码为 0755

-s /path/to/memcache.socket
-a 0755

同时验证 Drupal 的Memcached 守护进程0配置中的TCP 端口为。未设置的端口将默认为11211,并混淆套接字连接。

$conf += array(
    'memcache_servers' => array(
        'unix:///path/to/memcache.socket:0'  => 'default',
    )
);

答案3

添加到/etc/default/memcached:

[ ENABLE_MEMCACHED = yes ] && install -d -o memcache -g www-data -m 0770 /var/run/memcached
# or use setfacl and whatever user/group you want
true # because set -e in init-scripts

添加到/etc/memcached.conf:

-s /var/run/memcached/memcached.sock
-a 0666

答案4

请注意,如果你在 Kubernetes 中使用 Alpine 容器,带有健康探测的 pod 规范将如下所示:

spec:
  containers:
    - name: memcached
      image: memcached:1.5-alpine
      imagePullPolicy: "IfNotPresent"
      command:
      - memcached
      - --unix-socket=/tmp/memcached.sock
      - --unix-mask=0766
      - -m 64
      - -o modern
      - -v
...
      livenessProbe:
        exec:
          command:
          - /bin/sh
          - -c
          - 'echo "stats slabs" | nc local:/tmp/memcached.sock'
        initialDelaySeconds: 30
        timeoutSeconds: 5
      readinessProbe:
        exec:
          command:
          - /bin/sh
          - -c
          - 'echo "stats slabs" | nc local:/tmp/memcached.sock'
        initialDelaySeconds: 5
        timeoutSeconds: 1

花了一段时间才弄清楚正确的设置,以及如何通过 busybox 连接到 unix 本地域套接字。

相关内容