Synology(群晖)常见的配置项以及命令项

Apache2.2 相关配置与常见命令

# 目录相同链接位置 /usr/local/etc/apache22/conf/httpd22.conf
$ sudo vim /volume1/@appstore/Apache2.2/usr/local/etc/apache22/conf/httpd22.conf

# 重启 Apache2.2,有时候重启无效,此时请重启服务器
$ sudo /usr/syno/bin/synopkg restart httpd2.2

# 查看访问日志
$ sudo tail -f /var/log/httpd/apache22-access_log

# 查看错误日志
$ sudo tail -f /var/log/httpd/apache22-error_log

# DSM 7.x 查看错误日志
$ sudo tail -f /var/packages/Apache2.2/var/log/apache22-error_log

Apache2.4 相关配置与常见命令

# 目录相同链接位置 /usr/local/etc/apache24/conf/httpd24.conf
$ sudo vim /volume1/@appstore/Apache2.4/usr/local/etc/apache24/conf/httpd24.conf

# 重启 Apache2.4,有时候重启无效,此时请重启服务器
$ sudo /usr/syno/bin/synopkg restart httpd2.4

# 查看访问日志
$ sudo tail -f /var/log/httpd/apache24-access_log

# 查看错误日志
$ sudo tail -f /var/log/httpd/apache24-error_log

# DSM 7.x 查看错误日志
$ sudo tail -f /var/packages/Apache2.4/var/log/apache24-error_log

Nginx 相关配置与常见命令

# nginx 配置文件
$ sudo vim /etc/nginx/nginx.conf

# nginx 配置信息存储位置
$ sudo ls /usr/local/etc/nginx/conf.d

# 重启nginx
$ sudo synoservicecfg --restart nginx

# 查看日志
$ sudo tail -f /var/log/nginx/error.log

Web Station 相关配置与常见命令

# 默认网页服务器根目录

/volume1/web

群晖(Synology)套件中的 WordPress 相关配置与常见命令

安装以及启用`WordPress`需要配置`Web Station`,一般建议使用`Apache`来访问,具体的配置信息参考下图:

测试是否可以正常工作的时候,可以启用全部扩展,如下图:

测试完成之后,不要启用全部扩展,只启用必须的扩展,否则会存在严重的性能问题以及安全问题。性能问题的具体表现就是网页打开特别慢,主要耗时在各个扩展的初始化上。

目前测试来看,只需要启用 mysqli 扩展即可满足 WordPress 的基本功能。

下面是一些常用的配置文件目录:

# WordPress根目录
/volume1/web/wordpress

# DSM 7.x WordPress 程序目录
/var/packages/WordPress
 
# DSM 7.x WordPress 根目录
/var/services/web_packages/wordpress

# DSM 6.x WordPress 在Nginx上的转发配置文件位置
/usr/local/etc/nginx/conf.d/www.WordPress.conf

# DSM 7.x WordPress 在Nginx上的转发配置文件位置
/usr/syno/etc/packages/WordPress/wordpress.conf

如果群晖上的`WordPress`使用的数据库是从其他服务器同步过来的,然后配置成功之后,打开网页显示空白的话,一般都是源网站更改过`WordPress`的源代码,而套件安装的是干净的版本,导致代码运行异常。

目前我的网站是阿里云服务器同步到群晖(Synology)上的,阿里云服务器上使用自定义的主题 `twentyfifteen-child` , 然而群晖(Synology)上安装的`WordPress`是没有这个自定义子主题的,我们需要同步这部分文件下来,否则页面照旧运行异常。另外,对应的插件也需要同步。

群晖使用的数据库是`MariaDB10`,配置数据库连接的时候,有时候需要手工指出端口号(默认3307),否则会连接失败。因此在`WordPress`配置的时候也需要这么操作,如果不设置,那么配置的时候提示成功,但是配置完成后,访问网站会提示数据库访问异常。

群晖可以正常运行的配置,参考下图:

如果使用 localhost 可能报告如下错误:

Warning: mysqli_real_connect(): (HY000/2002): No such file or directory in /xxxx/wp-includes/wp-db.php 

测试数据库连接的代码如下:

<?php
$conn = mysqli_connect("127.0.0.1:3307","wordpress","password","wordpress") or die("connect err: ".mysqli_error());  
echo "MySQL is OK";  
?>

另外,记得给访问`WordPress`数据库的用户授权,否则也是不能正常访问的,授权命令如下:

# MySQL 8.0 以下
$ mysql -u root -p -e "grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by 'pass';"

# MySQL 8.x 及以上
# mysql> grant all privileges on wordpress.* to "wordpress";

还有一个奇怪的问题,设置数据库参数的时候,如果访问的地址是 IP地址,可以配置成功,但是如果使用域名访问,就会配置失败,这应该算是一个问题。

可能的原因参考 域名访问群晖服务器上的网站的时候,报告500错误

另外,建议增加配置`WP_HOME`,`WP_SITEURL`来覆盖数据库中的地址,直接在`wp-config.php`尾部增加即可,这样可以解决网站都跳转到被同步网站的情况。

具体代码如下:

$HTTP_TYPE = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';   
$HOME = $HTTP_TYPE.$_SERVER['HTTP_HOST'].'/wordpress'; #获取当前访问的域名
$SIT_URL = $HTTP_TYPE.$_SERVER['HTTP_HOST'].'/wordpress';
define('WP_HOME', $HOME);
define('WP_SITEURL', $SIT_URL);

另外,建议把`wp-config.php`的权限修改成只有所有者才能写入,默认情况权限有些高,保证安全性。如下:

$ sudo chmod 600 wp-config.php

