虽然我可以在 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 本地域套接字。