让你的Nextcloud服务器快起来

Nextcloud服务器是一个非常好的应用,内容全面 ,有许多功能强大的插件,运行稳定可靠,有很友好的支持文档,也有社区和网友的经验分享。

我的Nextcloud服务是通过docker运行的,有一个问题一直困扰着我,就是这个服务在运行一段时间后,打开其中内容的速度会变得很慢,我也在网络上查找了相关的问题,许多人都有这个反应,部分使用者难以忍受就选择不再使用这个产品了。我按照官方文档和别人的经验对服务器进行了各种设置,但都没有太好的效果。

终于在这周,服务器已经慢得我也难以忍受了,打开主文件夹竟然要差不多20秒,决心再尝试一下修复这个问题,看来暂时取得了成功。

一、问题的分析

造成服务器运行速度不快的原因有许多,这里仅从软件方面来分析一下,其实Nextcloud对硬件要求不高。

Nextcloud要正常运行,最少需要有以下条件:

  • 数据库
  • PHP环境
  • Apache2服务器

其中,数据库带来了数据查询、写入和日志操作方面的问题。PHP是Web页面生成的后端,对Nextcloud在浏览器中的表现有最直接的影响。而Apache2服务器性能较强,在通用配置下对Nextcloud的影响会比较小。

经过观察,我打开文件夹要不少时间,尝试按别人的方法进行数据库优化,但效果不明显。同时也看到,切换系统的不同应用也要很长时间,比如打开邮件、日历和音乐等,这似乎说明问题还可能是内部的PHP表现不佳造成的,考虑Nextcloud本身对资源要求不高,最主要的原因可能还是在系统缓存的设置上出现问题。

根据以上分析,重新检查验证了官方要求的配置,并对PHP的相关内容进行了调整。

二、主要配置

1、Nextcloud容器启用时,设置好基本的运行参数。

