从零开始在 FreeNAS 的 Jail 上安装 NextCloud 并配置 Nginx 作为网页服务器而且 设置SSL证书 使用 https 访问 以及 oc_filecache 修复方法、优化方法

笔者由于FreeNAS(TrueNAS)的ZFS文件系统的功能,想在上面架设NextCloud。本来FreeNAS也自带了NextCloud插件,可是由于国内网络环境的原因,死活安装不上。在某歌一番后查到了这位大神的超详细教程,点此查看原文,在成功后特此记录,并因地制宜,改用了性能更好的Nginx作为网页服务器,另外提供了一些修复方法和优化设置。另外,如果要升级新版本,大神的教程后面有手动的升级的教程,可以作为参考。
为了节省时间可以先下载安装包:点此打开
选择你要安装的版本,选择后缀为.tar.bz2和.tar.bz2.sha512的文件下载,后者是检验文件。

创建FreeNAS的数据集

根据Nextcloud文档,Nextcloud安装需要四个目录:

  1. 配置目录
  2. 数据目录
  3. 数据库
  4. 主题目录
    于是我们创建出以下结构(名字可以不同):
├── UserData
│   └── NextCloudDataBase
└── ── Jails
    ├── nextcloud
    │   ├── config
    │   ├── themes
    │   ├── db
    └── iocage
        ├── ...
        ├── jails
        │   └── nextcloud
        └── ...

创建数据库

在UserData存储池下,创建一个新数据集NextCloudDataBase,注意其中atime值设置为off,这与默认值不同。这样可防止在读取文件时产生日志流量,并显着提高性能,这对于我们的数据文件夹而言很好。在这里插入图片描述

创建NextCloud应用数据集

在UserData存储池下,创建一个新数据集nextcloud,配置和NextCloudDataBase数据集相比,只需打开ATime即可。再在nextcloud数据集下创建三个数据集,分别是config,themes,db。前两个数据集配置与nextcloud数据集的相同,最后一个db数据集配置和NextCloudDataBase数据集配置相同。

创建用户并设置权限

创建mysql用户

找到添加用户选项:
在这里插入图片描述
如图添加mysql用户:
在这里插入图片描述

添加数据集权限

找到nextcloud数据集,点击图中的三个点,出现编辑权限选项。
在这里插入图片描述
在这里插入图片描述
在将db数据集所有者和群组都设置成mysql。
在这里插入图片描述
另外三个目录config,themes,还有NextCloudDataBase如上权限设置成www用户和www群组(www系统自带,无需自己创建)。

创建Jail

使用ssh连接到FreeNAS

首先,到服务中打开SSH,
在这里插入图片描述
,点击动作,为了方便允许root账号登录
在这里插入图片描述
使用SSH工具(这里使用Xshell)连接到FreeNAS。

使用命令行创建Jails

使用以下命令创建Jail。

iocage create -n NextCloud -r 11.3-RELEASE ip4_addr="vnet0|192.168.204.97/24" defaultrouter="192.168.204.1" vnet="on" allow_raw_sockets="1" boot="on"
参数 含义
-n Jail的名字
-r 指定FreeBSD的发行版,根据你的系统确定。如果您的FreeNAS版本为11.1,则需要将11.1-RELEASE作为参数而不是11.3-RELEASE
ip4_addr 设定Jail的IP /掩码(192.168.204.97/24),以及要使用的接口vnet0。根据你的实际状况设定
defaultrouter 默认网关,根据实际情况设定
vnet 启用vnet接口,我们用vnet0作为接口的前置条件
allow_raw_sockets 启用原始套接字,从而启用在Jail内使用诸如ping和traceroute之类的功能,并实现与各种网络子系统的交互。
boot 允许在FreeNAS启动时自动启动Jail。
成功后应返回如下图所示:
在这里插入图片描述

映射目录

使用以下命令在Jail中创建相应的目录

iocage exec NextCloud mkdir -p /mnt/data
iocage exec NextCloud mkdir -p /var/db/mysql
iocage exec NextCloud mkdir -p /usr/local/www/nextcloud/config
iocage exec NextCloud mkdir -p /usr/local/www/nextcloud/themes

