其实说实话Nextcloud这玩意真的太臃肿了,性能烂的一批,就算你上了各种他们官方推荐的缓存和优化方案,在存储了大量文件的情况下,依旧效率低下。所以我的建议是要用这个网盘程序,最好上独立服务器。另外如果没有同步的刚需,KodExplorer是一个更好的选择,KodExplorer无论是在性能上还是易用上都比Nextcloud强太多。
装Nextcloud的方法有很多,Docker,Snap等等,但我不推荐这两种方式,原因很简单:太过封闭不易于维护,再加上Nextcloud安装完成之后是绝对要根据自己的服务器进行性能调优的,否则用到后面苦不堪言。再者,无论是Docker还是Snap,目前都不能实时的部署到官方的最新版本。
好了,废话就不多说了,先申请一个SSL证书,这里我使用certbot:
apt -y install certbot
目前certbot支持签发一个叫buypass的SSL证书,这个证书签一次时长是6个月,不用总是担心证书过期了(相应的域名换成你们自己的):
certbot certonly --standalone --agree-tos -d www.koko.cat -d koko.cat --server https://api.buypass.com/acme/directory
签发成功之后的证书和私钥路径:
/etc/letsencrypt/live/www.koko.cat/fullchain.pem /etc/letsencrypt/live/www.koko.cat/privkey.pem
接着来安装Openssl,因为我打算给Nginx配置上TLS1.3,这样可以从某种程度上给这个性能烂到爆的程序稍微加点速。在Debian9上安装一个最新版本的Openssl很简单,我们可以不用去编译,直接用到Debian的testing或者unstable(sid)源,这里我建议求稳还是用testing吧,sid真的太过于奔放了:
echo "deb http://deb.debian.org/debian testing main" > /etc/apt/sources.list.d/testing.list echo "deb-src http://deb.debian.org/debian testing main" >> /etc/apt/sources.list.d/testing.list
当然你要奔放那也行:
echo "deb http://deb.debian.org/debian unstable main" > /etc/apt/sources.list.d/sid.list echo "deb-src http://deb.debian.org/debian unstable main" >> /etc/apt/sources.list.d/sid.list
更新源信息:
apt -y update
安装指定源内的openssl(二选1即可):
apt -y -t testing install openssl apt -y -t unstable install openssl
完成之后查看一下openssl的版本号,这个版本就是支持TLS1.3的了:
接下来就要来编译安装Nginx了,首先安装一些编译所需的依赖:
apt -y install build-essential libpcre3-dev libssl-dev libgd-dev libgeoip-dev zlib1g-dev
这里给大家推荐一个小技巧,安装一个checkinstall,可以在编译安装完成之后把Nginx打包成deb,下次在别的机器上就不用重新编译了,直接dpkg安装即可:
apt -y install checkinstall
然后就是下载Nginx的源码解压进入到源码目录:
wget http://nginx.org/download/nginx-1.15.8.tar.gz tar -xzvf nginx-1.15.8.tar.gz cd nginx-1.15.8
使用下面的参数进行配置:
./configure --user=www-data --group=www-data --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-stream --with-stream_ssl_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_flv_module --with-http_mp4_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module
没问题就开始编译并完成安装:
make -j4 && make install
接着再执行:
checkinstall
第一个提示选y,然后随便写一点deb包的描述信息再按三次回车:
稍等几秒在当前目录就有一个deb打包完成了:
配置nginx的systemd服务:
nano /etc/systemd/system/nginx.service
写入:
[Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
启动以及设置Nginx的开机启动:
systemctl start nginx systemctl enable nginx
接下来安装MariaDB:
apt -y install mariadb-server
完成之后启动并查看一下运行状态,确保是Active:
systemctl start mariadb.service systemctl status mariadb.service
然后执行如下命令开始配置Mariadb:
mysql_secure_installation
这个向导按照如下配置:
Enter current password for root (enter for none):回车 Set root password? [Y/n] Y New password: 设置你的Mariadb数据库root密码 Re-enter new password: 重复输入一次密码 Remove anonymous users? [Y/n] Y Disallow root login remotely? [Y/n] n Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y
然后重启一遍Mariadb,使新的设置生效:
systemctl restart mariadb.service
所以说不稳定就是不稳定,这里配置的这个Disallow root login remotely,无法生效。应该是个BUG,无论你是选y还是选n最后root都没有localhost的远程访问权限。因为我打算安装一个phpMyAdmin,如果localhost没有远程访问权限的话,phpMyAdmin无法用root用户登录。什么?你问我为什么要装phpMyAdmin?如果你是老用Nextcloud的你就知道到时候你会经常碰到文件lock的问题,解决办法只能去MySQL里面清表,是用一个图形化方便还是每次都用命令行方便,自行考量。
所以这里我们得进到MySQL的shell内:
mysql -u root -p
依次执行如下语句修复:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '你的数据库root密码' WITH GRANT OPTION; FLUSH PRIVILEGES; quit
完成之后,再重启一次:
systemctl restart mariadb.service
现在安装PHP7.3,因为我们之前给系统换了Testing源,这个源内的PHP版本就是目前的最新版:
apt -y install php7.3 php7.3-common php7.3-cli php7.3-cgi php7.3-fpm php7.3-gd php7.3-mysql php7.3-sqlite3 php7.3-pgsql php7.3-opcache php7.3-mbstring php7.3-curl php7.3-xml php7.3-xmlrpc php7.3-zip php7.3-intl php7.3-json php7.3-bz2
创建一个wwwroot目录,用于存放所有的站点文件:
mkdir -p /opt/wwwroot
完成之后现在开始下载phpMyAdmin并设置相应的权限:
apt -y install unzip cd /opt/wwwroot wget https://files.phpmyadmin.net/phpMyAdmin/4.8.5/phpMyAdmin-4.8.5-all-languages.zip unzip phpMyAdmin-4.8.5-all-languages.zip mv phpMyAdmin-4.8.5-all-languages phpmyadmin rm -rf phpMyAdmin-4.8.5-all-languages.zip chown -R www-data:www-data /opt/wwwroot/phpmyadmin chmod -R 755 /opt/wwwroot/phpmyadmin
接下来是Nextcloud的安装包:
cd /opt/wwwroot wget https://download.nextcloud.com/server/releases/nextcloud-15.0.2.zip unzip nextcloud-15.0.2.zip rm -rf nextcloud-15.0.2.zip chown -R www-data:www-data /opt/wwwroot/nextcloud chmod -R 755 /opt/wwwroot/nextcloud
因为我们是编译安装的Nginx,这个Nginx没有conf.d目录,于是我们自己手动创建一个,用于引用我们的站点配置文件:
mkdir -p /usr/local/nginx/conf/conf.d
编辑Nginx的主配置文件:
nano /usr/local/nginx/conf/nginx.conf
首先将Nginx的运行用户修改为:www-data,然后在http段内加入引用:
include /usr/local/nginx/conf/conf.d/*.conf;
位置如图:
接着新建一个用于phpMyAdmin的站点配置文件:
nano /usr/local/nginx/conf/conf.d/phpmyadmin.conf
写入:
server { listen 51529; server_name 你的服务器公网IP; location / { root /opt/wwwroot/phpmyadmin; index index.html index.htm index.php; } location ~ .php$ { root /opt/wwwroot/phpmyadmin; fastcgi_pass unix:/run/php/php7.3-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /opt/wwwroot/phpmyadmin$fastcgi_script_name; include fastcgi_params; } }
注:phpMyAdmin是一个数据库管理工具,算是一个比较敏感的资源,不应该能够轻松被外网访问到,所以我在这里监听的端口是一个高位端口,你也可以修改为其他的端口,只要端口不冲突就行。
重启Nginx:
systemctl restart nginx
通过端口51529访问到phpMyAdmin登录进去创建一个数据库,注意编码格式为如图所示的:
现在开始新建Nextcloud的站点配置文件:
nano /usr/local/nginx/conf/conf.d/nextcloud.conf
写入如下配置(相应的域名等信息修改为你自己的):
upstream php-handler { server unix:/run/php/php7.3-fpm.sock; } server { listen 80; listen 443 ssl http2; server_name www.koko.cat koko.cat; # WEB页面允许最大的文件上传大小 client_max_body_size 100000M; if ($server_port !~ 443){ rewrite ^(/.*)$ https://$host$1 permanent; } # SSL以及TLS1.3支持 ssl_certificate /etc/letsencrypt/live/www.koko.cat/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.koko.cat/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; error_page 497 https://$host$request_uri; # 添加头信息修复Nextcloud后台的警告信息 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 Strict-Transport-Security "max-age=31536000; includeSubDomains" always; fastcgi_hide_header X-Powered-By; root /opt/wwwroot/nextcloud/; 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; } # 启用Gzip压缩 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; } # PHP配置 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; #Avoid sending the security headers twice 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|woff2?|svg|gif)$ { try_files $uri /index.php$request_uri; add_header Cache-Control "public, max-age=15778463"; 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; access_log off; } location ~ .(?:png|html|ttf|ico|jpg|jpeg)$ { try_files $uri /index.php$request_uri; # Optional: Don't log access to other assets access_log off; } }
完成之后再次重启Nginx:
systemctl restart nginx
现在打开你的站点域名应该就可以看到Nextcloud的安装界面了,填写相应的信息完成安装:
初次登录进来你就发现这个Nextcloud的界面有问题,有两处乱码或者说是错位,这应该是Nextcloud当前版本的BUG:
用Nextcloud你就要做好心理准备,遇到这些莫名其妙的BUG再常见不过了,还有比这更奇葩的我就不说了。不过目前这个BUG还是比较好解决的,点进你的设置界面,把界面语言先改为English(US),然后再换回中文等几分钟缓存刷新过来应该就好了。
现在我们开始修复Nextcloud安装完成之后后台提示的一些警告和错误信息:
首先安装php-imagick和redis/php-redis扩展:
apt -y install php-imagick php-redis redis-server
php-imagick用于修复后台提示的:该实例缺失了一些推荐的PHP模块。为提高性能和兼容性,我们强烈建议安装它们。
redis和php-redis用于配置内存缓存:内存缓存未配置,为了提升使用体验,请尽量配置内存缓存。更多信息请参见文档。
现在编辑Nextcloud的配置文件:
nano /opt/wwwroot/nextcloud/config/config.php
加入如下配置,这里我把lock文件锁定的功能也配置为redis,这是官方推荐的,也是非常重要的,因为在Nextcloud同步文件的过程中比较耗费资源的就是这个lock锁定:
'memcache.local' => 'OCMemcacheRedis', 'memcache.locking' => 'OCMemcacheRedis', 'redis' => [ 'host' => 'localhost', 'port' => 6379, ],
加入位置如图所示,注意缩进:
现在编辑php.ini:
nano /etc/php/7.3/fpm/php.ini
在[opcache]段的末尾加入如下内容:
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
如图如图所示:
用于解决Nextcloud后台提示的:PHP 的组件 OPcache 没有正确配置。 为了提供更好的性能,我们建议在 php.ini中使用下列设置。
接着编辑php-fpm.conf:
nano /etc/php/7.3/fpm/php-fpm.conf
在文件的末尾加上:
env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/php/bin
用于解决Nextcloud后台提示的:PHP的安装似乎不正确,无法访问系统环境变量。getenv(“PATH”)函数测试返回了一个空值。 请参照安装说明文档 ↗中的PHP配置说明查阅您服务器的PHP配置信息,特别是在使用php-fpm时。
这些修改都完成之后重启PHP-FPM,让修改生效:
systemctl restart php7.3-fpm.service
最后安装sudo:
apt -y install sudo
进入到nextcloud的站点根目录:
cd /opt/wwwroot/nextcloud
执行如下命令:
sudo -u www-data php occ db:convert-filecache-bigint
用于修复Nextcloud后台提示的:数据库中的一些列由于进行长整型转换而缺失。由于在较大的数据表重改变列类型会耗费一些时间,因此程序没有自动对其更改。您可以通过命令行手动执行 “occ db:convert-filecache-bigint” 命令以应用挂起的更改。该操作需要当整个实例变为离线状态后执行。查阅相关文档以获得更多详情
按y同意,注意如果你不是全新安装的Nextcloud,并且本身就已经存储了大量数据的情况下,我建议这个修复不要做,因为要耗费大量时间还可能出错:
在你做完了上面这些操作之后,再次检查一下,应该全部都通过了:
接下来我们做一些相关的性能调优,首先是Cron计划任务,在Nextcloud中默认是AJAX的模式,这个模式是性能最低下,也最不推荐的,官方推荐的是使用Linux自带的Crontab来执行,所以这里我们稍作修改。
执行如下命令以www-data用户运行crontab:
crontab -u www-data -e
在文件末尾加入一行(注意站点路径改为你们自己的):
*/5 * * * * php -f /opt/wwwroot/nextcloud/cron.php
回到后台修改计划任务方式为Cron:
接下来是MySQL的性能调优,编辑:
nano /etc/mysql/conf.d/mysql.cnf
在这个文件内添加如下内容,注意是mysqld,不是mysql,你可以在这个文件内把mysql这一段删除再加入下面的内容:
[mysqld] innodb_buffer_pool_size=1G innodb_io_capacity=4000
重启Mariadb:
systemctl restart mariadb.service
最后调整PHP的进程数:
nano /etc/php/7.3/fpm/pool.d/www.conf
按照官方的推荐应该修改为:
pm = dynamic pm.max_children = 120 pm.start_servers = 12 pm.min_spare_servers = 6 pm.max_spare_servers = 18
修改位置如图:
重启PHP-FPM:
systemctl restart php7.3-fpm.service
接下来我们来安装ocDownloader让Nextcloud支持离线下载。首先安装插件:
cd /opt/wwwroot/nextcloud/apps wget https://github.com/e-alfred/ocdownloader/releases/download/1.6.0-Alpha2/ocdownloader_1.6.0alpha2.tar.gz tar -xzvf ocdownloader_1.6.0alpha2.tar.gz rm -rf ocdownloader_1.6.0alpha2.tar.gz chown -R www-data:www-data /opt/wwwroot/nextcloud/apps/ocdownloader chmod -R 755 /opt/wwwroot/nextcloud/apps/ocdownloader
接着需要安装Aria2:
apt -y install aria2
创建Aria2的默认下载目录(只是为正常启动Aria2而做,实际上ocDownloader会把文件下载到Nextcloud的目录内)
mkdir -p /data/aria2/download
创建Aria2配置文件和会话保存目录:
mkdir -p /etc/aria2
创建Aria2会话文件:
touch /etc/aria2/aria2.session
新建Aria2配置文件:
nano /etc/aria2/aria2.conf
写入如下内容(注意ocDownloader是不支持Aria2设置RPC密码访问的,只能设置空密码访问,但这样会导致安全问题,所以这个配置文件我做了修改让Aria2的RPC端口6800只监听在本地):
## '#'开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ## ## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释 ## ## 文件保存相关 ## # 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置 dir=/data/aria2/download # 启用磁盘缓存, 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=50 # 同一服务器连接数, 添加时可指定, 默认:1 max-connection-per-server=5 # 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M # 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载 min-split-size=10M # 单个任务最大线程数, 添加时可指定, 默认:5 #split=5 # 整体下载速度限制, 运行时可修改, 默认: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 # 连接超时时间, 默认:60 #timeout=60 # 最大重试次数, 设置为0表示不限制重试次数, 默认:5 #max-tries=5 # 设置重试等待的秒数, 默认:0 #retry-wait=0 ## 进度保存相关 ## # 从会话文件中读取下载任务 input-file=/etc/aria2/aria2.session # 在Aria2退出时保存错误/未完成的下载任务到会话文件 save-session=/etc/aria2/aria2.session # 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0 save-session-interval=30 # 即使下载完成或删除也全部保存 #force-save=true ## RPC相关设置 ## # 启用RPC, 默认:false enable-rpc=true # 允许所有来源, 默认:false rpc-allow-origin-all=true # 允许非外部访问, 默认:false rpc-listen-all=false # 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同 #event-poll=select # RPC监听端口, 端口被占用时可以修改, 默认:6800 rpc-listen-port=6800 # 设置的RPC授权令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 选项 #rpc-secret=password # 设置的RPC访问用户名, 此选项新版已废弃, 建议改用 --rpc-secret 选项 #rpc-user=# 设置的RPC访问密码, 此选项新版已废弃, 建议改用 --rpc-secret 选项 #rpc-passwd= # 是否启用 RPC 服务的 SSL/TLS 加密, # 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接 #rpc-secure=true # 在 RPC 服务中启用 SSL/TLS 加密时的证书文件, # 使用 PEM 格式时,您必须通过 --rpc-private-key 指定私钥 #rpc-certificate=/path/to/certificate.pem # 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件 #rpc-private-key=/path/to/certificate.key ## BT/PT下载相关 ## # 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true #follow-torrent=true # BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999 listen-port=51413 # 单个种子最大连接数, 默认:55 bt-max-peers=500 # 打开DHT功能, PT需要禁用, 默认:true enable-dht=true # 打开IPv6 DHT功能, PT需要禁用 enable-dht6=true # DHT网络监听端口, 默认:6881-6999 dht-listen-port=6881-6999 # 本地节点查找, PT需要禁用, 默认:false bt-enable-lpd=true # 种子交换, 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 # 种子下载完成立即停止做种 seed-time=0 # BT校验相关, 默认:true #bt-hash-check-seed=true # 继续之前的BT任务时, 无需再次校验, 默认:false bt-seed-unverified=true # 保存磁力链接元数据为种子文件(.torrent文件), 默认:false bt-save-metadata=true
修改权限:
chown -R www-data:www-data /etc/aria2 chmod -R 755 /etc/aria2 chown -R www-data:www-data /data/aria2/download chmod -R 755 /data/aria2/download
创建Aria2的systemd文件:
nano /etc/systemd/system/aria2.service
写入如下内容,指定Aria2的运行用户为www-data:
[Unit] Description=aria2 [Service] User=www-data Group=www-data ExecStart=/usr/bin/aria2c --conf-path=/etc/aria2/aria2.conf Restart=on-abort [Install] WantedBy=multi-user.target
启动Aria2以及设置开机启动:
systemctl start aria2 systemctl enable aria2
现在访问你的Nextcloud后台,启用ocDownloader:
测试是否可以正常使用:
文件下载完成直接进入到Nextcloud的目录内:
最新评论
5211314
能不能教我 一点不会