”’Auto configuration via environment variables’

  • MYSQL_DATABASE Name of the database using mysql / mariadb.
  • MYSQL_USER Username for the database using mysql / mariadb.
  • MYSQL_PASSWORD Password for the database user using mysql / mariadb.
  • MYSQL_HOST Hostname of the database server using mysql / mariadb.
  • PHP_MEMORY_LIMIT (default 512M
  • PHP_UPLOAD_LIMIT (default 512M

在启动容器时,通过以上环境变量设置,Nextcloud就可以正常运行,也基本没有性能方面的问题。

2、安装并设置redis缓存

根据使用的经验,redis缓存对优化Nextcloud有非常大的影响,也是官方推荐的内容,直接影响数据的查询性能。

2.1 安装redis,按网络上的教程做就可以,如果不做数据持久化可以不用做多余的设置。

2.2 设置Nextcloud的config.php文件

在docker容器中,该文件位于/var/www/html/config目录下。

3、设置opcache缓存

3.1 在Nextcloud的config.php文件中设置opcache缓存

3.2 在PHP配置中设置opcache缓存

修改 /usr/local/etc/php/php.ini-development文件,有关opcache缓存的主要内容启用

[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1

; The OPcache shared memory storage size.
opcache.memory_consumption=128

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=8

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 1000000 are allowed.
opcache.max_accelerated_files=10000

在许多的教程文章中,都只是说到按官方要求,设置好config.php文件,使用内存缓存,而实际上Nextcloud的性能主要是由PHP的表现和mqsql数据库的表现所决定的,这个配置就决定了PHP的性能表现,比如:opcache.enable=1 就是“Determines if Zend OPCache is enabled”,只有启用该配置,才能真正使用opcache缓存。

我就是在该项配置后完全解决了Nextcloud的运行速度问题。

4、优化数据库的查询性能

Nextcloud将大量的状态数据保存在数据库中,所以我们每请求一个页面,Nextcloud都要向数据库存取大量数据,所以数据库的读写性能也会直接影响Nextcloud的表现。关于修改数据查询速度的方法,网络上也有较多讨论。

以我的MariaDb 10数据库为例,该数据库是以Docker容器运行的。

按官方的要求运行容器:

$ docker run --name some-mariadb -v /my/custom:/etc/mysql/conf.d -e MARIADB_ROOT_PASSWORD=my-secret-pw -d mariadb:latest

其中,将容器的/etc/mysql/conf.d的文件夹映射到本地/my/custom文件夹。

在 /my/custom文件夹下建立 my.cnf文件,写入如下内容:

[mysqld]
innodb_flush_log_at_trx_commit=0

对于大系统,这项设置能够大幅改善数据库的性能,但极端情况下有1秒钟的数据损失风险,如果在家庭和人个应用的场景,并且我们数据库的安装本身没有大的问题,这项设置应该不会严重影响Nextcloud的表现。

Nextcloud是一个很好的应用,但其中有很多专业的系统配置问题,建议开发者设立专门的配置文件,减少普通使用者的困难。

建一个自己的RSS服务器

RSS现在已经变得越来越小众化了,但信息订阅确实可以让我们在一个窗口快速浏览大量信息,大幅提高信息检索的效率,不用临时一个个去点开相关网站,方便简单有效。

比较传统的方法是下载一个RSS阅读端,加入源就可以很方便地开始订阅和阅读了,但也有很多人像我一样,不想在每个客户端都装一个软件或APP,无论是ipad或PC,最好的方法是打开浏览器就就能看自己的订阅,不用考虑是否装了阅读器,实现这个想法的条件就是在远程计算机上装一个RSS服务器,可以实现随时随地访问自己的订阅服务。

在网络找了一遍,被大家提到比较多的是Tiny Tiny RSS,也在Github上找到一个FreshRSS,星星很多,看了官方的部署介绍和网友的文章,感觉这个应用可能会更简单方便,因此就在群晖上用docker容器进行了安装。

通过自己动手和一些尝试,部分安装过程其实可以更加简单,没有必要完全按照官方说明一字不差地做,简单地说就是可以按一般容器的部署方法也没有问题,这里简略地记录和分享一下过程,供大家参考。

1、下载镜像

在群晖docker管理器的注册表搜索freshrss

第二个是官方镜像

2、准备数据库

该服务运行中要用到数据库,如果只是一个人使用,其实可以不用考虑这一步,让系统自己处理。这里按较大系统考虑,单独配置mysql数据库。

数据库的安装和运行网络上有很多介绍,这里要做的仅是在已经运行的系统内建一个用于rss的数据库,并设置好数据库用户。

3、启动容器

只需要设置两项,其它全部默认。

3.1 设置端口

3.2 修改时区

将TZ的值由UTC改为Asia/Shanghai

4、运行容器并完成配置

4.1 在浏览器中输入 192.168.0.xxx:30000,登录FreshRSS服务,将语言改为中文,系统将自动检查各项设置,由于是docker容器,一般没有问题。

4.2 设置数据库

在的数据库配置中,数据库类型选Mysql,主机填写172.17.0.1,由于我的数据库是用docker容器建的MariaDB 10,所以主机名要填写docker的网桥地址,直接填写主机的局域网IP地址或localhost会无法正确连接数据库,mysql数据库的默认地址是3306,如果没有修改,则端口可以不填,如果修改过则如实填写。其它用户、密码和数据库都是我们在第2步中设置好的值。

4.3 常规配置

再下一步完成安装。

5、登录系统并添加源测试运行是否正常

6、其它设置

到这里,rss在局域网中已经可以使用了,为了实现随时随地访问的目的,需要将网站发布到公网上,因此需要为已经安装好的rss服务器申请域名,并配置好https连接,这两个步骤的设置网络上有非常多的教程,我们照着做就能完成。

以上是在群晖NAS中,用全图形化的形式部署FreshRSS的docker容器,非常简单直观,完全没有官方网站中那些多余的步骤。

上面的安装已经是非常简单了,其实用命令方式安装更加简单,这里简单说一下思路:

第一步,和上面文章提到的一样,先设置好数据库

第二步,进入群晖后台,执行以下命令

docker run -d --name freshrss1 -p 30000:80 -e TZ=Asia/Shanghai freshrss/freshrss:latest

第三步,浏览器登录rss服务器,与前面提到的一样完成数据库的连接

总之,RSS服务器的安装还是比较方便的,简单尝试之后反而感觉比较好的rss源不多。

怎样制作一个arm架构docker镜像

如果你现在工作在一个arm 架构的服务器,生成一个该架构下的docker镜像是比较顺其自然的事情,可是这里经常会有个矛盾,我们日常的工作平台,比如桌面电脑或服务器需要比较强的性能,通常采用x86架构,把生成的docker镜像跑在一些不需要很强性能的arm服务器上,长期提供一些服务,x86工作平台默认只能运行该架构下的基础镜像,无法直接运行arm架构组件。

实现在x86平台运行arm程序的基本思路是利用模拟器,涉及的原理和过程比较复杂,本人没有相关的深厚理论基础,无法讲深讲透,只分享一下怎么在操作上实现。

1、安装qemu-arm运行环境

QEMU是一个处理器模拟软件,可以用来在一个平台中模拟其他操作系统架构,如在PC中实现ARM、MIPS等多种架构的软硬件运行环境。QEMU主要有两种模拟模式:
System模式中,它可以在一个主机环境中虚拟不同的虚拟计算机系统,比如可以在Ubuntu系统中虚拟出一个MIPS架构的Debian系统。
User模式中,它可以运行一个为其他处理器编写的应用程序,比如可以在X64-Ubuntu系统中直接运行一个MIPS-Linux的应用程序。

1.1 所以,我们需要安装一个可以模拟arm平台的系统环境,使用ubuntu的基础系统,可以非常方便地实现一条命令完成相关功能的安装,不需要以前采用原码编译等。

apt-get install qemu-user-static

这条命令安装了一个用户模式的arm模拟器,可以通过qemu-arm等命令方式运行arm指令。

1.2 在linux内核启用binfmt模式,让linux直接识别arm指令并调用arm模拟器来运行该指令。

qemu的基本原理是将arm 指令翻译成x86命令,再由宿主系统,如linux来执行翻译出来的指令,最终成功运行arm。这个过程本来没有什么问题,就是每次运行arm指令需要通过明确指定通过qemu-arm来运行,麻烦一些。其实linux内核有binfmt模式,通过该模式,在系统内核注册arm指令,这样系统遇到arm指令能识别并自动调用qemu-arm来运行它。

apt-get install binfmt-support

2、运行一个arm架构基础容器

这样做的意图是通过这个基础容器,直接建立一个较为纯粹的arm工作环境,不用考虑各种arm架构的库和依赖,避免直接在宿主机执行docker构建的各种操作,减少因依赖等问题导致的失败。

docker pull docker.io/arm64v8/ubuntu:20.04

docker images

docker run -it e784f03641c9

通过以上命令,我们就在x86的ubuntu系统上运行了一个arm内核架构的dcoker容器。

3、将配置好的arm架构docker 容器导出为arm架构容器

进入创建好的ubuntu容器,直接在其中安装必要的功能,其中所有的安装都将基于其arm架构,可以保证容器中是一个干净的arm环境。

docker exec -it xxxxxxx bash

将搭建好的容器导出为arm架构docker镜像

docker export -o test.tar a7db52903c32

这样将得到一个.tar的arm架构docker 镜像文件,将该文件传递到其它arm平台,导入系统将正常运行。