再使用下面的命令把Jail中的目录映射到数据集中 (当路径和我设置不同时,记得更改为自己的路径)

iocage fstab -a NextCloud /mnt/UserData/NextCloudDataBase /mnt/data nullfs rw 0 0
iocage fstab -a NextCloud /mnt/Jails/nextcloud/db /var/db/mysql nullfs rw 0 0
iocage fstab -a NextCloud /mnt/Jails/nextcloud/config /usr/local/www/nextcloud/config nullfs rw 0 0
iocage fstab -a NextCloud /mnt/Jails/nextcloud/themes /usr/local/www/nextcloud/themes nullfs rw 0 0

执行成功如下图:
在这里插入图片描述

命令说明:

iocage fstab -a jail名字 数据集路径 Jail路径 nullfs (rw/ro) 0 0

rw / ro是指监狱对已装载数据集的权限;rw为读/写,ro为只读。

如果输错了,要更改输入iocage fstab -e NextCloud,会用vi打开fstab文件,在里面可以更改映射的设置。(vi的使用方法自己百度吧)

最后,我们启动Jail:

iocage start NextCloud

设置FreeNas缓存

zfs set primarycache=metadata Jails/nextcloud/db

这个是FreeNAS针对数据库存储的优化。

设置Jail的DNS

在Jail界面选中刚刚创建的Jail,停止并编辑它。
在这里插入图片描述
如上图将resolver改成none,这样Jail的DNS的设置就和你FreeNAS设置的相同。

设置Jail

使用以下命令来进入Jail的控制台。

iocage console NextCloud

设置软件源(可选)

详细说明参考此处
编辑/usr/local/etc/pkg/repos/FreeBSD.conf文件

FreeBSD: {
    
    
  url: "pkg+http://pkg0.twn.freebsd.org/${ABI}/quarterly",
}

保存文件后,更新源pkg update -f,第一次会比较慢一点,有选项选y就好。

更新源错误解决

关闭本地源

pkg: file:///usr/ports/packages/meta.txz: No such file or directory
repository local has no meta file, using default settings pkg:
file:///usr/ports/packages/packagesite.txz: No such file or directory
Unable to update repository local Error updating repositories!

若提示上述错误,编辑/usr/local/etc/pkg/repos/local.conf文件,修改以下项:

enable: no #关闭本地源

安装所需软件

pkg install nano
pkg install wget ca_root_nss
pkg install nginx
pkg install mariadb104-server
pkg install redis

设置开机启动

sysrc nginx_enable=yes
sysrc mysql_enable=yes
sysrc redis_enable=yes

安装NextCloud文件

将前面的下载好的NextCloud,用WINSCP上传到/mnt/Jails/iocage/jails/NextCloud/root/tmp
然后,使用命令检验文件完整性

cd /tmp
shasum -a 512 -c nextcloud-20.0.1.tar.bz2.sha512

如果返回OK,则没有问题,下一步,不然你需要重新下载并上传。

然后我们解压到/usr/local/www/nextcloud,然后给www添加权限。

tar -xf nextcloud-20.0.1.tar.bz2 -C /usr/local/www
chown -R www:www /usr/local/www/nextcloud

设置数据库MYSQL(MARIADB)

修改配置

在继续之前,我们需要修改MySQL配置以在正确的位置创建一个套接字。打开/usr/local/etc/mysql/my.cnf如下:

nano /usr/local/etc/mysql/my.cnf

现在找到显示以下内容的行:

socket  = /var/run/mysql/mysql.sock

对其进行修改以匹配以下内容:

socket  = /tmp/mysql.sock

现在保存并退出(Ctrl + X),并按回车。

配置MySQL

启动MySQL服务并完成设置过程:

service mysql-server start
mysql_secure_installation --socket=/tmp/mysql.sock

注意:如果此时出现以下错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

请遵循以下步骤:1. 按Ctrl + C停止脚本
2. 输入以下命令以停止mysql服务器

/usr/local/etc/rc.d/mysql-server stop
  1. 然后输入以下命令:
mysqld_safe --skip-grant-tables & 
/usr/local/etc/rc.d/mysql-server start
  1. 再次按Ctrl + C停止脚本,再重新运行向导脚本。
  2. 如果出现Enter current password for root (enter for none):则说明没有问题。

