如何在Redis中closures“保护模式”?

我想在我的产品Redis上禁用protected-mode 。 关于我从其他Redis-Sentinel实例获得的以下错误,我可以通过从运行的主机连接到Redis来禁用它。

DENIED Redis运行在保护模式,因为启用了保护模式,没有指定绑定地址,没有向客户端请求authentication密码。 在这种模式下,连接只能从回送接口接受。 如果您想从外部计算机连接到Redis,则可以采用以下解决scheme之一:

1)只要禁用保护模式,从服务器运行的同一主机连接到Redis,从回送接口发送命令“CONFIG SET保护模式no”,但如果你这样做,则不能从互联网公开访问。 使用CONFIG REWRITE使此更改永久。

2)或者,您可以通过编辑Redisconfiguration文件并将保护模式选项设置为“no”来禁用保护模式,然后重新启动服务器。

3)如果您只是为了testing而手动启动服务器,请使用“ – 保护模式否”选项重新启动服务器。

4)设置绑定地址或authentication密码。

注:您只需要执行上述操作之一,以便服务器开始接受来自外部的连接。

但是,当我连接,并尝试禁用它,我得到错误(error) ERR Unsupported CONFIG parameter: protected-mode

没有authconfiguration或其他任何东西 – 所有的安全性由防火墙规则pipe理。 redis.conf几乎是默认的。

演示

 root@svim-redis03 /etc/redis # redis-cli 127.0.0.1:6379> CONFIG GET protected* (empty list or set) 127.0.0.1:6379> CONFIG GET bind* 1) "bind" 2) "127.0.0.1" 127.0.0.1:6379> CONFIG SET protected-mode no (error) ERR Unsupported CONFIG parameter: protected-mode 127.0.0.1:6379> exit root@svim-redis03 /etc/redis # redis-server --version Redis server v=3.2.9 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=86450d2ba8219c1e 

有什么我需要检查或更改之前? 我无法在文档或GitHub问题中find任何提示。

更新01

甚至无法更改绑定地址或任何其他configuration参数。 我需要先启用configuration更改吗?

 127.0.0.1:6379> config set bind "127.0.0.1 11.12.13.14" (error) ERR Unsupported CONFIG parameter: bind 

事实certificate,当前运行的服务器与我安装的二进制文件版本不同。

如何重现这一点?

只需通过redis-cli连接到你的redis实例并inputINFO server ,它将返回一堆信息。

 127.0.0.1:6379> INFO server # Server redis_version:3.0.7 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:869e89100d5ea8c2 redis_mode:standalone os:Linux 4.2.0-35-generic x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.4 process_id:26720 run_id:6645270dd2ac6a7f96caa054f9dbba9e66566755 tcp_port:6379 uptime_in_seconds:10971777 uptime_in_days:126 hz:10 lru_clock:6676576 config_file:/etc/redis/redis.conf 

正如你所看到的,这个redis-instance运行将近127天,并使用redis_version:3.0.7

如何解决这个问题?

重新启动你的服务器,并确保你真的重新启动它! 例如,对于大多数Linux发行版,您可以通过点击以下命令来完成。

 root@svim-redis03 ~ # service redis-server stop Stopping redis-server: redis-server. 

通过尝试连接到redis-cli来检查它是否真的离线。 如果仍然可以连接实例仍在运行。 通过search活动的redis进程来检查这一点。

 root@svim-redis03 ~ # ps -efl |grep redis 1 S redis 12418 1 0 80 0 - 10673 ep_pol 2016 ? 05:33:17 /usr/bin/redis-server 127.0.0.1:6381 1 S redis 12442 1 0 80 0 - 11697 ep_pol 2016 ? 05:33:46 /usr/bin/redis-server 127.0.0.1:6382 1 S redis 12453 1 0 80 0 - 10673 ep_pol 2016 ? 05:40:17 /usr/bin/redis-server 127.0.0.1:6383 4 S root 16570 16386 0 80 0 - 2489 wait_w 10:42 pts/7 00:00:00 tail -f /var/log/redis/redis-server-6379.log 0 S root 17064 12637 0 80 0 - 3617 pipe_w 10:47 pts/1 00:00:00 grep --color=auto redis 1 S redis 26720 1 0 80 0 - 453041 ep_pol Mar07 ? 08:37:01 /usr/bin/redis-server 127.0.0.1:6379 

正如你所看到的,还有一个实例(进程号:26720)正在运行。 使用以下命令退出它。

 kill 26720 

在杀死进程之后,如果实例真的closures,请使用ps -efl |grep redis再次检查。

最后再次启动它

 root@svim-redis03 ~ # service redis-server start Starting redis-server: redis-server. 

现在检查实例是否运行正确的版本。

 root@svim-redis03 ~ # redis-cli 127.0.0.1:6379> INFO server # Server redis_version:3.2.9 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:86450d2ba8219c1e redis_mode:standalone os:Linux 4.2.0-35-generic x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.4 process_id:17135 run_id:40d6fa2e2b25e8f5b97a3c97ec1bddb8edda0014 tcp_port:6379 uptime_in_seconds:11 uptime_in_days:0 hz:10 lru_clock:6677102 executable:/usr/bin/redis-server config_file:/etc/redis/redis.conf