2025年3月

DiscuzX 接入 CDN 需要解决以下问题:

附件接入 CDN
JS,CSS 接入 CDN
staticurl 接入 CDN
界面基础图片目录 {IMGDIR} 接入 CDN
头像接入 CDN
插件静态文件接入 CDN
基本方案是新增一个静态资源域名作为 CDN 回源域名,比如 static.tecbbs.com,然后配置以上 项目 能够通过此域名访问到。然后配置 CDN 域名,比如 cdn.tecbbs.com。

Contents [hide]

1 附件接入CDN
2 JS CSS接入CDN
3 staticurl接入CDN
4 界面基础图片目录接入CDN
5 头像,插件等接入CDN
6 参考资料
附件接入CDN
通过以下配置,使 static.tecbbs.com 能够访问附件:

location ^~ /data/attachment/ {

root /var/www/discuz;
expires 30d;

}
然后 DiscuzX 后台,全局 - 上传设置 - 基本设置 - 本地附件 URL 地址 中改为 CDN 链接 https://cdn.tecbbs.com/data/attachment

如果使用了远程附件,则为远程附件做 CDN 加速,并且在远程附件配置中把 远程访问 URL 改为 CDN 链接。

JS CSS接入CDN
DiscuzX 的 JS 和 CSS 会缓存到 data/cache 目录下,因此首先为此目录添加 static.tecbbs.com 域名:

location ^~ /data/cache/ {

root /var/www/discuz;
expires 1d;

}
然后到后台,全局 - 性能优化 - 服务器优化,修改 JS 文件 URL 及 CSS 文件 URL 为 CDN 链接。

staticurl接入CDN
为 static/ 目录添加 static.tecbbs.com 域名:

location ^~ /static/ {

root /var/www/discuz;
expires 1d;

}
config/config_global.php 中,修改以下配置为 CDN 链接:

$_config'output' = 'https://cdn.tecbbs.com/static/'
界面基础图片目录接入CDN
已经为 static/ 目录添加域名,然后界面基础图片目录可以直接修改为 CDN 链接。进入后台, 界面 - 风格管理,编辑当前使用的模板,找到 界面基础图片目录 {IMGDIR},改为 https://cdn.tecbbs.com/static/image/common

头像,插件等接入CDN
这一部分思路都类似,都使基于 Nginx sub_filter 模块来做,和 WordPress 方案类似。DiscuzX 主域名的配置中配置 sub_filter:

cdn

sub_filter 'https://www.tecbbs.com/uc_server/data/avatar/' 'https://cdn.tecbbs.com/uc_server/data/avatar/';

相册cdn

sub_filter '<img src="data/attachment/album/' '<img src="https://cdn.tecbbs.com/data/attachment/album/';

插件,可根据情况为指定插件开启

sub_filter 'source/plugin/zxsq_' 'https://cdn.tecbbs.com/source/plugin/zxsq_';
sub_filter_types *;
sub_filter_once off;
然后在 static.tecbbs.com 域名下配置:

location ~ /uc_server/data/avatar/(\d\d\d)/(\d\d)/(\d\d)/(\d\d)_avatar_(.+?).jpg {

root /var/www/discuz;
set $avatar1 $1;
set $avatar2 $2;
set $avatar3 $3;
set $avatar4 $4;
set $avatarsize $5;
# 用户未上传头像的情况,根据自身情况配置 @avatar
try_files $uri @avatar;

# 设置过期时间,否则cdn不会命中缓存
# 对头像来说,短一些比较合适,否则用户更新头像不生效
expires 1d;

}

location ^~ /source/plugin/ {

root /var/www/discuz;
expires 1d;

}

解决字体跨域,某些插件可能引用了字体

