nextcloud是一款开源私有云方案,GitHub开源地址:Nextcloud,也就是说,可以用nextcloud来搭建私有同步网盘。

之前就有搭建私有网盘的需求,毕竟国外网盘容量小,速度慢,国内目前也就只有115和百度云在苟延残喘,115已是半残,百度云限速不说,还会将小姐姐变成8秒教育片,先不论这种偷窥个人网盘隐私的行为是否违法,要知道百度云删除这些东西的时候可没有告知用户,更不用说任何的提醒和交流了,把资料,特别是涉及个人隐私的资料放在百度云实在是放心不下。

总的来看目前公有网盘大都不能满足需求,也就催生了一大批开源私有网盘,nextcloud就是其中之一。

搭建私有网盘,我一开始用的是seafile,毕竟开源,并且是国人开发,感觉本地化工作会做得更好,中文文档也会更好读,而且企业版只要3个人以下使用就是免费的,可以说很良心了,当然了,缺点还是有的,就是界面太丑。

起初按照文档搭建seafile,两天时间反反复复看文档查教程也没成功,最后实在没耐心放弃了。

而后准备转战owncloud,不过在了解一番之后,发现有个owncloud的继承者:nextcloud,据说是owncloud的团队脱离出来后开发的一个网盘,不过nextcloud在很大程度上跟owncloud很像,甚至可以说就是owncloud了,不过按照很多人的说法,nextcloud似乎更良心(这是看了这么多对比文章之后给我的感觉),所以就直接用上nextcloud了。

事实上,搭建nextcloud更好的方式是通过docker搭建,不过之前的seafile搭建失败,很大一部分原因就是因为用了以前没接触过的docker,所以这次就直接搭建,等熟悉之后再用docker。

如果可以的话,还是推荐使用docker搭建。

环境搭建

nextcloud存在网页前端,所以可以配置lnmp环境,以启用网页前端。

MySQL

首先需要配置源,进入MariaDB官网定制MariaDB的官方源,选择合适MariaDB版本。如CentOS 7选择:CentOS > CentOS 7 (x86_64) > 10.3 [Stable],配置源的方法在官网页面选择源之后,页面下方会显示出来。

选择版本

之后将官网的配置复制下来,添加为源:

 1# 编辑源
 2vim /etc/yum.repos.d/MariaDB.repo
 3
 4# 将复制来的配置填入
 5# MariaDB 10.2 CentOS repository list - created 2018-01-27 07:39 UTC
 6# http://downloads.mariadb.org/mariadb/repositories/
 7[mariadb]
 8name = MariaDB
 9baseurl = http://yum.mariadb.org/10.3/centos7-amd64
10gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
11gpgcheck=1
12
13# 安装MariaDB
14yum install MariaDB-server -y
15
16# 启动服务并设置开机启动
17systemctl start mariadb
18systemctl enable mariadb

之后是设置MariaDB 此步,主要是MariaDB的安全设置,第一次安装mysql需要运行此命令:

1mysql_secure_installation

因为是初次设置MariaDB,root密码是空的,所以在要求输入密码时直接回车,数据库相关设置里面直接全都输入y就行了

输出示例
 1Setting the root password ensures that nobody can log into the MariaDB
 2root user without the proper authorisation.
 3
 4# 是否设置root密码,建议设置密码以提高安全性,输入y并回车
 5Set root password? [Y/n] y
 6
 7# 设置密码
 8New password:
 9
10# 再次输入密码
11Re-enter new password:
12
13# 下面是数据库相关设置
14...
15Remove anonymous users? [Y/n] y          # 删除匿名用户
16...
17
18Disallow root login remotely? [Y/n] y    # 禁止root远程登录
19...
20
21Remove test database and access to it? [Y/n] y    # 删除test数据库
22...
23
24Reload privilege tables now? [Y/n] y     # 刷新权限
25...
26Thanks for using MariaDB!

Php-fpm

安装php用webtatic源,更新较快,且其命名有自己的特色方式,可以避免与其他源的某些冲突

 1# 配置PHP源
 2rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
 3rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
 4
 5# 安装PHP以及PHP扩展
 6yum install php72w-fpm -y
 7yum install php72w-gd php72w php72w-mysqlnd php72w-pdo php72w-mcrypt php72w-mbstring php72w-xmlrpc php72w-intl php72w-devel php72w-pecl-imagick php72w-process php72w-xml php72w-opcache -y
 8
 9# 启动服务并设置开机启动
10systemctl start php-fpm
11systemctl enable php-fpm
出现Requires: libMagickWand.so.5()(64bit)的解决办法

如果在安装过程中出现以下错误提示:

Error: Package: php-magickwand-1.0.9-6.el7.x86_64 (epel) Requires: libMagickWand.so.5()(64bit)