我们现在没有密码,直接回车,然后如下图提示输入y
在这里插入图片描述
输入你的数据库密码进行设置,后面要用,别忘了
注:输入密码是看不见反馈的,输完按回车就行了
后面一直按y就行。
在这里插入图片描述
接下来,我们创建NextCloud所需的数据库。
登陆到MySQL,输入刚刚设置的密码:

mysql -u root -p

然后一行接一行地输入以下命令:

CREATE DATABASE nextcloud;
CREATE USER 'nextcloud_admin'@'localhost' IDENTIFIED BY '改成刚刚设置的密码';
GRANT ALL ON nextcloud.* TO 'nextcloud_admin'@'localhost';
FLUSH PRIVILEGES;
exit

MqSQL就配置好了

注:上传文件性能优化

在exit前,设置innodb_flush_log_at_trx_commit变量为0或2,默认为1。

set GLOBAL innodb_flush_log_at_trx_commit = 0;

说明:这个变量设定了log写入硬盘的方式。0代表每隔1秒把log写入硬盘、1代表每次新增log都会写入硬盘、2代表不定时写到文件系统缓存,而不同文件系统真正写入硬盘时间不同。
所以,1是最安全的,但对硬盘性能要求很高,对安全性要求比较高时启用
使用0最多丢失1s的数据。但性能会提升十多倍,对安全性要求不高时,推荐设置。

安装并配置PHP

安装PHP

用以下命令将安装PHP 8.1和Nextcloud运行所需的软件包:

pkg install php81 php81-bz2 php81-ctype php81-curl php81-dom php81-exif php81-fileinfo php81-filter php81-gd php81-iconv php81-intl php81-ldap php81-mbstring php81-opcache php81-pdo php81-pdo_mysql php81-pecl-APCu php81-pecl-imagick php81-pecl-redis php81-posix php81-session php81-simplexml php81-xml php81-xmlreader php81-xmlwriter php81-xsl php81-zip php81-zlib php81-bcmath php81-gmp php81-pecl-smbclient php81-ftp

注:要使用更新版本的PHP时,首先要停止nginx与php-fpm服务,直接安装新版本的包即可。此处查看官方推荐版本

刚刚应该已经与php一起安装了php-fpm,所以,将其添加到启动脚本(rc.conf)中,然后启动php-fpm服务:

sysrc php_fpm_enable=yes
service php-fpm start

配置PHP.INI

先移动到

cd /usr/local/etc

再根据模板复制一份php配置,并编辑它(用WINSCP也行)

cp php.ini-production php.ini
nano /usr/local/etc/php.ini

在nano(Ctrl + W)中使用搜索命令取消注释,并确保以下参数具有这些值。删除在该行的开头的“;”即可删除注释:

cgi.fix_pathinfo=1
date.timezone ="Asia/Shanghai"
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1

这些值与上传文件有关,根据自己需要设定:

max_execution_time = 0         #默认是30秒,改为0,表示没有上传时间限制
memory_limit = 1024M
post_max_size = 10240M
upload_max_filesize = 10240M

#上传缓存目录,默认是本机的/tmp。推荐设置到与/mnt/data相同硬盘的目录
upload_tmp_dir = 

nano保存并退出:

Ctrl + X
Y
ENTER

另外,配置文件/usr/local/etc/php-fpm.d/www.conf,取消下面项的注释

clear_env = no

重新启动php-fpm

service php-fpm restart

设置Nginx和SSL证书

使用WINSCP在/mnt/Jails/iocage/jails/NextCloud/root/usr/local/etc/nginx下新建文件nextcloud.conf输入以下配置
注:如果你端口转发的端口与下面listen的端口不同,请更改至相同,否则会出现报错,如下图在这里插入图片描述
最新的nginx设置参考官方文档:

upstream php-handler {
    
    
    server 127.0.0.1:9000;
    #server unix:/var/run/php/php7.4-fpm.sock;
}

# Set the `immutable` cache control options only for assets with a cache busting `v` argument
map $arg_v $asset_immutable {
    
    
    "" "";
    default "immutable";
}


