Windows、Ubuntu安装Nextcloud个人网盘搭建环境部署、Nextcloud安装、Nextcloud避坑、Nextcloud优化全攻略,新手保姆级教程
帮小白建自己云盘。看完觉得有用请帮忙 点个赞 ,谢谢!最后更新于22-5-23,合并了最近的一些来信答疑和回复的问题。
用Nginx环境的请看我这一篇:
Nextcloud手动恢复备份文件,见:
Nextcloud的数据备份方案,见文章:
一开篇:折腾记录
二Nextcloud的环境搭建和安装
1. 安装虚拟机
2. 使用putty连接服务器
2.1 准备ubuntu环境
2.2 安装PHP源
2.3 安装apache2及apache2 php库
2.4 安装php8.0和nextcloud用到的php模块
2.5 安装php-imagick缺失文件以及后面用到的ffmpeg,redis
2.6 新建php运行文件夹
2.7 为apache2启用php-fpm并配置php
2.8 重启apache2
2.9 测试php是否安装成功
2.10 启用必须的apache2模块
2.11 安装mariadb数据库
2.12 进入数据库
2.13 修改数据库root用户密码
2.14 新建nextcloud数据库用户并赋予全部权限
2.15 重启数据库
2.16 在sites-available文件夹下新建nextcloud.conf
2.17 设置nextcloud为apache2默认配置文件
2.18 apache2启用ssl
2.19 开启HTTP2
2.20 开始安装nextcloud
2.21 设置网站文件夹权限
2.22 设置Nextcloud的配置文件
三Nextcloud的最后的优化
3.1 为nextcloud启用Cron代替ajax,提高性能
3.2 cron运行出错解决
3.3 解除nextcloud上传文件块大小限制
3.4 nextcloud的php优化
3.5 nextcloud的数据库优化
3.6 启用PHP OPcache
3.7 数据库丢失索引修复命令
实际使用效果请看我上传的手机实际使用视频。
目前使用7个月,没有任何问题。
一开篇:折腾记录
上个月因为临时急需,充值了某度网盘1个月。现在再回到限速状态感觉某度真就是毫无人性,普通用户限速100K是人干的事么!后来又注册了某里网盘,发现有些文件不允许分享,实在是不方便。因为我个人有域名,因此想着干脆自己安装个个人网盘好了。
于是网上搜了搜,比较了国内、国外的一些著名的网盘,有seafile,owncloud,filerun,可道云,Cloudreve等。优劣我这里就不描述了,大家自己去搜搜就好。在试用了几款之后,我最后选择了Nextcloud。Nextcloud的安装比较简单,但是坑也是太多,而且要优化好才能发挥出nextcloud的性能,否则nextcloud默认配置的性能实在是一般。
我一开始是想图省事,先在Windows11 wsl2中安装Ubuntu,再在Ubuntu中安装的nextcloud.谁知道安装好之后,因为WSL2默认的虚拟机网络是内网,无法从宿主机外直接访问。要访问的话还要做主机的端口映射,虚拟机的固定IP什么的,实在是太麻烦。后来好不容易折腾完了,发现重启后的WSL2环境Ubuntu某些配置不保存,而且重启后mysql不能自动运行!要自动运行的话要在windows配置自动启动程序,搞半天感觉太烦了,不值得!WSL2这坑实在是太多了!严重不建议大家在WSL上正式安装nextcloud,但是试玩的话是可以的。
后来我就在windows docker上安装nextcloud。windows版docker最新的基于wsl环境,易于新手使用。本着图省事的原则,直接从docker中下载了nextcloud镜像,搭建很快速,但是发现镜像环境缺少很多基本工具,要补也很麻烦,尤其是对于我们这种熟悉基本知识但是不是程序员的人来说。因此在搭建使用之后,果断弃用,改在docker上安装ubuntu,再安装nextcloud。这个方案开始时各方面都符合要求,也是搭建好后准备正式使用的。结果最后卡在调整docker虚拟磁盘容量上。因为是基于wsl的docker,所以按照官方文档调整磁盘的步骤,前面很顺利,但是在调整linux容量参数上卡住了。bash无法使用resize2fs,安装时发现根本没有apt,啥安装命令也没有,找了一圈也没有找到类似的解决办法,当然可能是我个人知识不足,对别人可能很简单。加上目前wsl环境安装的虚拟机内存占用奇高70%以上,CPU占用经常80%以上。那些说是性能高的人,估计得等微软把这些bug解决了才行。
最后总结windows wsl安装环境,初始安装简单,但是环境复杂,内存\cpu占用奇高,新玩意存在各种不足。直接弃坑!加上windows11的资源管理器延迟很高,部分解码在windows11上也不兼容,最后干脆放弃windows11,改回到了windows10.瞬间感觉日常操作流畅了许多。
我最终的方案是在windows10上使用hyper-v安装Ubuntu服务器,再在上面安装nextcloud。整个过程那是舒服多了,少了很多奇奇怪怪的问题。强烈建议windows环境下安装的小伙伴们直接使用虚拟机来安装!当然,你要是使用linux操作系统就没有这么多麻烦了。鉴于实在是过程太受折磨,避免有类似需求的人再次被坑,决定把整个过程详细写出来,节省大家时间。
二Nextcloud的环境搭建和安装
这里面我把许多后面优化的内容以及避免掉坑的内容也放在了安装里,在安装时一步搞定,省去大家很多不必要的折腾。所以按照教程安装完基本上你不会遇到什么问题了。
我的部署环境为:windows10专业版 + Hyper-v + ubuntu + apache2 + php8.0-fpm + mariadb10 + nextcloud22.2.2, 其中Ubuntu分配内存5G,4核心处理器。
1. 首先安装hyper-v,设置网络交换机,新建外部虚拟交换机,让虚拟机可以直接外部访问
建立虚拟机,因为用的是ubuntu server版,所以选择第一代。其它根据自己情况选择即可。安装完成后,启动服务器。
2. 使用putty连接服务器,我现在用微软的 Termius - SSH platform for Mobile and Desktop ,推荐这款工具,颜值高,用着舒服。然后使用服务器用户名和密码登录。
2.1 更新ubuntu环境
有更换源需求的更换源需求。我中间有更换阿里源,后来安装过程中遇到缺失文件,又更换回了默认源。白天的话速度还可以。首先加载宿主机共享文件夹,是因为如果使用wget工具从nextcloud下载安装包的话速度太慢了,先在windows下使用下载工具下载nextcloud安装包,然后加载到ubuntu下,就能节省很多时间。另外网站SSL证书也提前准备好放在同一个文件夹下。Ps:网上很多加载共享文件夹命令在新版的里面报错mount -t cifs,这是个坑。
sudo apt update
sudo apt install cifs-utils
mount.cifs //192.168.2.3/download /download -o username=xxx,password=xxx //加载宿主机共享文件夹
2.2 安装PHP源
sudo add-apt-repository ppa:ondrej/php
2.3 安装apache2及apache2 php库
apt install apache2
查看apache2状态
service apache2 status/start/stop/restart
2.4 安装php8.0和nextcloud用到的php模块.模块不能一次安装的话可以分开多次安装
sudo apt install php8.0-fpm libapache2-mod-php8.0
sudo apt-get install php8.0-curl php8.0-dom php8.0-mbstring php8.0-imagick php8.0-ldap php8.0-imap php8.0-mysql php8.0-gd php8.0-zip php8.0-bz2 php8.0-intl php8.0-smbclient php8.0-bcmath php8.0-gmp php8.0-apcu php8.0-memcached php8.0-redis php8.0-phar
2.5 安装php-imagick缺失文件以及后面用到的ffmpeg,redis.
sudo apt install libmagickcore-6.q16-6-extra
sudo apt install ffmpeg
sudo apt install redis
2.6 新建php运行文件夹
系统不会自建php8.0-fpm的运行文件夹,需要手工新建,否则php无法运行,原因未知。有些版本无需手动添加,水平有限没有深入查询原因,大家根据运行情况自行使用。
mkdir /run/php/php8.0-fpm
2.7 为apache2启用php-fpm
启用后php配置文件为/etc/php/8.0/fpm/php.ini(路径根据你实际安装路径)
a2enmod proxy_fcgi setenvif
a2enconf php8.0-fpm
修改php配置文件
vim /etc/php/8.0/fpm/php.ini
修改php内存使用和文件上传限制
memory_limit = 2048M
upload_max_filesize = 1000M
post_max_size = 1000M
2.8 重启apache2
systemctl restart apache2
2.9 测试php是否安装成功
在/var/www/html下新建info.php的文件
vim /var/www/html/info.php
输入以下内容,并保存:
<?php echo phpinfo();?>
浏览器中输入localhost,看是否正确输出php信息。能打开php信息页面说明php安装成功。
2.10 启用必须的apache2模块
a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
a2enmod setenvif
systemctl restart apache2 //重启apache2
2.11 安装mariadb数据库
sudo apt install mariadb-server
#重启数据库.正常安装完成后会自动启动,这一步可跳过。
service mysql restart
2.12 进入数据库
mysql
2.13 修改数据库root用户密码
UPDATE mysql.user SET password = PASSWORD('12345678') WHERE USER = 'root';
set password for root@localhost = password('新密码');
FLUSH PRIVILEGES;
MariaDB10.4版本后的修改密码命令:
alter user 'root'@'localhost' identified by '12345678';
FLUSH PRIVILEGES;
2.14 新建nextcloud数据库用户并赋予全部权限
这里千万不要省略with grant option,否则安装的时候报数据库连接或者权限错误。一不小心就掉坑的节奏。
grant all privileges on *.* to 'dbuser'@'%' identified by '12345678' with grant option; //用户名和密码自行修改
FLUSH PRIVILEGES;
exit;
2.15 重启数据库
systemctl restart mysql
2.16 新建nextcloud配置文件
在sites-available文件夹下新建nextcloud.conf文件内容,路径在/etc/apache2/sites-available/nextcloud.conf
vim /etc/apache2/sites-available/nextcloud.conf
并输入以下内容,内容包含了许多优化需要用到的部分,这里直接一次贴出,省得来回修改,请注意第一段可以整合到二,三段中做精简:
<VirtualHost *:80>
DocumentRoot /var/www/nextcloud/
ServerName xxx.xxx
ServerAlias *.xxx.xxx
Redirect permanent / https://xxx.xxx/
Protocols h2 h2c http/1.1
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
Satisfy Any
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerAdmin xxx
ServerName xxx.xxx
DocumentRoot /var/www/nextcloud
Protocols h2 h2c http/1.1
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
Satisfy Any
#防止出现访问错误
RewriteEngine On
RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
</VirtualHost>
2.17 设置nextcloud为apache2默认配置文件
之后系统会自动将刚才编辑的nextcloud.conf文件在sites-available文件夹和sites-enabled文件夹中做个链接
a2ensite nextcloud
2.18 apache2启用ssl
自己存储个人资料照片什么的,强烈建议大家使用SSL,最大程度保证资料安全。实在不想用 ssl的这步省略。
a2enmod ssl
a2ensite default-ssl
编辑default-ssl文件/etc/apache2/sites-available/default-ssl.conf,修改网站目录以及ssl证书路径,修改后保存。
DocumentRoot /var/www/nextcloud/
SSLCertificateFile /etc/ssl/certs/xxx.xxx.pem
SSLCertificateKeyFile /etc/ssl/certs/xxx.xxx.key
将你准备好的ssl证书文件拷贝到以上目录中.这里的/download目录就是本文一开始加载的宿主机目录。特此说明。
cp /download/xxx.xxx.pem /etc/ssl/certs/
cp /download/xxx.xxx.key /etc/ssl/certs/
重新加载apache2,使配置生效
service apache2 reload
2.19 开启HTTP2
提高页面加载访问速度.这一步属于性能优化,写在前面,一次性配置好。启用http2后,要在vhost文件里加上Protocols h2 h2c http/1.1。上文中已经加过了,这里仅作说明。
a2dismod php8.0
a2dismod mpm_prefork
//启用http2
a2enmod mpm_event
a2enmod http2
systemctl restart apache2
验证http2是否启用成功
curl -V //V是大写,结果出现http2,就说明开启成功
2.20 开始安装nextcloud
将下载好的nextcloud安装包拷贝至/var/www/目录下并解压。因为解压包解压出来后就是nextcloud为名的文件夹,所以不需要单独新建nextcloud文件夹。
cp /download/nextcloud.22.2.2.zip /var/www/
cd /var/www
unzip nextcloud.22.2.2.zip
2.21 设置网站文件夹权限
这一步千万不能漏掉!
sudo chown -R www-data:www-data /var/www/nextcloud
2.22 打开浏览器,输入你的域名 https:// xxx.xxx ,或者https://localhost,出现Nextcloud安装页面。填写你的nextcloud管理员用户名和密码,选择mariadb数据库,填写前面设置的数据库用户名和密码,数据库名随便填,然后点击安装。这个界面下会有一个打勾的选项一起安装Nextcloud推荐应用,取消,因为很可能网络问题无法访问Nextcloud应用市场而导致安装时间等待过长。
Ps:建议先设置windows host文件,将你虚拟机的IP地址对应你的域名。
2.22 设置Nextcloud的配置文件
安装完成后,先设置Nextcloud的配置文件,包括了开启内存缓存,开启nextcloud国内应用市场,增加默认电话区域,开启视频预览。
vim /var/www/nextcloud/config/config.php
修改或添加#注释下的块内容:
<?php
$CONFIG = array (
'instanceid' => 'xxxxxxxxx',
'passwordsalt' => 'xxxxxxxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
#添加可以访问的网站域名或者nextcloud主机的IP地址,否则局域网内或者外网访问时会出现请使用合法IP或者域名方可登录的提示
'trusted_domains' =>
array (
0 => 'localhost',
1 => 'xxx.xxx.xxx',
2 => '192.168.1.17',
'datadirectory' => '/var/www/nextcloud/data',
'dbtype' => 'mysql',
'version' => '22.2.2.0',
'overwrite.cli.url' => 'http://localhost/nextcloud',
'dbname' => 'nextcloud',
'dbhost' => 'localhost',
'dbport' => '',
'dbtableprefix' => 'oc_',
'mysql.utf8mb4' => true,
'dbuser' => 'oc_mycloud',
'dbpassword' => 'xxxxxxQ',
'installed' => true,
#防止出现不能https访问问题
'overwriteprotocol' => 'https',
#默认电话区域
'default_phone_region' => 'CN',
#开启缓存,分类型同时使用APCU和REDIS。
'memcache.local' => '\\OC\\Memcache\\APCu',
'filelocking.enabled' => true,
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
'host' => 'localhost',
'port' => 6379,
#增加视频预览,需要提前安装ffmpeg
'enabledPreviewProviders' =>
array (
0 => 'OC\\Preview\\PNG',
1 => 'OC\\Preview\\JPEG',
2 => 'OC\\Preview\\GIF',
3 => 'OC\\Preview\\HEIC',
4 => 'OC\\Preview\\BMP',
5 => 'OC\\Preview\\XBitmap',
6 => 'OC\\Preview\\MP3',
7 => 'OC\\Preview\\TXT',
8 => 'OC\\Preview\\MarkDown',
9 => 'OC\\Preview\\Movie'
#改为国内应用市场
'updater.release.channel' => 'stable',
'appstoreenabled' => true,
'appstoreurl' => 'Nextcloud',
);
保存,然后重启apache2
systemctl restart apache2
三Nextcloud的最后的优化
3.1 为nextcloud启用Cron代替ajax,提高性能
#添加crontab定时任务
crontab -u www-data -e
添加一行,并保存.
*/5 * * * * php -f /var/www/nextcloud/cron.php //每5分钟运行一次
检查效果
crontab -u www-data -l
输出
[snip]
*/5 * * * * php -f /var/www/nextcloud/cron.php
3.2 cron运行出错解决
出错类型为在nextcloud设置-概览中看到系统计划任务超过X小时未运行,请查看....
日志错误:OC\HintException: [0]: Memcache \OC\Memcache\APCu not available for local cache
解决方法,修改/etc/php/8.0/mods-available/apcu.ini
vim /etc/php/8.0/mods-available/apcu.ini
添加,并保存
apc.enable_cli=1
3.3 解除nextcloud上传文件块大小限制
进入nextcloud根目录/var/www/nextcloud,输入
cd /var/www/nextcloud
sudo -u www-data php occ config:app:set files max_chunk_size --value 0
显示以下内容表示成功
Config value max_chunk_size for app files set to 0
同时优化php request time
vim /etc/php/8.0/fpm/php.ini
修改以下参数
php_value max_input_time 3600
php_value max_execution_time 3600
保存,重启php
systemctl restart php8.0-fpm
3.4 nextcloud的php优化
编辑/etc/php/8.0/fpm/pool.d/www.conf,根据服务器内存配置情况填写以下数值(4G内存计算):
vim /etc/php/8.0/fpm/pool.d/www.conf
修改以下参数:
pm = dynamic
pm.max_children = 300
pm.start_servers = 18
pm.min_spare_servers = 6
pm.max_spare_servers = 36
3.5 数据库优化
编辑/etc/php/8.0/fpm/conf.d/20-mysqli.ini
vim /etc/php/8.0/fpm/conf.d/20-mysqli.ini
加入以下内容
[mysql]
mysql.allow_local_infile=On
mysql.allow_persistent=On
mysql.cache_size=2000
mysql.max_persistent=-1
mysql.max_links=-1
mysql.default_port=
mysql.default_socket=/var/lib/mysql/mysql.sock # Debian squeeze: /var/run/mysqld/mysqld.sock
mysql.default_host=
mysql.default_user=
mysql.default_password=
mysql.connect_timeout=60
mysql.trace_mode=Off
数据库优化,编辑/etc/mysql/mariadb.cnf
vim /etc/mysql/mariadb.cnf
加入以下内容
[server]
skip_name_resolve = 1
innodb_buffer_pool_size = 128M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
query_cache_type = 1
query_cache_limit = 2M
query_cache_min_res_unit = 2k
query_cache_size = 64M
tmp_table_size= 64M
max_heap_table_size= 64M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
transaction_isolation = READ-COMMITTED
binlog_format = ROW
innodb_large_prefix=on
innodb_file_format=barracuda