就去掉php扩展中的php72w-pecl-imagick把其他扩展先装上,然后按照以下方式安装此扩展:

1yum install ImageMagick ImageMagick-devel gcc

如果装不了gcc就用这个命令:

1yum install gcc gcc-c++ autoconf automake

最后再安装imagick

1pecl install imagick
2echo "extension=imagick.so" >> /etc/php.ini
3systemctl restart php-fpm

安装好后需要进行配置,先替换以下内容:

 1# 编辑配置文件
 2vim /etc/php.ini
 3
 4
 5######### 修改以下内容 #########
 6
 7;cgi.fix_pathinfo=1
 8# 改为
 9cgi.fix_pathinfo=0
10
11memory_limit = 64M
12# 改为
13memory_limit = 512M

说明

  1. 修改cgi.fix_pathinfo的值是为了避免nginx文件类型错误解析漏洞
  2. nextcloud的运行建议使用512M以上的内存限制
使用socket方式连接php-fpm和mysql

对于php-fpm和mysql来说,相比于使用端口链接,使用socket方式连接数据库可以获得更好的性能,唯一的缺点就是使用socket连接的php-fpm和mysql必须部署在同一台主机内。

这一个配置不是必须的,酌情选择。

如果需要使用socket方式连接php-fpm和mysql,则还需要增加以下配置

 1# 编辑配置文件
 2vim /etc/php.ini
 3
 4# 在[Pdo_mysql]下方添加一行,如果没有[Pdo_mysql]这一行,则自行加入
 5pdo_mysql.default_socket = /dev/shm/mysql.sock
 6
 7
 8# 编辑配置文件
 9vim /etc/my.cnf
10
11# 在[mysqld]下方添加一行,与上面的配置同理
12socket = /dev/shm/mysql.sock

另外/etc/php-fpm.d/www.conf也需要改动,改动的地方较多,就不一一列举,改动后的文件如下(已去除注释行和空行):

 1[www]
 2user = nginx
 3group = nginx
 4listen = /dev/shm/php-cgi.sock
 5listen.owner = nginx
 6listen.group = nginx
 7listen.allowed_clients = 127.0.0.1
 8pm = static
 9
10# 如果内存较小,例如512M,则下面的12可以改为4,同时不建议在这么小的机子上跑这么重的php-fpm
11pm.max_children = 12
12
13slowlog = /var/log/php-fpm/www-slow.log
14env[HOSTNAME] = $HOSTNAME
15env[PATH] = /usr/local/bin:/usr/bin:/bin
16env[TMP] = /tmp
17env[TMPDIR] = /tmp
18env[TEMP] = /tmp
19php_admin_value[error_log] = /var/log/php-fpm/www-error.log
20php_admin_flag[log_errors] = on
21php_admin_value[memory_limit] = 512M
22php_value[session.save_handler] = files
23php_value[session.save_path]    = /var/lib/php/session
24php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

以上是我个人在用的配置,修改后可以通过以下命令查看生效的配置:

1sed '/^;\|^$/d' /etc/php-fpm.d/www.conf

php-fpm有个很好用的插件:opcache。opcache能极大加快php脚本的执行速度,最核心的思想就是使用缓存,关于opcache的介绍很多,这里直接搬一个现成的:

Opcache 的前生是 Optimizer+ ,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。 Optimizer+ 将PHP代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速PHP的执行。

上面已经安装了php-opcache,添加个配置进行启用就可以了,编辑配置文件:

1vim /etc/php.d/opcache.ini

然后按照nextcloud的提示,修改opcache的配置如下:

1[opcache]
2zend_extension=opcache.so
3opcache.enable=1
4opcache.enable_cli=1
5opcache.interned_strings_buffer=8
6opcache.max_accelerated_files=10000
7opcache.memory_consumption=128
8opcache.save_comments=1
9opcache.revalidate_freq=1

然后重启php-fpm即可生效

1systemctl restart php-fpm

Nginx

官方nginx有两个版本,mainline和stable,即开发版和稳定版,区别是前者引入新特性但可能有新bug,后者足够稳定。事实上,两者均比较稳定,nginx的网站总是运行在mainline版上,不过还是推荐新手选择稳定版。

 1# 编辑repo文件
 2vim /etc/yum.repos.d/nginx.repo
 3
 4# 写入如下内容
 5[nginx]
 6name=nginx repo
 7baseurl=http://nginx.org/packages/centos/7/$basearch/
 8gpgcheck=0
 9enabled=1
10
11# 安装nginx
12yum install nginx -y
13
14# 启动服务并设置开机启动
15systemctl start nginx
16systemctl enable nginx

这时lnmp环境就安装成功了。

安装Nginx之后存在一个默认配置,只要前面配置没有错误,那么nginx启动之后就可打开默认网页。

