安装nextcloud:搭建一个自己专属的个人网盘

2018-11-01


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搭建。

安装lnmp环境

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

安装MariaDB

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

选择版本

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 编辑源
vim /etc/yum.repos.d/MariaDB.repo

# 将复制来的配置填入
# MariaDB 10.2 CentOS repository list - created 2018-01-27 07:39 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# 安装MariaDB
yum install MariaDB-server -y

# 启动服务并设置开机启动
systemctl start mariadb
systemctl enable mariadb

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

1
mysql_secure_installation

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


输出示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

# 是否设置root密码,建议设置密码以提高安全性,输入y并回车
Set root password? [Y/n] y

# 设置密码
New password:

# 再次输入密码
Re-enter new password:

# 下面是数据库相关设置
...
Remove anonymous users? [Y/n] y # 删除匿名用户
...

Disallow root login remotely? [Y/n] y # 禁止root远程登录
...

Remove test database and access to it? [Y/n] y # 删除test数据库
...

Reload privilege tables now? [Y/n] y # 刷新权限
...
Thanks for using MariaDB!


安装Php-fpm以及相关组件

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

1
2
3
4
5
6
7
8
9
10
11
# 配置PHP源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 安装PHP以及PHP扩展
yum install php72w-fpm -y
yum 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

# 启动服务并设置开机启动
systemctl start php-fpm
systemctl 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把其他扩展先装上,然后按照以下方式安装此扩展:

1
yum install ImageMagick ImageMagick-devel gcc


如果装不了gcc就用这个命令:
1
yum install gcc gcc-c++ autoconf automake


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
# 编辑配置文件
vim /etc/php.ini


######### 修改以下内容 #########

;cgi.fix_pathinfo=1
# 改为
cgi.fix_pathinfo=0

memory_limit = 64M
# 改为
memory_limit = 512M

说明

  1. 修改cgi.fix_pathinfo的值是为了避免nginx文件类型错误解析漏洞
  2. nextcloud的运行需要较大的内存,php默认的内存大小不够,所以需要增大memory_limit的值

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
# 编辑配置文件
vim /etc/php.ini

# 在[Pdo_mysql]下方添加一行,如果没有[Pdo_mysql]这一行,则自行加入
pdo_mysql.default_socket = /dev/shm/mysql.sock


# 编辑配置文件
vim /etc/my.cnf

# 在[mysqld]下方添加一行,与上面的配置同理
socket = /dev/shm/mysql.sock


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[www]
user = nginx
group = nginx
listen = /dev/shm/php-cgi.sock
listen.owner = nginx
listen.group = nginx
listen.allowed_clients = 127.0.0.1
pm = static

# 如果内存较小,例如512M,则下面的12可以改为6,同时不建议在这么小的机子上跑这么重的php-fpm,所以最好升级服务器
pm.max_children = 12

slowlog = /var/log/php-fpm/www-slow.log
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 512M
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache

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

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

配置opcache缓存

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

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

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

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

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

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

然后重启php-fpm即可生效

1
systemctl restart php-fpm

安装nginx

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 编辑repo文件
vim /etc/yum.repos.d/nginx.repo

# 写入如下内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# 安装nginx
yum install nginx -y

# 启动服务并设置开机启动
systemctl start nginx
systemctl enable nginx

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

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

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

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

nginx安装成功后的欢迎界面

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

安装nextcloud

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

下载nextcloud

现在(2020年5月26日)的最新版本是18.0.4,也可以从官网获取最新的版本:Nextcloud官网,然后替换掉后面的网址就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入临时文件夹,重启后文件会自动删除,所以相当于自动清理垃圾
cd /tmp

# 下载nextcloud
wget https://download.nextcloud.com/server/releases/nextcloud-18.0.4.zip

# 解压下载下来的压缩包
unzip nextcloud-18.0.4.zip

# 移动到网址根目录,个人习惯将跟网站有关的东西都放在/var/www,也可以改为自己想要放的地方
mv nextcloud /var/www/

# 赋予nginx读取nextcloud根目录的权限,nginx是web服务器,也就是打开网站的核心程序
chown -R nginx:nginx /var/www/nextcloud

