宝塔面板下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;
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K;
    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;
    
    #nextcloud包含了403和404的错误页面
    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;
    
    #防止一些HTTP响应头引起的安全隐患
    add_header Strict-Transport-Security 'max-age=15552000';
    add_header X-Content-Type-Options 'nosniff';
    add_header X-Robots-Tag 'none';
    add_header X-Frame-Options 'SAMEORIGIN';
    add_header X-Download-Options 'noopen';
    add_header X-Permitted-Cross-Domain-Policies 'none';
    add_header X-XSS-Protection '1;mode=block';
    add_header Referrer-Policy "no-referrer";

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    ssl_certificate    /www/server/panel/vhost/cert/file.bugxia.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/file.bugxia.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    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;
    #SSL-END

    #PHP-INFO-START  PHP引用配置,可以注释或修改
    #include enable-php-74.conf;
    #PHP-INFO-END
    
    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/file.bugxia.com.conf;
    #REWRITE-END
    
    location = /.well-known/carddav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host:$server_port/remote.php/dav;
    }

    location / {
        rewrite ^ /index.php;
    }
    
    #Let's Encrypt 证书续期验证目录
    location ~ \.well-known{
        allow all;
    }
    
    #nextcloud一些关键目录的权限设置
    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }
    location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }
    
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        fastcgi_param modHeadersAvailable true;
        #宝塔默认是include调用PHP相关配置,这里稍稍修改了一下,注意php版本 #加入了front_controller_active这项参数以隐藏页面URL中的index.php
        fastcgi_param front_controller_active true;
        fastcgi_pass unix:/tmp/php-cgi-74.sock;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
        include fastcgi.conf;
        include pathinfo.conf;
    }
    
    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
        try_files $uri/ =404;
        index index.php;
    }

    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;
        access_log off;
    }

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

    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; 
    }
}

参考:

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

本文标签:


21 条评论

  • abeim 评论于 回复

    20.0版本按照这个教程没法去掉index.php

    • Bug侠 评论于 回复

      @abeim
      我这边只到19.0.3稳定版,等我更到20再看看啥问题 :笑哭:

      • moyo 评论于 回复

        @Bug侠
        博主更到20.0没?index.php没办法去掉呀

        • Bug侠 评论于 回复

          @moyo
          已更新到20.0.4,没问题的,Nginx的配置文件我很久没动过了

  • 清疚 评论于 回复

    楼主你好,我在config.php添加了你文中写的配置,但一打开Nextcloud就显示:
    Internal Server Error
    The server encountered an internal error and was unable to complete your request.
    Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
    More details can be found in the server log.
    Google之后,在Nextcloud的官网找到说:要把memcache.distributed注释掉,发现确实可行,那究竟应该怎么启用memcache.distributed呢

    • Bug侠 评论于 回复

      @清疚
      出现“Internal Server Error”的错误的时候,先检查/data/nextcloud.log日志,看看是什么报错。比如:先删除/data/nextcloud.log,然后浏览器里访问一下,出现报错提示,再立即返回来看看nextcloud.log日志里的详细报错信息,就知道哪里的配置有问题。
      如果你的config.php只有注释掉memcache.distributed字段才能正常访问,那就说明这个字段配置有误,如果是redis,memcached,可以配合log日志,看看是不是redis,memcached服务访问不到或者服务没有启用之类的,这个得耐心分析分析。
      ====================
      关于内存缓存的优化,https://bugxia.com/1706.html 这里我感觉写的还算详细,当然也可以参照官方给的内存优化文档 https://docs.nextcloud.com/server/18/admin_manual/configuration_server/caching_configuration.html
      :可爱:

    • 呼啸山庄 评论于 回复

      @清疚
      话说我也遇到这个问题,最后把’port‘ => 6379改成’port’ => 0就好了

  • 字母同学 评论于 回复

    为什么nextcloud无法更改logo。。。一直提示生在保存 一直有问题

  • snacks 评论于 回复

    顶顶顶 终于隐藏掉 index.php了

  • 吃茶 评论于 回复

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

    • 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后台的提示。我去加上

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