直接用浏览器打开主机IP地址或者域名,就可以看到nginx的欢迎页面,说明nginx已经在工作了。

假设IP地址为1.2.3.4,域名为pan.wenjinyu.me ,能用域名打开的前提是已经设置了解析,不知道怎么设置解析可以移步设置域名解析:给域名设置一些实用有趣的二级域名

nginx安装成功后的欢迎界面

此时lnmp环境就安装完成了。

安装

nextcloud可以直接从 官网 下载,只需要进行简单的配置就可以直接使用。

例如当前的最新版本是18.0.4,则运行:

1mkdir /var/www
2cd /var/www/
3wget https://download.nextcloud.com/server/releases/nextcloud-18.0.4.zip
4unzip nextcloud-*.zip
5chown -R nginx:nginx /var/www/nextcloud

配置

Nginx

先添加一个配置文件

1vim /etc/nginx/conf.d/nextcloud.conf

然后添加下列内容

 1upstream php-handler {
 2    server                  unix:/dev/shm/php-cgi.sock;
 3}
 4
 5server {
 6    listen                  443 ssl;
 7    server_name             netdisk.wenjinyu.me;
 8    ssl_certificate         /etc/letsencrypt/live/netdisk.wenjinyu.me/fullchain.pem;
 9    ssl_certificate_key     /etc/letsencrypt/live/netdisk.wenjinyu.me/privkey.pem;
10    add_header              Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
11    add_header              X-Content-Type-Options nosniff;
12    add_header              X-XSS-Protection "1; mode=block";
13    add_header              X-Robots-Tag none;
14    add_header              X-Download-Options noopen;
15    add_header              X-Permitted-Cross-Domain-Policies none;
16    add_header              Referrer-Policy "no-referrer";
17    add_header              X-Frame-Options SAMEORIGIN;
18    add_header              Cache-Control "public, max-age=15778463";
19    root                    /var/www/nextcloud/;
20    error_log               /var/log/wenjinyu/nextcloud-error.log;
21
22    location = /robots.txt {
23        allow               all;
24        log_not_found       off;
25        access_log          off;
26    }
27
28    location = /.well-known/carddav {
29      return                301 $scheme://$host/remote.php/dav;
30    }
31
32    location = /.well-known/caldav {
33      return                301 $scheme://$host/remote.php/dav;
34    }
35
36    client_max_body_size    512M;
37    fastcgi_buffers         64 4K;
38    proxy_buffering         off;
39    gzip                    on;
40    gzip_vary               on;
41    gzip_comp_level         4;
42    gzip_min_length         256;
43    gzip_proxied            expired no-cache no-store private no_last_modified no_etag auth;
44    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/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;
45
46    location / {
47        rewrite             ^ /index.php$request_uri;
48    }
49
50    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
51        deny                all;
52    }
53
54    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
55        deny                all;
56    }
57
58    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
59        fastcgi_split_path_info     ^(.+?\.php)(/.*)$;
60        include                     fastcgi_params;
61        fastcgi_param               SCRIPT_FILENAME $document_root$fastcgi_script_name;
62        fastcgi_param               PATH_INFO $fastcgi_path_info;
63        fastcgi_param               HTTPS on;
64        fastcgi_param               modHeadersAvailable true;
65        fastcgi_param               front_controller_active true;
66        fastcgi_pass                php-handler;
67        fastcgi_intercept_errors    on;
68        fastcgi_request_buffering   off;
69    }
70
71    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
72        try_files                   $uri/ =404;
73        index                       index.php;
74    }
75
76    location ~ \.(?:css|js|woff|svg|gif)$ {
77        try_files                   $uri /index.php$request_uri;
78        access_log                  off;
79    }
80
81    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
82        try_files                   $uri /index.php$request_uri;
83        access_log                  off;
84    }
85}
86
87server
88{
89    listen              80;
90    server_name         netdisk.wenjinyu.me;
91    return              301 https://$server_name$request_uri;
92}

注意要将其中的域名改成自己的域名,如果没有按照本教程的路径放置nextcloud文件夹,还需要修改网站根目录的路径,需要修改的地方已经在上面标出来了。

改完后重载nginx:

1nginx -s reload

MySQL

nextcloud的数据需要使用MySQL数据库程序进行管理,所以需要在MySQL中先新建一个用户和数据库以供nextcloud使用

 1# 进入MySQL
 2mysql -u root -p
 3
 4# 创建一个名为nextclud_db的数据库
 5CREATE DATABASE nextcloud_db;
 6
 7# 创建一个名为nextcloud、密码也为nextcloud的用户
 8CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'nextcloud';
 9
10# 赋予用户nextcloud对数据库nextcloud_db的所有操作权限
11GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud'@'localhost';
12
13# 刷新数据库权限
14FLUSH PRIVILEGES;
15
16# 退出
17exit

Nextcloud

