解决nextcloud警告:“内存缓存未配置”

2018-10-26


安装好nextcloud后进入nextcloud网页版,在设置 - 概览里面看到这样的提示:

内存缓存未配置,为了提升使用体验,请尽量配置内存缓存。更多信息请参见[文档]。

配置缓存能让网盘访问更快速,也能降低系统负载,对于小内存VPS来说几乎是必选项了。不过,“内存缓存未配置”在nextcloud中只是警告,并不是错误,也就是说,不配置也能正常运行nextcloud,不过还是建议进行配置,毕竟除了安装,优化才是重点。

虽然nextcloud关于未配置缓存的警告网上有很多教程,不过大都是复制粘贴,没什么参考价值,而且当我遇到问题去Google后发现一整页的搜索结果都不能解决问题时,一般会尝试去英文论坛逛逛,这次我的问题就是去nextcloud的官方论坛和GitHub项目的issue里面才找到解决办法的,对于只在学校学过英语的人来说,逛英文论坛需要的可能只是一点耐心和一个翻译插件

安装redis

redis其实是款数据库软件,因为数据存在内存里,所以速度快很多,所以经常会用redis作为缓存。需要安装的软件其实有两个:redisphp71w-pecl-redisPECL的全称是The PHP Extension Community Library,由此也可见php71w-pecl-redis是一个php扩展。

安装很简单:

1
yum install redis php-redis

如果是ubuntu/debian,那么安装的是redis-server

1
apt-get install redis-server php-redis

安装完后启动redis,并设置开机自启

1
2
systemctl start redis
systemctl enable redis

将redis的连接方式从TCP改为socket

安装完后需要对redis进行配置,跟php-fpm的运行类似,redis可以使用常规的TCP连接,也就是让redis监听127.0.0.1:6379,这是redis默认的设置,不过,如果redis的客户端和服务端都在同一个服务器内,更推荐使用socks方式,能提升性能。

UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程,当用户连接到Redis通过TCP/IP连接或Unix域连接,千兆网络的典型延迟大概200us,而Unix Domain Socket可能低到30us。

配置起来也很简单,直接打开redis配置文件:

1
vim /etc/redis.conf

作如下修改:

1
2
3
4
5
6
7
8
9
10
11
# 监听端口改为0
port 0

# 只监听本地端口
bind 127.0.0.1

# 添加unix socket监听,/dev/shm/是挂载在内存的临时文件夹,具体可搜索tmpfs
unixsocket /dev/shm/redis.sock

# 设置socket权限
unixsocketperm 775

上面设置socket的,如果懒得设可以略过,毕竟网盘使用量不大的话,能感受到的性能差距其实不大。关于socket权限,有的说是770,也有说755,但是用这两种权限,我的nextcloud打开都会出现这样的错误提示:

Internal Server Error

The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.

最后发现755情况下才正常。

为了提高安全,也可以给redis设置密码,大概在480行

1
2
3
4
5
# 把这一行
#requirepass foobared

# 改为
requirepass H#p$#9kNn#ol8NLBtoiy89FV6098@

后面的密码随便设,可以设复杂一点,requirepass后面那一串就是密码,这个密码可以不用记在脑袋里。然后重启redis使配置生效:

1
systemctl restart redis

最后还需要把redis添加进相应的用户组,以nginx为例:

1
usermod -g nginx redis

redis测试

redis配置好后可以进行简单的测试,懒得做的可以直接跳到下一步。

redis默认使用TCP连接,测试如下:

1
2
3
4
5
# 启动redis控制台,默认127.0.0.1:6379
redis-cli

# 测试
ping

返回PONG则redis运行正常。如果按照本教程换成了socket方式,那么运行下列命令

1
redis-cli -s /dev/shm/redis.sock ping

如果有密码,那么要用-a参数输入密码:

1
2
# 进入redis本地连接
redis-cli -s /dev/shm/redis.sock -a 'H#p$#9kNn#ol8NLBtoiy89FV6098@'

或者在redis-cli里面输入密码:

1
redis /dev/shm/redis.sock> auth 'H#p$#9kNn#ol8NLBtoiy89FV6098@'

配置nextcloud

安装好redis后需要在nextcloud中启用,直接在nextcloud的配置文件修改即可:

1
vim /var/www/nextcloud/config/config.php

在最后一行的);上面添加配置:

1
2
3
4
5
6
7
8
9
10
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'filelocking.enabled' => 'true',
'redis' => array(
'host' => '/dev/shm/redis.sock',
'port' => 0,
'dbindex' => 0,
'password' => 'H#p$#9kNn#ol8NLBtoiy89FV6098@',
'timeout' => 1.5,
),

注意:

此时再进入nextcloud就不会再看到有关内存缓存未设置的提示了。



评论