宝塔部署教程

说明:现在越来越多云盘都相继宣布关闭,差不多都去用百度云盘了,而我们手上有些比如小姐姐电影之类传上去就会被和谐,于是我们有必要自己搭建个私有云来存这些资源了,也安全,这里推荐NextCloud,一款继ownCloud之后,又一个很不错的私有云。

简介

Nextcloud是一套用于创建和使用文件托管服务的客户端-服务器软件。它在功能上类似于Dropbox,虽然Nextcloud是免费的和开源的,允许任何人在私人服务器上安装和操作它。与Dropbox等专有服务相反,开放架构允许以应用程序的形式向服务器添加附加功能。

虽然Nextcloud作为ownCloud的衍生版本,在其基础上做了许多改进,但有一些差异。ownCloud提供了一个开源社区版本,但它们还提供了一个专有的企业版,具有附加功能和支持订阅。相比之下,Nextcloud是完全开源的。

截图

更新

【2019年6月28日】
更新教程,替换为宝塔安装,并新增Redis缓存优化方案以提高NextCloud运行速度。

安装

如果不喜欢折腾的,可参考1分钟就能安装完成的方法:Snap安装教程Docker安装教程

环境要求:PHP 7 +MysqlNginxRedis(非必需)。

先配置本地host

vim /etc/hosts
192.168.99.230		lhy.com

1、安装宝塔(/www)

#CentOS系统
wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
#Ubuntu系统
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
#Debian系统
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh
http://lhy.com:8888/
bt
5 6 10 11 12 13
将面板账户改为
sterling
sterling

2、安装应用扩展

安装以上软件,必装nginx,mysql,php

mysql

宝塔面板登陆密码与mysql数据root密码忘记了如何更改?

  • 强制修改MySQL管理(root)密码,比如改成123456(请根据自己的需求修改)
cd /www/server/panel && python tools.pyc root 123456
  • 修改面板密码,比如改成123456(请根据自己的需求修改)
cd /www/server/panel && python tools.pyc panel 123456
  • 添加远程访问
use mysql;
update user set host = '%' where user = 'root';
# 查看状态
select host, user from user;
可以看到root有个% 通配符表示OK了。
flush privileges;

3、安装php扩展

用作网站缓存使用

允许远程连接

  1. redis

修改redis的bind的127.0.0.1为0.0.0.0允许本地连接

并重载配置

4、放行端口并开启监控

5、新建站点,上传nextcloud代码

Nextcloud程序下载地址→传送门,目前为17.0.2版本,使用命令:

  • 建站

上传代码到网站空间