现在就可以用浏览器打开nextcloud了:

登陆nextcloud.png
点击查看网站打不开的解决办法

如果网页打不开,那么有一个很简单的方法可以排查问题:

先分别运行下面三条命令,查看三个nextcloud所需要的组建的运行状态:

1systemctl status nginx
2systemctl status mysql
3systemctl status php-fpm

如果在运行结果中都能看到绿色的active (running)字样,例如下面这个样子

nginx运行状态.png

那么说明这三个组件的是没问题的,错误的地方就可能是nginx的配置文件/etc/nginx/conf.d/nextcloud.conf,可以直接编辑:

1vim /etc/nginx/conf.d/nextcloud.conf

然后跟上面的配置文件有何差别,一定要记住修改文中提示的部分,其他的都不要修改,修改完或者查看之后确定没问题,那么就运行下面命令将三个组件重启,因为也有可能是有些修改需要重启生效但是修改后忘了重启:

1systemctl restart nginx
2systemctl restart mysql
3systemctl restart php-fpm

然后再确认一遍网址解析是否有误:如果直接用ip能访问,而网址不能,那么就是网址解析的问题了。

之后再打开网页看看,如果还不行可以在下面留言。

第一次登陆需要创建管理员账号,输完之后点击存储&数据库,接下来的配置可以参照下面的设置:

输入nextcloud配置信息.png

管理员密码任意设置,数据库密码如果是按照本教程的例子设置的,那么就是nextcloud,需要注意的是,配置数据库需要选择第二个MySQL/MariaDB,至于理由也在刚登陆时显示的性能警告中提到了。

如果配置没有什么问题就可以登陆了:

nextcloud登陆成功.png

Redis

配置redis缓存能让网盘访问更快速,也能降低系统负载,对于小内存VPS来说更是效果显著,如果不进行配置,也可以在nextcloud网页版 -> 设置 -> 概览里面看到这样的提示:

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

1yum install redis php-redis
在ubuntu/debian上安装redis

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

1apt-get install redis-server php-redis

将redis的连接方式从TCP改为socket可增加redis和php-fpm的连接性能,所以推荐将redis配置为socket连接方式。

关于socket

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配置文件:

1vim /etc/redis.conf

作如下修改:

 1# 监听端口改为0
 2port 0
 3
 4# 只监听本地端口
 5bind 127.0.0.1
 6
 7# 添加unix socket监听,/dev/shm/是挂载在内存的临时文件夹,具体可搜索tmpfs
 8unixsocket /dev/shm/redis.sock
 9
10# 设置socket权限
11unixsocketperm 775
12
13# 设置密码
14requirepass H#p$#9kNn#ol8NLBtoiy89FV6098@

最后启动生效即可

1# 启动redis
2systemctl start redis
3systemctl enable redis
4
5# 把redis添加进相应的用户组,以nginx为例
6usermod -g nginx redis

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

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

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

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

注意:

  • 'redis'里面,只有'host''port'是必须要有的,其他的都是可选项。

使用

按照上面的教程安装完nextcloud之后就可以使用了,可以在官网下载对应的客户端:https://nextcloud.com/install/#install-clients

以下以Windows客户端为例子。

安装nextcloud后打开,先输入服务器IP地址,如果设置了域名解析,那么可以直接输入网盘的域名。

域名解析设置可以参考这篇文章:设置域名解析:给域名设置一些实用有趣的二级域名

nextcloud登陆界面.png

输入服务器地址之后使用设置的用户密码登陆即可:

登陆nextcloud.png

登陆之后选择同步文件夹,这里需要注意,如果本地需要同步的文件并不是放在一起的,例如我有些文件常用到,就放在桌面,而有些重要但又不常用到的备份文件就放在D盘,这种时候就不要选择同步服务器的所有内容,而要选择下面的跳过文件夹设置,否则就只能同步一个文件夹,无法添加其他文件夹。

跳过文件夹设置.png

此时进入了nextcloud,点击账户名称下面的添加文件夹

添加同步文件夹.png

选择需要同步的文件夹,然后下一步,再新建一个存放在网盘上的同步文件夹,

新建同步文件夹.png

最后确认添加链接就可以开始同步了。

问题解决

网页版一直在登录页面循环

如果登录时输入了正确的帐号密码,url也已经是进入网盘的网址,但是却仍停留在登录页面,其实是使用php部分文件夹的时候,nginx的权限不够,运行以下命令即可解决:

1chown nginx:nginx /var/lib/php/session/
2chown root:nginx /var/lib/php/wsdlcache/
3chown root:nginx /var/lib/php/opcache/

Linux客户端没有记住密码

Linux上的客户端在使用的时候,如果每次打开都需要重新输入用户名和密码进行登录,其实只是缺少一个依赖而已:

1dnf install libgnome-keyring