samuel-zeller-358865-unsplash

自从上次经历了移动硬盘全盘格式化,数据全部丢失无法恢复的惨烈教训之后,我愈发觉得数据备份的重要性。除了本地、移动硬盘、U 盘备份之外,我还十分依赖各种云盘的备份,陆陆续续的尝试了iCloud、Google Drive、Dropbox、百度云等网盘,每个网盘各有千秋。iCloud 被云山贵州托管,百度云时不时跳出分享侵权被和谐,国内的网盘总让人不放心(多达50多G的数据,一直懒得没有搬出国区iCloud)。国外的网盘固然好用,但是每次给朋友分享文件时,朋友打不开分享链接,着实让人头疼。这时候私人云盘的优势就显现出来了,加密数据、随意分享、数据同步、稳定高速。研究了几个开源的网盘程序之后,我选择了 NEXTCLOUD 这个网盘程序。NEXTCLOUD 支持全平台客户端,功能十分强大,能够满足对私人网盘的一切想象。

网上有很多教程,有些太过古老,对新手不友好。本文就以最新的 LNMP1.5 作为搭建环境,一步一步教你搭建好自己的网盘,解决所有的坑,力求能够开箱即用。

选择域名和大存储服务器

域名注册

网盘需要一个域名访问,如果你没有域名的话,推荐到 namesilo 这个平台购买,价格实惠,还送永久免费的域名保护。本站域名就是在这个域名服务商托管。尽量选择 .com 或 .org 后缀的域名,如果你想花费的域名成本少一些,也可以选择类似 .win 的后缀,自己喜欢的就好。结算的话,主流的支付都支持,不用担心付款问题。新用户输入本站专属优惠券 “yalv” ,还能立减1美元。点击这里进行域名搜索

大存储服务器选择

我前前后后物色了一些服务器,最后还是狠下心来购入了 drServer 家的杜甫,配置是Intel® Atom™ C2750 (8-Core, 2.4GHz) – 16GB RAM – 2TB HDD,使用优惠券 YBDX4U70Q 可以获得4美元的优惠。美国线路,速度基本能跑满,还可以申请一个 ipv6 地址,如果有兴趣的话,还可以刷PT,客服支持中文,甚至还有qq支持。我这段时间体验下来还可以。

当然还有一些其他的大存储vps商,价格低廉,例如letbox之流,不过为了数据安全还是多花些钱买个心安和稳定。

另外,本文教程基于 centos 7,推荐安装此系统。

选择 DNS 托管商 和 添加A记录

买好服务器之后,得到了服务器IP,这时候就需要 DNS 托管商出场了。

DNS,即Domain Name System,中文为域名解析系统。DNS 负责将友好域名(例如: yalv.me)转换成 IP 地址(例如 192.168.255.255)。这些 IP 地址是在 Internet 上访问资源所必需的。
域信息存储在 Internet 上的 DNS 服务器中。这些 DNS 服务器用于查找为域定义的资源记录。然后,资源记录指向 IP 地址,以便可以访问诸如 Web 服务器或邮件服务器等资源。(来源:Microsoft)

国内比较出名的托管商有 CloudXNSDNSPod阿里云dns等;国外优秀的托管商有:he.netcloudflarenamecheaprage4等。

域名注册商一般也会提供 dns 服务,上文推荐的 namesilo 支持的 dns 服务体验下来也还可以。更多详细教程参考 namesilo DNS Manager,确保自己的服务器IP与购买的域名 A 记录绑定。

安装lnmp1.5

推荐 lnmp1.5 为网站基本环境,NEXTCLOUD 网盘程序需要安装开启 php 的 fileinfo 模块,安装 lnmp1.5 之前需要在 lnmp.conf 配置文件修改参数。

yum update -y
yum install screen vim -y
screen -S lnmp
wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5
vim lnmp.conf

Enable_PHP_Fileinfo 后选项修改为 y 后保存。
./install.sh lnmp
详细安装教程见官方教程,php版本推荐 >7.0。

安装 NEXTCLOUD 网盘程序

安装完成 lnmp 1.5 之后,新建虚拟机。本文假定域名为 pan.yalv.me,实际安装过程中注意替换成自己的域名。

lnmp vhost add
#输入你申请的域名
#安装流程一步步填下去
会询问是否添加数据库和数据库用户
推荐添加,需要先验证MySQL的root密码(注:输入密码将不显示)
提示Enter database name: 后输入要创建的数据库名称,要创建的数据库用户名会和数据库同名,回车确认。
提示Please enter password for mysql user 数据库名: 后输入要设置的密码,回车确认。

lnmp1.5 有SSL功能,推荐添加,需要了解更详细的ssl 相关的文章,可查看本站历史文章。