server {
    
    
    listen 80;
    listen [::]:80;
    server_name 换成你证书对应的域名;

    # Prevent nginx HTTP Server Detection
    server_tokens off;

    # Enforce HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    
    
    listen 443      ssl http2;
    listen [::]:443 ssl http2;
    server_name 换成你证书对应的域名;

    # Path to the root of your installation
    root /usr/local/www/nextcloud;


    # Use Mozilla's guidelines for SSL/TLS settings
    # https://mozilla.github.io/server-side-tls/ssl-config-generator/
    ssl_certificate 换成你证书对应的pem文件路径;
    ssl_certificate_key 换成你证书对应的key文件路径;

    # Prevent nginx HTTP Server Detection
    server_tokens off;

    # HSTS settings
    # WARNING: Only add the preload option once you read about
    # the consequences in https://hstspreload.org/. This option
    # will add the domain to a hardcoded list that is shipped
    # in all major browsers and getting removed from this list
    # could take several months.
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;

    # set max upload size and increase upload timeout: 上传相关设置
    client_max_body_size 102400M;
    client_body_timeout 14400s;
    fastcgi_buffers 64 4K;

    # upload accelerate 上传加速设置
    client_body_buffer_size 10240M;

    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

    # Pagespeed is not supported by Nextcloud, so if your server is built
    # with the `ngx_pagespeed` module, uncomment this line to disable it.
    #pagespeed off;

    # HTTP response headers borrowed from Nextcloud `.htaccess`
    add_header Referrer-Policy                      "no-referrer"   always;
    add_header X-Content-Type-Options               "nosniff"       always;
    add_header X-Download-Options                   "noopen"        always;
    add_header X-Frame-Options                      "SAMEORIGIN"    always;
    add_header X-Permitted-Cross-Domain-Policies    "none"          always;
    add_header X-Robots-Tag                         "none"          always;
    add_header X-XSS-Protection                     "1; mode=block" always;

    # Remove X-Powered-By, which is an information leak
    fastcgi_hide_header X-Powered-By;

    # Specify how to handle directories -- specifying `/index.php$request_uri`
    # here as the fallback means that Nginx always exhibits the desired behaviour
    # when a client requests a path that corresponds to a directory that exists
    # on the server. In particular, if that directory contains an index.php file,
    # that file is correctly served; if it doesn't, then the request is passed to
    # the front-end controller. This consistent behaviour means that we don't need
    # to specify custom rules for certain paths (e.g. images and other assets,
    # `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
    # `try_files $uri $uri/ /index.php$request_uri`
    # always provides the desired behaviour.
    index index.php index.html /index.php$request_uri;

    # Rule borrowed from `.htaccess` to handle Microsoft DAV clients
    location = / {
    
    
        if ( $http_user_agent ~ ^DavClnt ) {
    
    
            return 302 /remote.php/webdav/$is_args$args;
        }
    }

    location = /robots.txt {
    
    
        allow all;
        log_not_found off;
        access_log off;
    }

    # Make a regex exception for `/.well-known` so that clients can still
    # access it despite the existence of the regex rule
    # `location ~ /(\.|autotest|...)` which would otherwise handle requests
    # for `/.well-known`.
    location ^~ /.well-known {
    
    
        # The rules in this block are an adaptation of the rules
        # in `.htaccess` that concern `/.well-known`.

        location = /.well-known/carddav {
    
     return 301 /remote.php/dav/; }
        location = /.well-known/caldav  {
    
     return 301 /remote.php/dav/; }

        location /.well-known/acme-challenge    {
    
     try_files $uri $uri/ =404; }
        location /.well-known/pki-validation    {
    
     try_files $uri $uri/ =404; }

        # Let Nextcloud's API for `/.well-known` URIs handle all other
        # requests by passing them to the front-end controller.
        return 301 /index.php$request_uri;
    }

    # Rules borrowed from `.htaccess` to hide certain paths from clients
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  {
    
     return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                {
    
     return 404; }

    # Ensure this block, which passes PHP files to the PHP process, is above the blocks
    # which handle static assets (as seen below). If this block is not declared first,
    # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
    # to the URI, resulting in a HTTP 500 error response.
    location ~ \.php(?:$|/) {
    
    
        # Required for legacy support
        rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;

        fastcgi_max_temp_file_size 0;
    }

    location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
    
    
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463, $asset_immutable";
        access_log off;     # Optional: Don't log access to assets

        location ~ \.wasm$ {
    
    
            default_type application/wasm;
        }
    }

    location ~ \.woff2?$ {
    
    
        try_files $uri /index.php$request_uri;
        expires 7d;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }

    # Rule borrowed from `.htaccess`
    location /remote {
    
    
        return 301 /remote.php$request_uri;
    }

    location / {
    
    
        try_files $uri $uri/ /index.php$request_uri;
    }
}

