前言

本文记录 LAMP 部署 Nextcloud18 后,解决 Nextcloud 设置中出现的一系列安全与设置警告的过程。较为复杂的是启用 MySQL 4字节支持,上传过较多文件到 Nextcloud 会导致在格式转换时比较耗时,所以如果是新部署的 Nextcloud,尽量在未上传任何文件时解决此问题。

操作环境:
Nextcloud:18.0.2
OS:CentOS Linux release 7.7
Apache:2.4.6
MariaDB:5.5.64
PHP:7.2.24 (cli)


.htaccess 文件不起作用


为 Nextcloud 创建虚拟主机文件

vim /etc/httpd/conf.d/nextcloud.conf

添加如下内容

 <VirtualHost *:80>
  DocumentRoot /var/www/html/nextcloud/ #此处填写 Nextcloud 实际安装路径
  ServerName  your.server.com      #如有域名,填写自己的域名,A 记录需指向服务器

  <Directory /var/www/html/nextcloud/>  #此处填写 Nextcloud 实际安装路径
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews

    <IfModule mod_dav.c>
      Dav off
    </IfModule>

  </Directory>
</VirtualHost>

重启 apache

service httpd restart

上述配置生效后,直接通过服务器 IP 即可访问 Nextcloud

您的网页服务器未正确设置以解析


通过执行上面解决 “.htaccess 文件不起作用” 的步骤可以一并解决此问题

通过 HTTP 访问网站不安全


通过部署 SSL 证书,开启 HTTPS 解决,参考下述文章中开启 HTTPS 部分:
Nextcloud 性能优化

PHP 内存限制低于建议值 512MB

修改 PHP 配置文件php.inimemory_limit为合适值

vim /etc/opt/rh/rh-php72/php.ini #php.ini 目录随 PHP 版本不同而不同

查找memory_limit,将默认的128M更改为512M

内存缓存未配置


修改 Nextcloud 配置文件config.php

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

添加以下配置

'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\APCu',
'redis' => array(
  'host' => 'localhost',
  'port' => 6379,
),

修改 APCu 配置文件,去掉apc.enable_cli的注释,并设置其值为1

vim /etc/opt/rh/rh-php72/php.d/40-apcu.ini

PHP 的组件 OPcache 没有正确配置


修改 PHP Opcache 配置

vim /etc/opt/rh/rh-php72/php.d/10-opcache.ini #配置文件路径和名称随 PHP 版本不同而不同

修改配置如下

opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

数据库丢失了一些索引


在 Nextcloud 目录下使用 occ 命令修复

cd /var/www/html/nextcloud
sudo -u apache php occ db:add-missing-indices
sudo -u apache php occ db:convert-filecache-bigint

所使用的数据库为 MySQL 但没有对4字节字符的支持

确保数据库为Barracuda InnoDB文件格式

mysql -uroot -p  #登录数据库。会提示输入 root 密码,根据实际情况来,如没设置,直接回车
                 #登录成功后,会显示数据库版本,记下来,后续要用到
show variables like 'innodb_file_format';

以上结果表明innodb_file_formatAntelope,执行以下命令在数据库中进行文件格式升级

SET GLOBAL innodb_file_format=Barracuda;
FLUSH PRIVILEGES;
exit;

根据数据库版本进行下一步(本例使用的数据库版本为 MariaDB 5.5.64)

MySQL 8.0 及更高版本 或 MariaDB 10.03 及更高版本

在数据库配置文件中[mysqld]字段下添加如下配置

innodb_file_per_table=1

重启数据库,然后继续后面的 启用 MySQL 4字节支持

MySQL 8.0 之前版本

在数据库配置文件中[mysqld]字段下添加如下配置

innodb_large_prefix=true
innodb_file_format=barracuda
innodb_file_per_table=1

重启数据库,然后继续后面的 启用 MySQL 4字节支持

MariaDB 10.2 之前本版(本例适用的版本)

vim /etc/my.cnf

在数据库配置文件中[mysqld]字段下添加如下配置

innodb_large_prefix=true
innodb_file_format=barracuda
innodb_file_per_table=1

重启数据库

systemctl restart mariadb

进入数据库,查看文件格式是否更改为Barracuda

SELECT NAME, SPACE, FILE_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME like "nextcloud%";

如果文件格式都是Barracuda,继续后面的 启用 MySQL 4字节支持,否则执行以下步骤
(本例在此步骤时,提示Unknown column 'FILE_FORMAT' in 'field list',转向 启用 MySQL 4字节支持 后,解决了问题 )

进入INFORMATION_SCHEMA数据库

USE INFORMATION_SCHEMA;

创建 SQL 命令,批量转换到到Barracuda

SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` ROW_FORMAT=DYNAMIC;") AS MySQLCMD FROM TABLES WHERE TABLE_SCHEMA = "nextcloud";

上述步骤为 nextcloud 数据库中的每个表返回一个 SQL 命令。将返回的所有命令复制到文本编辑器中,用空格替换|,并将所有 SQL 命令复制到 MariaDB 执行
执行结束后,继续后面的 启用 MySQL 4字节支持

启用 MySQL 4字节支持

进入 Nextcloud 文件夹,开启维护模式

cd /var/www/html/nextcloud
sudo -u apache php occ maintenance:mode --on

进入数据库,通过以下命令更改数据库字符集和排序规则

ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

通过以下命令将config.php文件中mysql.utf8mb4配置为真

sudo -u apache php occ config:system:set mysql.utf8mb4 --type boolean --value="true"

通过以下命令运行修复步骤将所有现有表转换为新的排序规则

sudo -u apache php occ maintenance:repair

退出维护模式

sudo -u apache php occ maintenance:mode --off

Last modification:April 18th, 2020 at 09:23 pm