#进入站点根目录,自行修改路径
cd /www/wwwroot/lhy.com
#下载最新版程序,记得随时将链接换成最新版的下载地址,或者上传下载好的
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
#解压并移动到根目录
unzip nextcloud-*.zip && rm -rf nextcloud-*.zip index.html
mv nextcloud/* . && rm -rf nextcloud
chown -R www:www ./

6、配置专属数据库

账号:	nextcloud
密码: nextcloud
数据库: nextcloud

7、初始化nextcloud

访问lhy.com

安装完成登录

8、优化网站


一、缓存

最后该网盘挺不错的,特别是更新到15.0版本之后,不过加载速度在国内还是慢点,官方推荐的是用APCu缓存,相比较Redis更快,不过博主一般只在小内存上跑,所以就直接使用了Redis缓存。如果你的内存很大,可以看下APCu使用文档→传送门,配置也不难。

Nextcloud由于各种原因,默认安装后,任何页面加载时间都过于缓慢。之前的文章有介绍到使用PHP的APCu模块以提升缓存性能,这里再介绍使用Memcached提高Nextcloud的性能。

Nextcloud支持多个不同类型的缓存后端,所以可以同时启用本地缓存(APCu)和分布式缓存(Memcached、Redis),官方推荐的组合是APCu+Redis

分布式缓存选择Memcached、Redis其中一种启用即可,无需两者都启用

宝塔面板很方便的可以安装php的Memcached和Redis模块(注意是memcached,非memcache),这里我以APCu+Memcached为例

安装完毕后,打开/www/wwwroot/你的nextcloud目录/config/config.php,在其倒数第二行添加以下代码

第1行为指定本地缓存为APCu,第2、3行为指定分布式缓存为Memcached

vim /www/wwwroot/lhy.com/config/config.php

'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => array(
    array('localhost', 11211),
),

如图,注意分号,保存即可

Redis则需要稍微修改一下配置

'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => array(
     'host' => 'localhost',
     'port' => 6379,
),

此时缓存已经配置成功

刷新nextcloud界面,发现数据已经缓存到redis中了

二、Nginx配置

这一步最为蛋疼,官方给出的Nginx配置示例,有些是可以参考的,有些挪到宝塔上来则会有各种奇奇怪怪的问题,所以需要针对宝塔修改nextcloud下Nginx的配置。

经过几天的折腾,这部分终于也解决的差不多了。分享一下我的Nginx配置,为方便理解和阅读,我已在配置文件中加入一些注释,可以根据情况修改一下即可。

cd /www/server/panel/vhost/nginx

原配置

server
{
    listen 80;
    server_name lhy.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/lhy.com;
    
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #SSL-END
    
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    
    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-73.conf;
    #PHP-INFO-END
    
    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/lhy.com.conf;
    #REWRITE-END
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log off;
        access_log /dev/null;
    }
    
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log off;
        access_log /dev/null; 
    }
    access_log  /www/wwwlogs/lhy.com.log;
    error_log  /www/wwwlogs/lhy.com.error.log;
}

优化配置

server
{
	#基础配置,这些可以照搬宝塔的配置
    listen 80;
    #listen 443 ssl http2;
    server_name lhy.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/lhy.com;
    
    #ssl_certificate    /etc/letsencrypt/live/file.bugxia.com/fullchain.pem;
    #ssl_certificate_key    /etc/letsencrypt/live/file.bugxia.com/privkey.pem;
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #ssl_ciphers 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包含了403和404的错误页面
    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;
    
    #HSTS、缓存设置
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
    large_client_header_buffers 4 16k;
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K;
    gzip off;
    
    #Let's Encrypt 证书续期验证目录
    #location /.well-known/acme-challenge { }
    
	#nextcloud一些关键目录的权限设置
    location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
        deny all;
    }
    
    #静态资源重定向1
    location ~* \/core\/(?:js\/oc\.js|preview\.png).*$ {
        rewrite ^ /index.php last;
    }
    
    #webdav重定向
    location / {
        rewrite ^ /index.php$request_uri;
    }
    
    #静态资源重定向3
    location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }
    
    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }
    
    #对静态资源添加header
    location ~ \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        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;
        access_log off;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
        expires      30d;
        access_log off; 
    }
     
    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-73.conf;
    #PHP-INFO-END
    
    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/lhy.com.conf;
    #REWRITE-END
    
    #宝塔默认是include调用PHP相关配置,这里稍稍修改了一下,注意php版本
    #加入了front_controller_active这项参数以删除页面URL中的index.php
    # location ~ [^/]\.php(/|$)
    # {
    #     try_files $uri =404;
    #     fastcgi_pass  unix:/tmp/php-cgi-73.sock;
    #     fastcgi_index index.php;
    #     include fastcgi.conf;
    #     include pathinfo.conf;
    #     fastcgi_param front_controller_active true;
    # }
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    access_log  /www/wwwlogs/lhy.com.log;
    error_log  /www/wwwlogs/lhy.com.error.log;
}

导致的结果是界面不一样

原版

修改后排版有问题,采用原版

三、修改php上传限制

四、手机ip连接nextcloud并开启ip信任

添加ip和资源路径的关联

说明主机配置在/vhost中

cd /www/server/panel/vhost/nginx

# 复制lhy.com.conf为192.168.99.230
cp lhy.com.conf 192.168.99.230.conf

# 并修改为下图

添加ip信任

Nextcloud 通过不被信任的域名访问 动态IP解决方案,允许所有IP访问

nextcloud在访问时,会自动判断已设置好的域名或IP是否被允许,如果你是固定IP,那很好办,把这个域名或IP添加到配置文件就可以了。但如果是在家搭建的服务器,路由器每重启一次就是一个公网IP,无法做到每次都设置,于是想到了一个最终解决方案,理论上是禁止了IP限制。

固定ip

'trusted_domains' => 
  array (
    0 => 'lhy.com',
    1 => '192.168.99.230',
  ),

所有ip

解决方法:

打开 /config/config.php

找到 trusted_domains
增加一项

preg_match('/cli/i',php_sapi_name())?'127.0.0.1':$_SERVER['SERVER_NAME']
//完整的代码
//索引数字顺延就可以
'trusted_domains' => array(
        0 => '127.0.0.1',
        1 => preg_match('/cli/i',php_sapi_name())?'127.0.0.1':$_SERVER['SERVER_NAME'],
),

解释

$_SERVER[‘SERVER_NAME’] 为获得当前访问的域名或IP,最初只设置了server_name,后来在查看cron任务时,发现在cli模式下是无法获得的,所以增加了cli模式判断,cli模式直接给个本地IP忽悠程序,正常模式将当前访问的域名或IP动态的添加的信任的域名中。

这样如果手机客户端通过ip进来会被解析到/www/wwwroot/lhy.com目录下的资源

9、操作教学

一、手机连接nextcloud

http:192.168.99.230
admin	
admin

二、挂载硬盘

参考 https://bugxia.com/1306.html 提示:“smbclient” 未安装。无法挂载 "SMB / CIFS", "SMB / CIFS 使用 OC 登录信息"。请联系管理员安装。

安装扩展

这里有两个问题,

一个是提示:“smbclient” 未安装。无法挂载 "SMB / CIFS", "SMB / CIFS 使用 OC 登录信息"。请联系管理员安装。

另一个是:权限问题,将硬盘挂载的位置必须是/www/wwwroot/lhy.com/目录下,这里新建了data_2目录,否则会出现挂载不了的问题

解决第一个问题

安装smbclient呗,我是CentOS 7

yum install libsmbclient libsmbclient-devel -y

yum安装完后,仅仅只是系统底层支持smb client了,而nextcloud是基于php的,还需要通过PECL命令来安装php对应的smb扩展
这里首先要去掉几个php函数禁用

安装之前进入宝塔面板→php管理→禁用函数里面把“exec”“popen”“putenv”删除不然会安装不上

pecl install smbclient

这里可能会报错

WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update

运行

pecl channel-update pecl.php.net

对pecl channel进行升级

PHP Warning: popen() has been disabled for security reasons

popen函数被禁用了,打开宝塔的php管理面板,删掉被禁用的popen函数即可再次执行pecl安装smbclient

pecl安装smbclient扩展完成后会提示

检查php的配置文件,看是否已添加引用smbclient的库文件,如未添加,需手动添加并重启php

回到nextcloud的挂载外部存储管理页面,之前的提示已消除

解决第二个问题

cd /www/wwwroot/lhy.com

mkdir data_2

vim /etc/fstab
/dev/sda1 /www/wwwroot/lhy.com/data_2 ntfs-3g defaults,noexec,umask=0000 0 0
mount -a

chmod 777 data_2

cd data_2
chown -R www:www ./

之后可以配置本地目录挂载

完成

10、问题集合

参考网址:

宝塔面板部署NextCloud逐一解决后台安全及设置警告 https://bugxia.com/114.html

宝塔面板安装 NextCloud 后台配置优化 https://520iloveyou.vip/index.php/archives/528/

经过部署,nextcloud已经可以在web端或者客户端使用了,体验上来说,是没有任何影响的。但是从web端进入管理页面,会有如下错误

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 模块 ‘fileinfo’ 缺失. 我们强烈建议启用此模块以便在 MIME 类型检测时获得最准确的结果.
Your data directory and files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root.
The “Strict-Transport-Security” HTTP header is not set to at least “15552000” seconds. For enhanced security, it is recommended to enable HSTS as described in the security tips.
内存缓存未配置,为了提升使用体验,请尽量配置内存缓存。更多信息请参见文档。
The PHP OPcache is not properly configured. For better performance it is recommended to use the following settings in the 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
请仔细检查安装指南,并检查日志中是否有错误或警告。

作为一个强迫症,不解决这些问题怎么行呢

1.PHP 的设置似乎有问题, 无法获取系统环境变量. 使用 getenv(\”PATH\”) 测试时仅返回空结果.

从宝塔文件管理,打开/www/server/php/72/etc/php-fpm.conf,在其尾部添加一行

env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/php/bin

保存并重启PHP即可解决该问题

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

这个也很简单,因为php环境默认是没有安装fileinfo这个扩展模块的,所以手动去宝塔PHP管理选项中安装fileinfo扩展即可解决该问题

3.Your data directory and files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root.

大致意思是用户的数据目录(data)可以通过互联网访问,为了安全起见需要禁止访问。所以解决方法是修改nextcloud绑定的网站配置文件,添加nextcloud常用目录禁止访问即可

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

添加完毕保存即可生效

4.The “Strict-Transport-Security” HTTP header is not set to at least “15552000” seconds. For enhanced security, it is recommended to enable HSTS as described in the security tips.

解决方法还是修改nextcloud绑定的网站配置文件,添加一行header信息

add_header Strict-Transport-Security "max-age=63072000;";

保存即可生效

5.内存缓存未配置,为了提升使用体验,请尽量配置内存缓存

这个问题是指php的缓存模块没有安装,nextcloud支持APCu、Memcached、Redis等模块,选择其中一个安装。我之前写过一个宝塔面板PHP 7.x 编译安装APCu

编译安装完毕之后,从宝塔面板打开/www/wwwroot/你的域名/config/config.php,手动给nextcloud的配置文件中添加一行设置,指定使用APCu作为缓存

'memcache.local' => '\OC\Memcache\APCu'

其他如Memcached、Redis的使用请参照官方文档:https://docs.nextcloud.com/server/13/admin_manual/configuration_server/caching_configuration.html

6.The PHP OPcache is not properly configured. For better performance it is recommended to use the following settings in the php.ini:

意思是php的OPcache模块没有安装配置,依然是从宝塔PHP设置面板中添加安装OPcache模块

安装完成后该提示依然是存在的,因为宝塔在安装OPcache模块后自动加入的配置不符合nextcloud的推荐配置,所以需要修改一下

找到OPcache的配置这一段,替换成nextcloud的推荐配置,保存并重启php即可生效

补充1:Some files have not passed the integrity check. Further information on how to resolve this issue can be found in the documentation

大意是nextcloud目录下有一些不该出现的文件,点击“List of invalid files…”,会列出异常文件列表,删掉其中的文件即可解决。

总结

至此,宝塔面板下安装nextcloud出现的安全及设置警告均以逐一解决,看一下最终效果

=以下为NextCloud 14.0.x版本中新增的一些告警

Use of the the built in php mailer is no longer supported. Please update your email server settings
您的网页服务器未正确设置以解析“/.well-known/caldav”
您的网页服务器未正确设置以解析“/.well-known/carddav”
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running “occ db:add-missing-indices” those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.
在数据表 “oc_share” 中无法找到索引 “parent_index” .
在数据表 “oc_filecache” 中无法找到索引 “fs_mtime” .
HTTP的请求头 “Referrer-Policy” 未设置为 “no-referrer”, “no-referrer-when-downgrade”, “strict-origin” or “strict-origin-when-cross-origin”. 这会导致信息泄露. 请查阅 W3C 建议

1.Use of the the built in php mailer is no longer supported. Please update your email server settings

大意就是php自带的mail组件不再被nextcloud支持,需要使用smtp方式发送邮件。

其实就是让你设置一个smtp服务器信息,便于发送邮件,关于SMTP这里不再详述。

2.您的网页服务器未正确设置以解析“/.well-known/caldav”及您的网页服务器未正确设置以解析“/.well-known/carddav”

这两个警告可以一起解决,出现该提示一般是因为这两个路径的伪静态设置有问题,导致无法正常访问。

解决方法就是添加两行重定向配置

rewrite /.well-known/carddav /remote.php/dav permanent;
rewrite /.well-known/caldav /remote.php/dav permanent;

3.The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running “occ db:add-missing-indices” those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.

在数据表”oc_share” 中无法找到索引”parent_index”
在数据表”oc_filecache” 中无法找到索引”fs_mtime”

大意是说,数据库的一些索引丢失了,需要使用OCC修复一下。OCC是owncloud的命令行,而nextcloud又是基于owncloud开发的,所以需要用到OCC来修复丢失的数据库索引。

修复命令为:

php occ db:add-missing-indices

SSH进入服务器nextcloud的根目录,并执行修复命令

出现如下错误

Console has to be executed with the user that owns the file config/config.php
Current user: root
Owner of config.php: www
Try adding ‘sudo -u www ‘ to the beginning of the command (without the single quotes)

好吧,需要使用www用户权限来修改,再次执行

sudo -u www php occ db:add-missing-indices

修复成功!

4.HTTP的请求头 “Referrer-Policy” 未设置为 “no-referrer”, “no-referrer-when-downgrade”, “strict-origin” or “strict-origin-when-cross-origin”. 这会导致信息泄露

大意是,需要设置一个Referrer-Policy请求头来提高安全性。Nginx配置文件里添加:

add_header Referrer-Policy "no-referrer";

至此,Nextcloud升级到14.0.3后出现的一些新的警告提示已全部消灭干净


学习是个漫长的过程,勿忘初心!