location ~* .(eot|ttf|woff|woff2)$ {

add_header Access-Control-Allow-Origin *;
add_header accpet */*;

}
然后头像需要在 UCenter 后台设置使用静态链接调用头像。

参考资料

  1. https://www.cnblogs.com/iruxu/p/discuz-cdn.html
  2. https://www.discuz.net/thread-3577432-1-1.html
    相关文章:
    WordPress免插件接入CDN
    UCenter用户头像的存储规则
    Discuz x2解决采用静态地址调用头像DIY页面无法显示无头像用户问题
    在Windows下编辑Unix格式文档
    Nginx笔记(二)
    Nginx服务器上换discuz域名

前言
群晖Docker默认网络模式是bridge和host,通过手动添加第三种bridge-host模式,可以把Docker容器模拟成一台新的客户端一样,容器会有自己的内网IP地址,端口独立分配。
对比
Bridge:docker容器内部虚拟网桥,容器内部172.17.0.X网段,无法获取主机网络ip,访问容器需要映射端口,并且不能和主机占用端口冲突,不映射端口无法使用。
Host:容器绑定到主机网卡使用主机的ip并且不能和主机占用端口冲突,使用哪些端口自动占用。
bridge-host:通过主机的虚拟网卡来创建虚拟网桥,将容器的网卡绑定到这个直通局域网的虚拟网桥上,它的优点是容器获取到局域网ip,容器ip和群晖主机一个网段,端口1-65535全端口使用 不和主机冲突并且容易ip可手动指定,可以说模式就是把容器都桥接到你群晖所在的局域网
开始
打开群晖 控制面板 >> 网络 >> 网络界面 >> 管理 >>Open vSwitch设置
启用Open vSwitch

打开群晖控制面板——终端机和SNMP——启动SSH功能

用putty工具SSH登录进群晖并切换到root账户

群晖切换root账户

sudo -i

查询群晖网卡名称和IP地址

ip addr
执行创建网络命令,指令根据自己的IP网段修改,我的IP网段为192.168.7.X,网关地址为192.168.7.1,根据自己的需求修改
创建bridge-host网络docker network create -d macvlan --subnet=192.168.7.0/24 --gateway=192.168.7.1 -o parent=ovs_eth0 bridge-host

做了端口汇聚创建bridge-host网络

docker network create -d macvlan --subnet=192.168.7.0/24 --gateway=192.168.7.1 -o parent=ovs_bond0 bridge-host
群晖Docker开启局域网桥接

打开Docker,点击网络,可以看见我们创建的bridge-host

创建容器
网络可以在群晖docker面板——网络里面修改
注意:如果创建Docker容器的时候使用bridge-host网络模式,并不手动指定IP的话,默认会从192.168.x.2,192.168.x.3排列下去。
手动指定容器的IP
容器绑定到桥接网卡,并指定ip: --network bridge-host --ip=192.168.7.21
举例:启动hushunxu/qinglong_base映像命名为qinglong并使用bridge-host网络手动分配192.168.7.21 IP地址
docker run -itd --restart=always --network bridge-host --ip=192.168.7.21 --name qinglong hushunxu/qinglong_base
地址冲突问题
当你创建连接到 macvlan 网络的容器时,Docker 将从子网范围中选择一个地址并将其分配给你的容器。这会导致潜在的冲突:如果 Docker 选择了一个已经分配给你网络上另一台主机的地址,那么你就有问题了!
你可以通过保留一部分子网范围供 Docker 使用来避免这种情况。此解决方案有两个部分:
你必须在网络上配置任何 DHCP 服务,使其不会分配给定范围内的地址。
你必须告诉 Docker 保留的地址范围。
如何完成前者完全取决于你的本地网络基础设施,超出了本文档的范围。后一项任务是通过--ip-range选项来完成的docker network create。
在我的本地网络上,我的 DHCP 服务器不会分配上述任何地址192.168.7.190。我决定将子集分配给 Docker 192.168.7.192/27,它是一个 32 个地址范围,从 192.168.7.192 开始,到 192.168.7.223 结束。相应的docker network create命令将是:
docker network create -d macvlan -o parent=ovs_eth0 --subnet 192.168.7.0/24 --gateway 192.168.7.1 --ip-range 192.168.7.192/27 bridge-host###端口汇聚:docker network create -d macvlan -o parent=ovs_bond0 --subnet 192.168.7.0/24 --gateway 192.168.7.1 --ip-range 192.168.7.192/27 bridge-host
现在可以创建连接到我的本地网络的容器,而不必担心 ip 地址冲突的可能性。
macvlan网络模式下容器与宿主机互通
使用连接到 macvlan 网络的容器,你会发现虽然它可以毫无问题地联系本地网络上的其他系统,但容器将无法连接到你的主机(并且你的主机将无法连接到你的主机上的容器)。这是 macvlan 接口的一个限制:
如果没有网络交换机的特殊支持,你的主机无法将数据包发送到它自己的 macvlan 接口,这是在macvlan模式设计的时候为了安全而禁止了宿主机和容器直接通信。
幸运的是,有一个解决这个问题的方法:你可以在主机上创建另一个 macvlan 接口,并使用它与 macvlan 网络上的容器进行通信。
首先,我将通过使用--aux-address 选项从我们的网络范围中保留一个地址供主机接口使用docker network create:
docker network create -d macvlan -o parent=ovs_eth0 \ --subnet 192.168.1.0/24 \</span> --gateway 192.168.1.1 \</span> --ip-range 192.168.1.192/27 \</span> --aux-address 'host=192.168.1.223' \</span> mynet
这将阻止 Docker 将该地址分配给容器。
接下来,我们在主机上创建一个新的 macvlan 接口。你可以随心所欲地称呼它,但我称它为mynet-shim:
ip link add mynet-shim link eno1 type macvlan mode bridge
现在我们需要使用我们保留的地址配置接口并启动它:
ip addr add 192.168.1.223/32 dev mynet-shimip link set mynet-shim up
我们需要做的最后一件事是告诉我们的主机在与容器通信时使用该接口。这相对容易,因为我们将容器限制在本地网络的特定 CIDR 子集;我们只需像这样向该范围添加一条路由:
ip route add 192.168.1.192/27 dev mynet-shim
有了该路由,你的主机将 在与网络mynet-shim上的容器通信时自动使用该接口 mynet。
请注意,此处显示的接口和路由配置不是持久的——如果你要重新启动主机这些设置会丢失。