2019年11月16日星期六

宝塔面板下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

https://bugxia.com/197.html

2019年11月3日星期日

Blogger 博文首页缩略图解决方法

为 Blogger 模板国内访问优化时,会遇到博客首页文章的缩略图不显示的问题。我总结了一种思路供大家参考1

前言

在 Blogger 模板语法未作改动之前,我们可以利用 Blogger 本身提供的语法来获取博文的第一张图片的原始链接,以用作缩略图之用。不过从 2018 年始(个人察觉),Blogger 对语法进行升级改动,一部分旧的语法被废弃。若仍继续使用,则报错,如下所示:
<data:postFirstImage/>
<!--Can't find substitution for tag [postFirstImage]-->
代替的语法为:
<data:post.featuredImage/>
通过上面代码获得的图片链接并不是图片的原始链接。Blogger 会文章中的图片上传到谷歌的服务器,得到一个新的链接,此链接在国内不能访问。

2019年11月2日星期六

mysql 普通用户无权限连接问题

ERROR 1698 (28000): Access denied for user 'root'@'localhost' (using password: NO)
想着LAMP环境搭建好了就应该没啥事了,但是在php中与数据库交互时,浏览器出现了这样的提示:
Warning: mysqli::__construct(): (HY000/1698): Access denied for user 'root'@'localhost' in /var/www/index.php at line 16
我看了一下,这不是我连接数据库的代码行嘛
mysqli_connect("localhost","root",'','database')