然后在同目录下的nginx.conf中包含该文件

include  nextcloud.conf;

在这里插入图片描述
保存,并重启Nginx

service nginx restart

设置NextCloud

设置好端口转发后,在浏览器输入你的域名:端口,应该就可以看到NextCloud的初始化页面了。
在这里插入图片描述
输入自己的账号,并配置以下信息:

/mnt/data
nextcloud_admin
之前数据库设置的密码
nextcloud
localhost:/tmp/mysql.sock

在这里插入图片描述

配置缓存REDIS

为了提升性能,我们配置内存缓存REDIS。
首先,我们将REDIS设置为本地监听。

nano /usr/local/etc/redis.conf

将port改成0

port 0

并删除“#”,来取消注释,并修改对应的值

unixsocket /var/run/redis/redis.sock
unixsocketperm 770

重启redis

service redis restart

确认Redis配置正确

运行

ls -al /var/run/redis

若出现类似于

srwxrwx---  1   redis   redis   0   MMM     D   HH:MM   redis.sock

则配置正确,若没有出现或不是srwxrwx—,则有问题,认真确认上面的配置。

然后将redis应用到NextCloud上

su -m www -c 'php /usr/local/www/nextcloud/occ config:system:set redis host --value="/var/run/redis/redis.sock"'
su -m www -c 'php /usr/local/www/nextcloud/occ config:system:set redis port --value=0 --type=integer'
su -m www -c 'php /usr/local/www/nextcloud/occ config:system:set memcache.local --value="\OC\Memcache\APCu"'
su -m www -c 'php /usr/local/www/nextcloud/occ config:system:set memcache.locking --value="\OC\Memcache\Redis"'

将www用户添加到redis组以允许其访问redis:

pw usermod www -G redis

重启Nginx

service nginx restart

优化NextCloud

配置Cron文件

先将环境编辑器更改为nano,然后配置“ www”用户的crontab,

setenv EDITOR nano
//当执行上面的命令出现command not found: setenv时, 换下面这句
export EDITOR=nano

crontab -u www -e

写入以下内容来运行nextcloud cron脚本。

  */5      *       *       *       *       /usr/local/bin/php -f /usr/local/www/nextcloud/cron.php  --define apc.enable_cli=1

然后在NextCloud中选择Cron作为后台任务在这里插入图片描述

上传性能优化