配置nginx

先添加一个配置文件

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

然后添加下列内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
upstream php-handler {
server unix:/dev/shm/php-cgi.sock;
}

server {
listen 443 ssl;
server_name netdisk.wenjinyu.me;
ssl_certificate /etc/letsencrypt/live/netdisk.wenjinyu.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/netdisk.wenjinyu.me/privkey.pem;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy "no-referrer";
add_header X-Frame-Options SAMEORIGIN;
add_header Cache-Control "public, max-age=15778463";
root /var/www/nextcloud/;
error_log /var/log/wenjinyu/nextcloud-error.log;

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

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

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

client_max_body_size 512M;
fastcgi_buffers 64 4K;
proxy_buffering off;
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/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;

location / {
rewrite ^ /index.php$request_uri;
}

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}

location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}

location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}

location ~ \.(?:css|js|woff|svg|gif)$ {
try_files $uri /index.php$request_uri;
access_log off;
}

location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$request_uri;
access_log off;
}
}

server
{
listen 80;
server_name netdisk.wenjinyu.me;
return 301 https://$server_name$request_uri;
}

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

改完后重载nginx:

1
nginx -s reload

配置MySQL

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入MySQL
mysql -u root -p

# 创建一个名为nextclud_db的数据库
CREATE DATABASE nextcloud_db;

# 创建一个名为nextcloud、密码也为nextcloud的用户
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'nextcloud';

# 赋予用户nextcloud对数据库nextcloud_db的所有操作权限
GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud'@'localhost';

# 刷新数据库权限
FLUSH PRIVILEGES;

# 退出
exit

配置nextcloud

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

登陆nextcloud.png


点击查看网站打不开的解决办法
如果网页打不开,那么有一个很简单的方法可以排查问题:

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

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


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

nginx运行状态.png

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

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


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

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


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

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

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

输入nextcloud配置信息.png

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

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

nextcloud登陆成功.png

登陆完可以看到页面上方有一个错误提示:

nextcloud错误提示.png

点开来是这样的:

nextcloud错误列表.png

每个人出现的错误提示都可能不同,部分我也遇到的问题可以参考这篇文章解决:nextcloud安全及设置警告中的一些设置错误提示的解决办法

如果你没有看到这样的错误提示,那么恭喜你可以少费很多工夫了。

配置redis缓存

安装redis

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

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

1
yum install redis php-redis

在ubuntu/debian上安装redis
ubuntu/debian,那么安装的是redis-server
1
apt-get install redis-server php-redis


将redis的连接方式从TCP改为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配置文件:

1
vim /etc/redis.conf

作如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 监听端口改为0
port 0

# 只监听本地端口
bind 127.0.0.1

# 添加unix socket监听,/dev/shm/是挂载在内存的临时文件夹,具体可搜索tmpfs
unixsocket /dev/shm/redis.sock

# 设置socket权限
unixsocketperm 775

# 设置密码
requirepass H#p$#9kNn#[email protected]

最后启动生效即可

1
2
3
4
5
6
# 启动redis
systemctl start redis
systemctl enable redis

# 把redis添加进相应的用户组,以nginx为例
usermod -g nginx redis

配置nextcloud

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

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

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

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

注意:

使用

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

以下以Windows客户端为例子。

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

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

nextcloud登陆界面.png

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

登陆nextcloud.png

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

跳过文件夹设置.png

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

添加同步文件夹.png

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

新建同步文件夹.png

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

问题解决

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

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

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

Linux客户端没有记住密码

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

1
dnf install libgnome-keyring

其他

初次使用配置稍微麻烦,上传文件的方式也不只有客户端,还可以直接通过把文件拖入网页版的形式进行上传,不过稳定性就比客户端差了,偶尔会遇到文件传输到一半就不动的情况。

nextcloud自诩为同步云盘,不过作为网盘来说绰绰有余,但是作为同步工具来说却显得鸡肋,因为手机客户端实在很渣,同步功能基本是半废,我也为此另外安装了syncthing这个轻量的同步工具用来同步文件,可参见:[syncthing搭建教程:拥有自己的文件同步服务器,在设备间快速同步文件]



评论