更新:这个问题似乎基本已经修复。我不确定我做了什么,但它正在运行,我的网站也加载正常。但是,我仍然遇到错误 #1,PID 不可读。
我希望能得到一些帮助,弄清楚为什么 Redis-Server 无法运行。大约 3 天前,我让它完全运行,但当我尝试从我的 WordPress 安装中删除其他缓存程序时。不知何故,我破坏了 Redis。接下来,我列出了错误,然后我尝试如何纠正它们。请让我知道你的想法以及我如何尝试修复它。
我最初从 redis.io 的源代码安装了 Redis-Server,但是一旦它坏了,我最终尝试从源代码重新安装,也尝试从 重新安装apt
。我在两种类型的安装中都遇到了相同的错误。
uname -a:Linux 服务器名称.tld 4.4.0-97-generic #120-Ubuntu SMP 2017 年 9 月 19 日星期二 17:28:18 UTC x86_64 x86_64 x86_64 GNU/Linux Ubuntu 16.04 Redis 服务器 4.0.2
我使用以下教程来安装 Redis-Server:在 Ubuntu 16.04 上为 WordPress PHP 7 安装 Redis 对象缓存
错误:
redis-server.service:启动后 PID 文件 /var/run/redis/redis.pid 无法读取(目前?):没有此文件或目录
- 我尝试通过确保 /var/run/redis/ 已创建来更正此问题。我还确保(在不同时间)/var/run/redis/ 由 redis:redis 和 redis:www-data(我的 apache2 组)拥有。我还尝试了 777、755、775、007、770 等多种权限方案。
在所有这些情况下,我偶尔仍会收到错误。 - 我还手动创建了具有上面提到的相同类型权限的 /var/run/redis/redis.pid 文件。
- 最后,根据网站上的一些建议,我还将 PIDFile 更改为 redis-server.pid ...
- 对于此错误信息,这些更改似乎都无法真正持久并持续起作用。
- 我尝试通过确保 /var/run/redis/ 已创建来更正此问题。我还确保(在不同时间)/var/run/redis/ 由 redis:redis 和 redis:www-data(我的 apache2 组)拥有。我还尝试了 777、755、775、007、770 等多种权限方案。
您请求的 maxclients 为 20000,这需要至少 20032 个最大文件描述符。服务器无法将最大打开文件数设置为 20032,因为操作系统错误:操作不允许。当前最大打开文件数为 4096。maxclients 已减少到 4064,以补偿较低的 ulimit。如果您需要更高的 maxclients,请增加“ulimit -n”。
- 这似乎受到 redis.conf 文件中“MaxClients”部分的影响...我试图通过注释掉来更改 MaxClients 选项,但它将其设置为默认值 10000...我也在 redis.conf 中将其更改为 20000,这个数字上升到 20032...所以它似乎总是需要比我允许的多 32 个文件。
- 我已将 /etc/systemd/system/redis-server.service 文件更改为包含“LimitNOFILE=64000”... 这没有什么不同。我已重新启动服务器 - 没有任何变化。
- 我已经更改了 /etc/default/redis-server 并取消注释了“ULIMIT=65536”...重新启动,仍然没有变化。
警告:您的内核已启用透明大页面 (THP) 支持。这将导致 Redis 出现延迟和内存使用问题。要解决此问题,请以 root 身份运行命令“echo never > /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的 /etc/rc.local,以便在重启后保留设置。禁用 THP 后必须重新启动 Redis
- 我发出以下命令后,这个问题得到了纠正:
echo never > /sys/kernel/mm/transparent_hugepage/enabled- 我还将上述命令添加到 /etc/rc.local,以便在重启后继续使用。同样,这个问题似乎已经解决了。
- 我发出以下命令后,这个问题得到了纠正:
警告 overcommit_memory 设置为 0!内存不足时后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到 /etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory=1”以使此操作生效。
我发出了以下命令来尝试解决此错误...它似乎只会有时出现:
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf; sysctl -p
此错误偶尔会发生
警告:无法强制执行 511 的 TCP 积压设置,因为 /proc/sys/net/core/somaxconn 设置为较低的值 o
我通过执行以下命令添加了以下内容:
echo "net.core.somaxconn=65536" >> /etc/sysctl.conf echo "net.ipv4.tcp_max_syn_backlog=8192" >> /etc/sysctl.conf
为了验证它们是否已被添加... sysctl -p
下面是我的整个 /etc/systemd/system/redis-server.service 文件。
[单元] 描述=Redis 数据存储服务器 之后=网络.目标 [服务] 类型=分叉 PID文件=/var/run/redis/redis.pid 用户=redis 组=www-data 限制NOFILE=64000 权限启动仅=true \# 创建并设置 PIDFile 目录的权限 ExecStartPre=/bin/mkdir -p /var/run/redis ExecStartPre=/bin/chown redis:www-data /var/run/redis ExecStartPre=/bin/chmod 775 -R /var/run/redis \# 创建并设置日志目录的权限 \# 将此内容注释掉是因为我收到操作不被允许的错误。 \#ExecStartPre=/bin/mkdir -p /var/log/redis \#ExecStartPre=/bin/chown redis -R /var/log/redis \#ExecStartPre=/bin/chmod 775 -R /var/log/redis \# 创建并设置日志文件的权限 ExecStartPre=/bin/touch /var/log/redis/redis-server.log ExecStartPre=/bin/chown redis /var/log/redis/redis-server.log ExecStartPre=/bin/chmod 775 /var/log/redis/redis-server.log ExecStart=/sbin/start-stop-daemon --start --pidfile /var/run/redis/redis.pid --umask 007 --exec /usr/bin/redis-server -- /etc/redis/redis.conf ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/usr/bin/redis-cli 关闭 重启=总是 [安装] WantedBy=多用户.目标
我已经束手无策了。在努力让 memcached 工作不起来之后,我转而使用 Redis-Server。memcached 唯一一次工作成功,是我在我的 WordPress 网站上试用的,速度超级快。我非常印象深刻非常对性能很满意。但显然我无法让它工作,这就是我寻求帮助的原因。
答案1
由于您没有提到其他变化,因此可能不太可能,但无论如何我都会发布。
这可能是 IPv6 / IPv4 问题。如果您在任何时候禁用 IPv6,您将得到您描述的结果。
查看 /var/log/redis/redis-server.log。这是我在我的系统中发现的内容:
17008:C 24 Aug 07:17:45.193 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
17008:C 24 Aug 07:17:45.193 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=17008, just started
17008:C 24 Aug 07:17:45.193 # Configuration loaded
17009:M 24 Aug 07:17:45.195 # Creating Server TCP listening socket ::1:6379:
bind: Cannot assign requested address
Redis 尝试使用 IPv6 (::1:6379:)。我已在此系统上禁用 IPv6(出于某些原因),但默认 redis-cache 配置同时启用 IPv4 和 v6。如果您在该日志中看到“无法分配”错误,请查看 /etc/redis/redis.conf。“开箱即用”配置启用 IPv6 (::1):
bind 127.0.0.1 ::1
所以我删除了它,并将其改为:
bind 127.0.0.1
此后,Redis 就立即启动了。
希望有帮助!
答案2
尝试一下这个(测试过 Ubuntu 18.04):
sudo sh -c 'echo "httpd soft nofile 4096" >> /etc/security/limits.conf'
sudo sh -c 'echo "httpd hard nofile 10240" >> /etc/security/limits.conf'
sudo sh -c 'echo "fs.file-max = 100000" >> /etc/sysctl.conf'
sudo sh -c 'echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf'
sudo apt -y install redis-server redis-tools
sudo service redis-server stop
sudo sed -i '/^bind/s/bind.*/bind 0.0.0.0/' /etc/redis/redis.conf
if [ ! -d /var/run/redis ]; then sudo mkdir -p /var/run/redis && sudo chown redis /var/run/redis; fi
sudo service redis-server start
答案3
这是 @Chris 答案的补充,但来自另一个方面。有一个启用了 IPv6 的 Ubuntu 服务器,但redis-server
尝试绑定到 IPv4...
11558:C 16 Mar 21:09:24.694 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11558:C 16 Mar 21:09:24.694 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=11558, just started
11558:C 16 Mar 21:09:24.694 # Configuration loaded
11569:M 16 Mar 21:09:24.709 # Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use
解决方案是将 redis.conf 从:
bind 127.0.0.1
...成为:
bind 127.0.0.1 ::1
之后工作正常...不过,请确保在任何与 IP 相关的更改之后重新启动服务器。