FreeNas设置(参考

内存脏数据缓冲区设置

参考这位大佬文章,调整合适缓存区。

  1. 进入FreeNAS Web管理页面-系统(System)-微调(Tunables)
  2. 添加(ADD)一条规则
  3. 变量(Variable)为vfs.zfs.dirty_data_max
  4. 值为(Value)1073741824
  5. 选择类型(Type)为sysctl
  6. 点击保存(SAVE)
  7. 最后重启FreeNAS
    注:值单位为byte,此处的值等效为1GB,合适的值需要测试得出。
数据块大小

调整pool的数据块大小:

  1. 进入FreeNAS Web管理页面-存储(Seagate)-存储池(pools)
  2. 点击pool最右边的三个点,选择编辑选项
  3. 翻到最下面的记录大小,设置为1M(最好测试一下最快的大小)
  4. 点击保存(SAVE)

php、nginx、mysql设置

上文中已写,去对应部分查找。

nextcloud设置

nextcloud是分块上传的,分块默认值为 10485760 (10 MB)这个值太小,受硬盘IO限制,速度会低。

  • 设置分块为256MB
su -m www -c 'php /usr/local/www/nextcloud/occ config:app:set files max_chunk_size --value 268435456'
  • 当设置为0时,不分块上传。
su -m www -c 'php /usr/local/www/nextcloud/occ config:app:set files max_chunk_size --value 0'

启用FreeBSD的系统安全模块

FreeBSD自带有以下的安全选项控制:

  1. 隐藏以其他用户身份运行的进程
  2. 隐藏以其他组身份运行的进程
  3. 禁止为非特权用户读取内核消息缓冲区
  4. 为非特权用户禁用过程调试功能
  5. 随机化新创建进程的PID
  6. 在可扩展段之前插入堆栈保护页面
  7. 启动时清理/ tmp文件系统
  8. 禁用打开syslogd网络套接字(禁用远程日志记录)
  9. 禁用SendMail服务

建议应全部启用这些功能,除非有充分的理由不这样做。一个很好的例子是,如果您有一个远程日志记录服务器,则要禁用选项8(以便启用打开syslogd网络套接字)。我们将如下配置它们。首先,打开内核参数配置文件:nano /etc/sysctl.conf,输入以下命令,这些命令将启用选项1-6。

security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=$(jot -r 1 9999)
security.bsd.stack_guard_page=1

要启用选项7-9,请运行以下命令:

sysrc clear_tmp_enable=YES
sysrc sendmail_enable="NONE"
sysrc sendmail_submit_enable="NO"
sysrc sendmail_outbound_enable="NO"
sysrc sendmail_msp_queue_enable="NO"
sysrc syslogd_flags="-c -ss"

注:Nextcloud并不是使用SendMail启用发送邮件; 因为,它有自己的库来发送。

设置NextCloud默认语言和地区为简体中文

输入以下命令即可:

su -m www -c 'php /usr/local/www/nextcloud/occ config:system:set default_language --value="zh_CN"'

其他语言可以从这里查询然后对应更改。

手动更新Nextcloud

  1. 根据官方文档更新器下载文件在用户数据文件夹中,在本文中即是/mnt/data。触发更新器后,会在该目录发现updater-xxxx(随机代号)目录。
  2. 使用自带的更新器经常会下载不完整。如果更新器下载失败,让你进行重试。可以看到updater-xxxx(随机代号)目录中有downloads目录,里面即下载的新版本Nextcloud。
  3. 自己下载完整的新版本Nextcloud,先点击重试后,复制完整版的覆盖downloads目录中老的或覆盖后尝试多点击几下重试。等一会就可以跳过下载,更新器直接进入下一步。接着完成更新即可。

修复Nextcloud

维护模式

进入:

su -m www -c 'php /usr/local/www/nextcloud/occ maintenance:mode --on'

退出:

su -m www -c 'php /usr/local/www/nextcloud/occ maintenance:mode --off'

oc_filecache表损坏

进入数据库:

mysql -uroot -p
use nextcloud

清空cache表:

TRUNCATE TABLE oc_filecache;

如果出现oc_filecache doesn’t exist in engine之类的错误,可以重建这个表。

DROP TABLE IF EXISTS `oc_filecache`;

CREATE TABLE `oc_filecache` (
  `fileid` bigint(20) NOT NULL AUTO_INCREMENT,
  `storage` bigint(20) NOT NULL DEFAULT 0,
  `path` varchar(4000) COLLATE utf8mb4_bin DEFAULT NULL,
  `path_hash` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
  `parent` bigint(20) NOT NULL DEFAULT 0,
  `name` varchar(250) COLLATE utf8mb4_bin DEFAULT NULL,
  `mimetype` bigint(20) NOT NULL DEFAULT 0,
  `mimepart` bigint(20) NOT NULL DEFAULT 0,
  `size` bigint(20) NOT NULL DEFAULT 0,
  `mtime` bigint(20) NOT NULL DEFAULT 0,
  `storage_mtime` bigint(20) NOT NULL DEFAULT 0,
  `encrypted` int(11) NOT NULL DEFAULT 0,
  `unencrypted_size` bigint(20) NOT NULL DEFAULT 0,
  `etag` varchar(40) COLLATE utf8mb4_bin DEFAULT NULL,
  `permissions` int(11) DEFAULT 0,
  `checksum` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`fileid`),
  UNIQUE KEY `fs_storage_path_hash` (`storage`,`path_hash`),
  KEY `fs_parent_name_hash` (`parent`,`name`),
  KEY `fs_storage_mimetype` (`storage`,`mimetype`),
  KEY `fs_storage_mimepart` (`storage`,`mimepart`),
  KEY `fs_storage_size` (`storage`,`size`,`fileid`),
  KEY `fs_mtime` (`mtime`)
) ENGINE=InnoDB AUTO_INCREMENT=727173 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=COMPRESSED;