下面开始安装 NEXTCLOUD 网盘程序。

cd /tmp
wget https://download.nextcloud.com/server/releases/nextcloud-14.0.1.zip
unzip nextcloud-14.0.1.zip -d /home/wwwroot/pan.yalv.me

修改网站配置文件
vim /usr/local/nginx/conf/vhost/pan.yalv.me.conf

示范文件

server
    {
        listen 80;
        listen [::]:80;
        server_name pan.yalv.me ;
        return 301 https://$host$request_uri;
    }

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name pan.yalv.me ;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/pan.yalv.me/nextcloud;
        ssl on;
        ssl_certificate /usr/local/nginx/conf/ssl/pan.yalv.me/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/pan.yalv.me/pan.yalv.me.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

        include rewrite/none.conf;
        #error_page   404   /404.html;

        add_header Strict-Transport-Security "max-age=31536000;includeSubDomains" always;
        add_header Referrer-Policy no-referrer always;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php-pathinfo.conf;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /home/wwwlogs/pan.yalv.me.log;
    }

现在打开自己的域名,可看到安装界面。安装步骤填写信息,数据库和用户名那边填写申请虚拟机时添加的数据库信息。

各种安全问题解决

安装完成后,你会在设置-管理-概括中,看到一堆安全问题,下面我们一步一步的修复这些烦人的问题。

屏幕快照 2018-09-27 下午8.10.49

一、无法获取系统环境变量

PHP 的设置似乎有问题, 无法获取系统环境变量. 使用 getenv(“PATH”) 测试时仅返回空结果.Please check the installation documentation ↗ for PHP configuration notes and the PHP configuration of your server, especially when using php-fpm.

解决办法: 修改 php-fpm.conf 文件
vim /usr/local/php/etc/php-fpm.conf
添加 env[PATH]=/usr/local/bin:/usr/bin:/bin:/usr/local/php/bin
屏幕快照 2018-09-27 下午8.12.44

二、PHP 模块 ‘fileinfo’ 缺失

PHP 模块 ‘fileinfo’ 缺失. 我们强烈建议启用此模块以便在 MIME 类型检测时获得最准确的结果.

解决办法:lnmp 1.5+版本,修改lnmp安装包目录下的 lnmp.conf 文件,将里面的Enable_PHP_Fileinfo=’n’ 后面的n改成y 保存,然后 ./upgrade.sh php 升级一下PHP就会安装好fileinfo模块。

三、没有通过完整性检查

一些文件没有通过完整性检查。了解如何解决该问题请查看我们的 文档。(无效文件列表… / 重新扫描…)
解决办法: 查看无效文件列表排查。

四、PHP 无法访问 /dev/urandom

PHP 无法访问 /dev/urandom,出于安全原因这是强烈不推荐的。更多信息请参见文档。

解决方法:移除防跨目录

cd ~/lnmp1.5/tools
./remove_open_basedir_restriction.sh
输入 /home/wwwroot/pan.yalv.me/nextcloud

五、”Strict-Transport-Security” 没有配置

HTTP 请求头 “Strict-Transport-Security” 没有配置为至少 “15552000” 秒。出于增强安全性考虑,我们推荐按照 安全提示中的说明启用HSTS。

解决方法:修改网站配置文件
vim /usr/local/nginx/conf/vhost/pan.yalv.me.conf
添加以下内容:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

六、内存缓存未配置

内存缓存未配置,为了提升使用体验,请尽量配置内存缓存。更多信息请参见文档。
解决方法:安装 php APCu 插件

cd /root/lnmp1.5
./addons.sh install apcu
vim /home/wwwroot/pan.yalv.me/config/config.php
#添加:'memcache.local' => '\\OC\\Memcache\\APCu',

七、PHP 的组件 OPcache 没有正确配置

PHP 的组件 OPcache 没有正确配置。 为了提供更好的性能,我们建议在 php.ini中使用下列设置:
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

解决方法:配置 opcache

lnmp一键安装包1.4后,添加扩展已经不再修改php.ini,而是单独的conf.d目录下

vim /usr/local/php/conf.d/004-opcache.ini
添加如下内容:
[Zend Opcache]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so"
lnmp restart

八、安装后无法挂载外部共享目录

提示无法挂载外部共享目录

解决方法:安装PHP smbclient模块

yum install libsmbclient libsmbclient-devel.x86_64 -y
pecl install smbclient

在应用处添加 External storage support 官方插件即可。
屏幕快照 2018-09-27 下午10.29.54

安装 aria2c 下载

服务器可以通过安装 aria2c 加速下载资源。

#安装epel源
yum -y install epel-release
yum -y install aria2
#查看aria2版本
aria2c -v

