宝塔面板下nextcloud完美优化配置

Linux, PHP 2018/03/26

这两天在宝塔面板下折腾nextcloud,遇到了很多问题,详见:宝塔面板部署NextCloud逐一解决后台安全及设置警告 ,这里再补充几点

一、性能优化

性能优化的详细过程已完善,请移步 Nextcloud打开缓慢\卡顿的一些优化

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

'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,
)

二、Nginx配置

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

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

server
{
    #基础配置,这些可以照搬宝塔的配置
    listen 80;
    listen 443 ssl http2;
    server_name file.bugxia.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/file.bugxia.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;
	
    #宝塔默认是include调用PHP相关配置,这里稍稍修改了一下,注意php版本
    #加入了front_controller_active这项参数以删除页面URL中的index.php
    location ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi-72.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
	include pathinfo.conf;
	fastcgi_param front_controller_active true;
    }

    #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$uri;
        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
        rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
        #静态资源重定向2,支持使用acme脚本在申请证书时对域名的验证
        if ($uri !~* (?:\.(?:css|js|svg|gif|png|html|ttf|woff)$|^\/(?:remote|public|cron|status|ocs\/v1|ocs\/v2)\.php|^\/\.well-known\/acme-challenge\/.*$)){
            rewrite ^ /index.php last;
        }
    }
	
    #静态资源重定向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; 
    }
    #access_log  /www/wwwlogs/file.bugxia.com.log;
}

参考:

https://docs.nextcloud.com/server/13/admin_manual/configuration_server/caching_configuration.html

https://serverfault.com/questions/845696/nginx-rewrite-nextcloud-index-php-in-url

本文标签:


9条评论

  • 吃茶 评论于

    我的大概也是按照这个配置走的,安装完毕以后没有图形界面是怎么回事,求指教

    • Bug侠 评论于

      @吃茶 没有图形界面是什么意思?WEB端打不开?有什么错误提示吗?

    • Bug侠 评论于

      @吃茶 邮件已收到,无法直接回复,就回复在这里。看样子是CSS未正确加载(应该是静态资源重定向出了问题)可以恢复初始的配置,再对比我的配置文件逐一排查。

    • Bug侠 评论于

      @吃茶 pathinfo.conf里的配置内容,其实也就是重定向的一种,try_files 方法也可以理解为一种重定向。
      我检查了下我这边的Nginx配置结构,好像你的pathinfo.conf和宝塔默认的还不一样。
      所以当Nginx的一个location下同时配置了两个try_files,Nginx会根据优先级调用。所以就会出现一些意想不到的问题……
      嗯,大概就是这样。 :笑哭:

      • 吃茶 评论于

        @Bug侠 嗯,我又用宝塔装了一遍,重新配置的时候看到确实pathinfo.conf的设置里面有不一样的地方,不过大概知道是那几句是有影响的了

      • 吃茶 评论于

        @Bug侠 对了,有另外的一个app你配置好了吗?就是全文搜索,我在wiki上大概看了半天,然后找了教程,应该是需要用到Elastic Search的插件,正在研究

  • Mai1me 评论于

    终于找到 隐藏掉 index.php的方案了、

  • 言西 评论于

    博主为什么没有启用“`’memcache.locking’ => ‘\OC\Memcache\Redis’,“`这个内存锁定呢?

    • Bug侠 评论于

      @言西 唉,我都注意到这条,当初只是为了解决NC后台的提示。我去加上

    评论(本站已开启评论回复邮件通知功能,请如实填写邮箱以便及时收到回复)