另一个常见问题是,`WordPress`启用`WP Super Cache`之后,通过`.htaccess `配置重写规则(permalinks),实现缓存请求的情况下,出现`404`错误。如下图:

观察服务器的日志,看到如下信息:

$ sudo tail -f /var/log/httpd/apache22-error_log
...........
...........
2020-04-26T08:57:14+08:00 DS718 [Sun Apr 26 08:57:14 2020] [error] [client 10.8.0.10] File does not exist: /var/services/web/index.php, referer: http://10.10.10.111/wordpress/

日志中,可以看到,找不到文件`/var/services/web/index.php` ,而实际应当访问的文件地址是`/var/services/web/wordpress/index.php` 。

可见`WP Super Cache`配置的重写规则出现了问题。默认情况下`Wordpress`都是配置在网站根目录,但是我们现在处于网站的子目录,因此我们需要对`WP Super Cache`生成的默认规则进行手工修改。

$ sudo tail -f /var/log/httpd/apache22-error_log
...........
...........
2020-04-26T08:57:14+08:00 DS718 [Sun Apr 26 08:57:14 2020] [error] [client 10.8.0.10] File does not exist: /var/services/web/index.php, referer: http://10.10.10.111/wordpress/

`WP Super Cache`生成的默认配置文件内容如下:

# BEGIN WordPress
# 在`BEGIN WordPress`与`END WordPress`之间的指令(行)是
# 动态生成的,只应被WordPress过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

主要关注`RewriteRule . /index.php [L]`这条规则,可以看到是跳转到网站根目录的。我们需要修改成,跳转到`WordPress`根目录 `RewriteRule . /wordpress/index.php [L]`。

调整后的规则如下:

# BEGIN WordPress
# 在`BEGIN WordPress`与`END WordPress`之间的指令(行)是
# 动态生成的,只应被WordPress过滤器修改。
# 任何对标记之间的指令的修改都会被覆盖。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

调整之后,就不会出现`404`异常了。

注意:如果通过上面的配置之后,文章显示都正常,但是图片,附件下载全部返回 404,则需要注意,是否手工编辑过网页,然后移除了域名依赖,比如默认情况下插入的图片地址为 https://www.mobibrw.com/wp-content/uploads/2022/04/i_important_trans.gif ,为了同时支持HTTP/HTTPS,那么我们可能会写成 /wp-content/uploads/2022/04/i_important_trans.gif 这样,当服务器部署到域名根目录的时候,上述写法都是没问题的,但是如果迁移WordPress到子目录,则会出现 404 错误,原因为:我们不明确写域名的方式可以实现 HTTP/HTTPS自适应,也就是浏览器会自动补齐域名,但是不能补齐到子目录,导致访问路径丢失

目前针对上面问题,目前的解决方案是通过自定义函数判断服务器是否被部署到了子目录中,如果在子目录中则调整全部的链接地址到子目录,代码如下:

<?php
  // 如果配置的目录不是网站根目录,则需要替换链接,否则会出现 404
  function replace_content_url($content, $pattern, $repl) {
    preg_match_all($pattern, $content, $out);
    $arr = $out[3];
    if(is_array($arr) && (count($arr) > 0)) {
      $arr = array_unique($arr);
      foreach($arr as $key=>$val) {
        $url = path_join(content_url(), $val); 
        $content = str_replace($repl.$val, $url, $content);
      }
    }
    return $content;
  }
  
  function replace_wp_content_preg($content, $repl) {

    // 替换超链接
    $pattern = "/<a(s*[^>]+s*)href=([\"|']?)".str_replace('/', '\/', $repl)."([^\"'>\s]+)([\"|']?)/is";
    $content = replace_content_url($content, $pattern, $repl);
  
    // 替换图片
    $pattern = "/<img(s*[^>]+s*)src=([\"|']?)".str_replace('/', '\/', $repl)."([^\"'>\s]+)([\"|']?)/is";
    $content = replace_content_url($content, $pattern, $repl);

    // 替换视频
    $pattern = "/\[.ideo(s*[^\]+s*)mp4=([\"|']?)".str_replace('/', '\/', $repl)."([^\"'>\s]+)([\"|']?)/is";
    $content = replace_content_url($content, $pattern, $repl); 

    // 替换PDF
    $pattern = "/\[pdfjs-viewer(s*[^\]]+s*)url=([\"|']?)".str_replace('/', '\/', $repl)."([^\"'>\s]+)([\"|']?)/is";
    $content = replace_content_url($content, $pattern, $repl);

    return $content;
  }

  function replace_wp_content($content) {
    // 替换的路径
    $wp_content = '/wp-content/';
    // 原始域名,如果与当前访问的域名不同,则替换为当前网站的域名/IP
    $domain = 'www.mobibrw.com';
    $home = parse_url(content_url(), PHP_URL_HOST);

    if(0 != strcasecmp($home, $domain)) {
      
      // 替换无域名的链接
      $content = replace_wp_content_preg($content, $wp_content);
     
      // 替换无协议头的链接
      $repl = $domain.$wp_content;
      $content = replace_wp_content_preg($content, $repl);
	  
      // 替换协议为http的链接
      $repl = 'http://'.$domain.$wp_content;
      $content = replace_wp_content_preg($content, $repl);
	  
      // 替换协议为https的链接
      $repl = 'https://'.$domain.$wp_content;
      $content = replace_wp_content_preg($content, $repl);

      // 域名替换
      $content = str_replace($domain, $home, $content);
    }
  
    return $content;
  }

  // 替换内容
  add_filter('the_content', 'replace_wp_content');
  // 替换摘要
  add_filter('the_excerpt', 'replace_wp_content');
?>

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注