#目录设计/root/.aria2/aria2.conf
mkdir ~/.aria2
#创建session文件
touch ~/.aria2/aria2.session
#创建配置文件
vi ~/.aria2/aria2.conf

示范配置文件如下,注意 RPC端口 RPC授权令牌:

dir=/root/downloads 
# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M
disk-cache=32M
# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc
# 预分配所需时间: none < falloc ? trunc < prealloc
# falloc和trunc则需要文件系统和内核支持
# NTFS建议使用falloc, EXT3/4建议trunc, MAC 下需要注释此项
file-allocation=none
# 断点续传
continue=true

## 下载连接相关 ##

# 最大同时下载任务数, 运行时可修改, 默认:5
max-concurrent-downloads=5
# 同一服务器连接数, 添加时可指定, 默认:1
max-connection-per-server=5
# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M
# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载
min-split-size=10M
# 单个任务最大线程数, 添加时可指定, 默认:5
split=20
# 整体下载速度限制, 运行时可修改, 默认:0
#max-overall-download-limit=0
# 单个任务下载速度限制, 默认:0
#max-download-limit=0
# 整体上传速度限制, 运行时可修改, 默认:0
#max-overall-upload-limit=0
# 单个任务上传速度限制, 默认:0
#max-upload-limit=0
# 禁用IPv6, 默认:false
disable-ipv6=true

## 进度保存相关 ##

# 从会话文件中读取下载任务
input-file=/root/.aria2/aria2.session
# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件
save-session=/root/.aria2/aria2.session
# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0
#save-session-interval=60

## RPC相关设置 ##

# 启用RPC, 默认:false
enable-rpc=true
# 允许所有来源, 默认:false
rpc-allow-origin-all=true
# 允许非外部访问, 默认:false
rpc-listen-all=true
# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同
#event-poll=select
# RPC监听端口, 端口被占用时可以修改, 默认:6800
rpc-listen-port=6800
# 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项
rpc-secret=pan.yalv.me
# 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-user=
# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项
#rpc-passwd=

## BT/PT下载相关 ##

# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true
follow-torrent=true
# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999
listen-port=6881-6999
# 单个种子最大连接数, 默认:55
bt-max-peers=55
# 打开DHT功能, PT需要禁用, 默认:true
enable-dht=true
# 打开IPv6 DHT功能, PT需要禁用
enable-dht6=false
# DHT网络监听端口, 默认:6881-6999
#dht-listen-port=6881-6999
# 本地节点查找, PT需要禁用, 默认:false
#bt-enable-lpd=false
# 种子交换, PT需要禁用, 默认:true
enable-peer-exchange=true
# 每个种子限速, 对少种的PT很有用, 默认:50K
#bt-request-peer-speed-limit=50K
# 客户端伪装, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0
seed-ratio=0.1
# 强制保存会话, 即使任务已经完成, 默认:false
# 较新的版本开启后会在任务完成后依然保留.aria2文件
#force-save=false
# BT校验相关, 默认:true
#bt-hash-check-seed=true
# 继续之前的BT任务时, 无需再次校验, 默认:false
bt-seed-unverified=true
# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false
bt-save-metadata=true    

将 aria2c 设置为系统服务
vi /etc/init.d/aria2c
添加内容如下:

### BEGIN INIT INFO
# Provides: aria2
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Aria2 Downloader
### END INIT INFO
case "$1" in
start)
  echo -n "Starting aria2c"
  /usr/bin/aria2c --conf-path=/root/.aria2/aria2.conf -D
  ;;
stop)
  echo -n "Shutting down aria2c "
  killall aria2c
  ;;
restart)
  killall aria2c
  /usr/bin/aria2c --conf-path=/root/.aria2/aria2.conf -D
  ;;
esac
exit

添加可执行权限:
chmod 7777 /etc/init.d/aria2c

控制命令如下

systemctl daemon-reload
#启动
systemctl start aria2c
#停止
systemctl stop aria2c
#重启
#systemctl restart aria2c
#开启自启动
systemctl enable aria2c

开启防火墙,仅适用于 firewall 防火墙

firewall-cmd --zone=public --add-port=6800/tcp --permanent
firewall-cmd --zone=public --add-port=6881-6999/tcp --permanent
firewall-cmd --zone=public --add-port=6881-6999/udp --permanent
firewall-cmd --reload

查看服务器运行端口netstat -tpln
推荐使用 ariang面板,获得更好的下载体验。

本文撰写仓促,如果表述错误,请评论指正!

参考文章:

  1. Centos离线下载Aria2 AriaNG bt-tracker自动更新
  2. CentOS7安装NextCloud