最后,退出mysql,重新扫描文件。

su -m www -c 'php /usr/local/www/nextcloud/occ files:scan --all'

清除删除文件

删除所有用户的已删除文件

su -m www -c 'php /usr/local/www/nextcloud/occ trashbin:cleanup --all-users'

删除群组文件夹的已删除文件

su -m www -c 'php /usr/local/www/nextcloud/occ groupfolders:trashbin:cleanup'

错误提示 Memcache \OC\Memcache\APCu not available for local cache (Is the matching PHP module installed and enabled?)

root/usr/local/etc/php/ext-20-apcu.ini末尾添加

apc.enable_cli=1

然后重启service php-fpm restart

反向代理

笔者使用了nginxproxymanager来进行反向代理,这个项目很方便。具体设置如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重点是Custom Nginx Configuration,这里主要和上传大文件有关系

# 上传大小不限制
client_max_body_size 0;
# 关闭缓存,否则上传数据会在反代主机缓存
proxy_buffering off;
proxy_request_buffering off;
proxy_max_temp_file_size 0;

# 设置超时时间4h,避免大文件上传时间过长导致失败
proxy_connect_timeout 14400s;
proxy_read_timeout 14400s;
keepalive_timeout  14400s;

# 上传优化
sendfile        on;

#Nextcloud要求的安全设置
location /.well-known/carddav {
    
    
    return 301 $scheme://$host/remote.php/dav;
}

location /.well-known/caldav {
    
    
    return 301 $scheme://$host/remote.php/dav;
}

全局搜索

使用Elasticsearch引擎做搜索,官方指导文档

  1. 应用商店下载插件
    安装Full text search和Full text search - Elasticsearch Platform
    在这里插入图片描述
  2. 在Docker安装Elasticsearch
    官网查看最新版本拉取最新镜像。笔者当时版本:8.2.0
//拉取
docker pull elasticsearch:8.2.0
//运行
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.2.0

参数解释

-d:后台启动
–name:容器名称
-p:端口映射
-e:设置环境变量 discovery.type=single-node
如果启动不了,可以加大内存设置:-e ES_JAVA_OPTS=“-Xms512m -Xmx512m”

注:ES8默认开启了ssl认证,导致必须使用https访问9200端口。
修改/usr/share/elasticsearch/config/elasticsearch.yml 的配置:xpack.security.enabled:把true改成false,然后重启容器。

  1. 安装ingest-attachment
docker exec -it es bash

./bin/elasticsearch-plugin install https://artifacts.elastic.co/downloads/elasticsearch-plugins/ingest-attachment/ingest-attachment-8.2.0.zip
  1. 安装ik中文分词器
    在github查看对应版本进行下载,最好与elasticsearch版本相对应
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip

重启容器后,插件才能应用。
可以使用postman测试一下分词器,具体看此处

地址:http://ip地址:9200/_analyze
Body:raw(JSON)
{
“analyzer”:“ik_max_word”,
“text”:“中华人民共和国”
}

正常结果: 看到分词
5. 在NextCloud中配置连接和分词器
在这里插入图片描述
IK分词有这些参数:

  • ik_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合
  • ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」
  1. 扫描文件建立索引
//测试配置
su -m www -c 'php /usr/local/www/nextcloud/occ fulltextsearch:test'

//开始索引
su -m www -c 'php /usr/local/www/nextcloud/occ fulltextsearch:index'

猜你喜欢

转载自blog.csdn.net/Reven_L/article/details/109316209
今日推荐