wordpress更换域名

① 准备工作

  • 备份 MySQL 数据库
  • 将新域名绑定到服务器,添加证书、伪静态规则等;

② 更换域名

  1. 复制整个 WordPress 目录到新域名的网站目录
  2. 导出 MySQL
  3. 修改数据库中的域名:

执行 SQL(一次搞定):

UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name='siteurl';
UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name='home';

如涉及文章里的旧域名,还需替换:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'https://旧域名', 'https://新域名');
UPDATE wp_posts SET guid = REPLACE(guid, 'https://旧域名', 'https://新域名');

将wordpress从简体中文转为繁体中文

一个特殊的需求,将一个wordpress网站从简体中文换成繁体中文。

在wordpress后台可以更换wordpress语言为繁体中文,但是文章标题、文章内容、分类、标签等等,转化起来就比较麻烦,尝试过几款wordpress插件,都不太好用,最后还是借助强大的OpenCC来实现,以下是步骤:

一、备份数据库

非常重要,一定要先备份原数据库。

二、安装opencc

apt install opencc -y

三、将下面脚本保存为convert_zh_tw_all.sh:

#!/bin/bash
set -e

DB_NAME="dbname"
DB_USER="dbuser"
DB_PASS="你的数据库密码"
TABLE_PREFIX="wp_"

BACKUP_FILE="backup_zhcn_to_zhtw_$(date +%F_%H%M%S).sql"

echo "=== [1] 备份数据库:$BACKUP_FILE ==="
mysqldump -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" > "$BACKUP_FILE"
echo "[OK] 数据库已备份"

echo "=== [2] 导出 wp_posts 内容 ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
  -e "SELECT ID, post_title, post_content, post_excerpt FROM ${TABLE_PREFIX}posts;" > posts.tsv

echo "=== [3] 导出 wp_terms(分类/标签名称) ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
  -e "SELECT term_id, name FROM ${TABLE_PREFIX}terms;" > terms.tsv

echo "=== [4] 导出 wp_term_taxonomy(分类/标签描述) ==="
mysql -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" \
  -e "SELECT term_taxonomy_id, description FROM ${TABLE_PREFIX}term_taxonomy;" > term_taxonomy.tsv

echo "=== [5] 使用 OpenCC 将 TSV 转换为繁体 ==="
opencc -i posts.tsv -o posts_tw.tsv -c s2t.json
opencc -i terms.tsv -o terms_tw.tsv -c s2t.json
opencc -i term_taxonomy.tsv -o term_taxonomy_tw.tsv -c s2t.json

echo "=== [6] 生成 SQL 更新脚本(正确处理换行符) ==="
php << 'EOF'
<?php

function escape_mysql($str) {
    // 保留真实换行,不转换为 \n 字面符号
    $str = str_replace("\\", "\\\\", $str);   // 转义反斜杠
    $str = str_replace("'", "\\'", $str);     // 转义单引号
    return $str;
}

# ---------------------------
# posts
# ---------------------------
$fp = fopen("posts_tw.tsv", "r");
$out = fopen("update_posts.sql", "w");
fgets($fp); // 跳过表头

while (($line = fgets($fp)) !== false) {
    $cols = explode("\t", $line, 4);
    if (count($cols) < 4) continue;

    list($id, $title, $content, $excerpt) = $cols;

    $id = intval($id);
    $title = escape_mysql($title);
    $content = escape_mysql($content);
    $excerpt = escape_mysql($excerpt);

    fwrite($out, "UPDATE wp_posts SET post_title='$title', post_content='$content', post_excerpt='$excerpt' WHERE ID=$id;\n");
}
fclose($fp);
fclose($out);


# ---------------------------
# terms
# ---------------------------
$fp = fopen("terms_tw.tsv", "r");
$out = fopen("update_terms.sql", "w");
fgets($fp);

while (($line = fgets($fp)) !== false) {
    $cols = explode("\t", $line, 2);
    if (count($cols) < 2) continue;

    $id = intval($cols[0]);
    $name = escape_mysql($cols[1]);

    fwrite($out, "UPDATE wp_terms SET name='$name' WHERE term_id=$id;\n");
}
fclose($fp);
fclose($out);


# ---------------------------
# term_taxonomy
# ---------------------------
$fp = fopen("term_taxonomy_tw.tsv", "r");
$out = fopen("update_term_taxonomy.sql", "w");
fgets($fp);

while (($line = fgets($fp)) !== false) {
    $cols = explode("\t", $line, 2);
    if (count($cols) < 2) continue;

    $id = intval($cols[0]);
    $desc = escape_mysql($cols[1]);

    fwrite($out, "UPDATE wp_term_taxonomy SET description='$desc' WHERE term_taxonomy_id=$id;\n");
}
fclose($fp);
fclose($out);

echo "[OK] SQL 文件生成完成\n";
?>
EOF

echo "=== [7] 执行 SQL ==="
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_posts.sql
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_terms.sql
mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < update_term_taxonomy.sql

echo "=== ✔✔✔ 全部内容成功转换为繁体中文(不破坏 slug,不破坏格式) ==="
echo "备份文件:$BACKUP_FILE"
chmod +x convert_zh_tw_all.sh
./convert_zh_tw_all.sh

如果报错:

-bash: ./convert_zh_tw_all.sh: /bin/bash^M: bad interpreter: No such file or directory

这是因为脚本 在 Windows 编辑过 → 文件里带有 CRLF(\r\n)
Linux 解析 shebang 时把 ^M(\r)当成一部分,导致的,直接把脚本转换成 Linux 格式。

先安装dos2unix:

apt install dos2unix
dos2unix convert_zh_tw_all.sh

记录Adsense遇到的一些问题

只用作记录,便于后期网站/app及AdSense账户的规划。

添加网站审核被拒

点击Adsense – Sites – 具体网站,可以看到给出的理由:

Make sure your site follows the AdSense Program Policies. After you’ve fixed the violation, you can request a review of your site.

Low value content

Your site does not yet meet the criteria of use in the Google publisher network. For more information, review the following resources:

被禁投广告

给出的理由会有各种不同的,其中有一段我举得值得琢磨琢磨:

此外,您也可以从网站中移除所有广告代码。移除所有广告代码意味着您选择不展示广告,因此也无需申请审核。日后只要恢复广告代码,并解决所有违规问题,您就可以申请对您的网站进行审核。在移除广告代码的 7 至 10 天后,政策中心便不会再显示政策方面的问题,但这些问题仍会保留在我们的系统中。

最后,是Adsense最近更新的一个收款政策:

通过 PayPal Hyperwallet 收款

Hyperwallet 是 PayPal 的一项服务,可让您将 AdSense 和 AdSense YouTube 广告收入存入 PayPal Hyperwallet 账号。PayPal Hyperwallet 提供多种收款方式,包括 PayPal、取现和其他本地支付方式。

该方式适用于阿根廷、中国和美国的所有发布商。

具体链接:https://support.google.com/adsense/answer/15292512?hl=zh-Hans

HE+WARP实现全球落地IP

众所周知现在WARP可以解锁大部分地区的流媒体。但是,WARP已经不能指定目的地区了,所以要实现免落地鸡异地解锁流媒体,除了Cloudflare这个互联网大善人,还需要另外一个互联网大善人HE.NET的帮助,以实现异地解锁。

原理A:HE.NET提供的免费IPV6隧道tunnelbroker.net,可以指定IPV6地址的地理区域(注册账户所在国家/地区)。

原理B:HE.NET会通告Maxmind更改IPV6的Geo Location。

原理C:Cloudflare Warp使用的是Maxmind的数据库。

以下是步骤记录:

一、在tunnelbroker.net注册个账号,然后创建IPv6隧道

二、配置IPv6

如果原vps有IPv6,需要先删除掉:

ip a

输出中会显示类似内容:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet6 240e:3a0:abcd:1234::2/64 scope global dynamic
       valid_lft 2592000sec preferred_lft 604800sec
    inet6 fe80::5054:ff:fe12:3456/64 scope link
       valid_lft forever preferred_lft forever

删除某个 IPv6 地址:

sudo ip addr del <IPv6地址>/<前缀长度> dev <网卡名>

示例:

sudo ip addr del 240e:3a0:abcd:1234::2/64 dev eth0

新增一个网络配置文件:

vim /etc/network/interfaces.d/ipv6.conf 

最后的文件名随便取,.conf结尾就行

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:470:aaaa:bbbb::2
        netmask 64
        endpoint 216.218.221.6
        local 11.22.33.44
        ttl 255
        gateway 2001:470:aaaa:bbbb::1

重启网络服务让配置生效:

ifdown he-ipv6 2>/dev/null
ifup he-ipv6

或者重启网络:

systemctl restart networking

再运行ip a应该就能看到添加的HE IPv6。

如果重启网络服务报错“ifup: unknown interface he-ipv6”

执行:

grep interfaces.d /etc/network/interfaces

正常输出应包含:

source /etc/network/interfaces.d/*

如果没有,就要手动加上这行:

echo "source /etc/network/interfaces.d/*" | sudo tee -a /etc/network/interfaces

如果系统使用的是 Netplan(Ubuntu 18.04+ 常见),那 interfaces.d 不会生效,你需要改用 /etc/netplan/ 下的配置。

sudo nano /etc/netplan/99-he-ipv6.yaml

内容如下(用你的参数替换):

network:
  version: 2
  tunnels:
    he-ipv6:
      mode: sit
      local: 10.0.0.28
      remote: 216.218.221.6
      addresses: [2001:470:18:8d0::2/64]
      gateway6: 2001:470:18:8d0::1
      ttl: 255

保存后执行:

sudo netplan apply

再次ip a 查看。

三、安装WARP脚本

项目地址:https://gitlab.com/fscarmen/warp

直接双栈都改成WARP IP,但是一般情况下,WARP脚本都是通过默认的IPV4去连接WARP的Endpoint的,所以VPS A的IPV4是香港IP,获取到的WARP IP也是香港的,不是我们想要的。所以,先输入warp o关闭WARP。

修改WARP的配置文件:

vim /etc/wireguard/warp.conf

把里面[Peer]段里面的Endpoint那行用#注释掉或者删掉。
重新输入新的IPV6的Endpoint。比如:

Endpoint = [2606:4700:d0::a29f:c001]:2408

或者用工具 https://github.com/peanut996/CloudflareWarpSpeedTest 扫描IPv6地址。

重新warp o启用WARP,这时候应该会显示已经连上WARP,并且是你所期待的落地国家(区域)。

也可以借助s-ui来获取warp IP:

四、关于MTU

MTU (Maximum Transmission Unit) = 最大传输单元。

指网络接口一次能传输的最大数据包大小(单位:字节)。可以理解为”数据传输时每个包裹的最大尺寸”。

MTU 的作用

  1. 影响传输效率
    • MTU 太小:数据会被拆分成更多小包,增加开销
    • MTU 太大:可能超过网络支持的大小,导致数据包被丢弃或重新分片
  2. 在 WireGuard/WARP 中的重要性
    • WireGuard 会添加额外的加密头部(约 80 字节)
    • 如果 MTU 设置不当,会导致:
      • 连接不稳定
      • 网页加载缓慢或失败
      • 部分网站无法访问
      • 丢包率高

所以一般可以设置为1400,如果遇到网页加载不完整、HTTPS 连接经常超时、某些网站无法访问、丢包率高,可以尝试:1400138013601280(逐步降低测试)。

继续阅读

Debian部署Go项目记录

第一步:GO部署及环境配置

1、下载 Go: 访问 Go 官方下载页面,选择最新的 Linux 版本。例如:

# 检查最新版本,替换下面的文件名
wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz

2、解压 Go:

# 删除旧的(如果有)
sudo rm -rf /usr/local/go
# 解压到 /usr/local
sudo tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz

3、配置环境变量: 编辑您的 ~/.bashrc 或 ~/.profile 文件:

nano ~/.bashrc

在文件末尾添加:

export PATH=$PATH:/usr/local/go/bin

使其生效:

source ~/.bashrc

4、验证安装:

go version
# 应输出类似: go version go1.21.3 linux/amd64

第二步:准备和编译代码

1、创建项目目录:

mkdir ~/auth-service
cd ~/auth-service

2、初始化 Go 模块:

go mod init auth-service

3、创建 Go 代码文件: 使用 nano main.go 创建文件,然后将下面完整的代码粘贴进去。

package main

import (
	"crypto/md5"
	"encoding/base64"
...

4、下载依赖:

go mod tidy
# 这会自动下载 github.com/gin-gonic/gin

5、编译:

# -ldflags "-s -w" 是可选的,它会减小编译后的文件大小
# CGO_ENABLED=0 确保静态编译,不依赖C库
CGO_ENABLED=0 GOOS=linux go build -a -ldflags "-s -w" -o auth-service main.go

执行完毕后,您会得到一个名为 auth-service 的可执行文件。

第三步:运行和持久化部署

1、测试运行: 您可以先在前台运行测试一下:

./auth-service
# 应输出: Starting auth service on :8080

2、使用 systemd 持久化运行 (推荐): 为了让服务在后台运行,并在服务器重启后自动启动,我们使用 systemd。

1)创建 systemd 服务文件:

sudo nano /etc/systemd/system/auth-service.service

2)粘贴以下内容: (重要: User 和 ExecStart 中的路径需要根据您的实际情况修改:

[Unit]
Description=Go Authentication Service
After=network.target

[Service]
# 替换为您运行此服务的用户名 (例如 www-data 或您的用户名)
User=root 
# 替换为您的 auth-service 文件的绝对路径
ExecStart=/root/auth-service/auth-service 
# 替换为您的工作目录
WorkingDirectory=/root/auth-service 

Restart=always
RestartSec=3
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

3、启动服务:

sudo systemctl daemon-reload        # 重新加载配置
sudo systemctl enable auth-service  # 设置开机自启
sudo systemctl start auth-service   # 立即启动

4、检查服务状态:

sudo systemctl status auth-service

应该能看到它显示 active (running)。

最后:

如果修改了main.go文件,需要重新编译,并且重启服务:

CGO_ENABLED=0 GOOS=linux go build -a -ldflags "-s -w" -o auth-service main.go
sudo systemctl restart auth-service
sudo systemctl status auth-service

禁用wordpress xmlrpc.php

xmlrpc.php 是 WordPress 中一个用于支持远程发布和管理功能的接口文件。它允许第三方的应用程序(例如,桌面博客编辑器、移动应用等)通过 XML-RPC 协议与你的 WordPress 网站进行通信和操作。

为什么 xmlrpc.php 会被恶意扫描?

xmlrpc.php 已经成为黑客和恶意程序的主要攻击目标,原因如下:

  • 暴力破解攻击 (Brute Force Attack)xmlrpc.phpwp.getUsersBlogs 或类似方法允许攻击者用一个请求尝试成百上千个用户名和密码组合。这比通过传统的登录页面(wp-login.php)进行攻击要高效得多,因为后者通常需要为每次尝试都进行一次新的页面加载,更容易被安全插件检测和阻止。
  • DDoS 攻击 (Distributed Denial-of-Service):攻击者可以利用成千上万个 WordPress 网站的 xmlrpc.php 的 pingback 功能,指挥它们同时向一个目标网站发送大量请求,形成大规模的分布式拒绝服务攻击,耗尽目标服务器的资源。

正是因为这些原因,即使是全新的网站,也会立即被自动化程序扫描 xmlrpc.php,这会导致你的 VPS 或主机 CPU 和内存资源被大量消耗,出现网站卡顿甚至宕机的情况。

如何彻底解决 xmlrpc.php 的问题?

方法一:nginx location禁用

在网站nginx配置中添加:

    location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
    }

方法二:通过主题的 functions.php 文件添加代码

如果你不想安装额外的插件,可以将以下代码添加到你当前使用的主题的 functions.php 文件中。

add_filter( 'xmlrpc_enabled', '__return_false' );

这行代码会告诉 WordPress 禁用 XML-RPC 功能。

注意:如果你更换了主题,需要重新在新主题的 functions.php 文件中添加此代码。

手动编译安装宝塔nginx

手动编译安装宝塔nginx,以扩展一些其它模块,比如secure_link模块。

进入宝塔面板的安装文件夹: 打开终端,进入宝塔面板的安装目录,通常路径为 /www/server/panel/install/

cd  /www/server/panel/install/
wget http://download.bt.cn/install/0/nginx.sh

vim nginx.sh

在 nginx.sh 文件中,找到用于配置编译选项的部分(通常是以 ./configure 开头的行)。在该行的末尾添加:

--with-http_secure_link_module

以启用 secure_link 模块。

执行:

bash nginx.sh install 1.24

运行以下命令查看编译是否成功:

/www/server/nginx/sbin/nginx -V

高并发场景下的nginx优化

以nginx分发hls直播切片为例,对nginx高并发进行优化设置。

以下示例是nginx反代hls直播切片,每个m3u8包含5个ts切片,每个ts切片市场6s左右。本人使用的是4核8G的vps。

  1. worker_connections

来自deepseek的说法,针对不同配置worker_connections的建议值:

参数项2核4G VPS4核8G VPS依据
worker_processes2(匹配核心数)4(匹配核心数)
worker_connections12288(2核×6144)24576(4核×6144)
tcp_mem6M 8M 10M(保守内存分配)8M 12M 16M(更高内存支持)
文件缓存(open_file_cache)max=20000(减少内存占用)max=40000(利用更大内存缓存更多文件)

2. worker_rlimit_nofile

依据:需与系统级文件描述符限制(fs.file-max)一致,避免因文件句柄耗尽导致服务中断。

取值逻辑:

2核4G:100000(预留内存余量)

4核8G:200000(更大内存允许更高上限

下面的优化,将以2核4G为例。

3. 系统内核优化 (/etc/sysctl.conf)

# 连接队列优化
net.core.somaxconn = 16384       # 监听队列长度(2核建议值)
net.ipv4.tcp_max_syn_backlog = 32768
net.core.netdev_max_backlog = 32768  # 与tcp_max_syn_backlog保持对齐

# TIME-WAIT优化
net.ipv4.tcp_tw_reuse = 1        # 快速复用TIME-WAIT连接
net.ipv4.tcp_fin_timeout = 30    # 缩短FIN超时

# 内存缓冲区
net.ipv4.tcp_rmem = 4096 87380 6m       # 2核4G内存保守分配
net.ipv4.tcp_wmem = 4096 16384 6m
net.ipv4.tcp_mem = 6m 8m 10m            # 按4G内存的15%分配

# 连接管理
net.ipv4.tcp_max_tw_buckets = 100000    # 控制TIME-WAIT总量
net.ipv4.tcp_keepalive_time = 300

# 文件描述符
fs.file-max = 1048576          # 系统级总限制

执行命令使修改生效:

sudo sysctl -p

4. 用户资源限制 (/etc/security/limits.conf)

# Nginx运行用户(宝塔默认为www)
www soft nofile 131072
www hard nofile 262144

# 全局后备设置
* soft nofile 65535
* hard nofile 131072

6. 针对timeout的优化

优化连接超时时间,以防止长时间占用连接让vps资源耗尽。

http {
    # 请求头超时(默认60s)
    client_header_timeout 10s;    # 建议值:5~15秒

    # 请求体超时(默认60s)
    client_body_timeout 10s;      # 建议值:5~15秒(HLS无请求体,可缩短)

    # 发送响应超时(默认60s)
    send_timeout 20s;            # 建议值:20~60秒

    # 超时后重置连接(默认off)
    reset_timedout_connection on; # 强制开启
}

7. keepalive_requests

定义:单个 TCP 连接最多允许处理多少个 HTTP 请求,超过后强制关闭连接。

本质:控制连接的复用次数(生命周期内的总请求数)。

类比:类似于“一根电话线最多允许通话1000次,之后必须换新线”。

keepalive_requests 5000;     # 单个连接最多处理500个请求

8. 启用 HTTP/2

多路复用特性可显著减少 TCP 连接数,降低对 keepalive 配置的依赖:

listen 443 ssl http2;

keepalive_timeout:在HTTP/2中仍有效,但仅在连接完全空闲时触发。

keepalive_requests:在HTTP/2中通常被忽略,连接生命周期由协议自身管理。

如果还套了cloudflare CDN,还可以考虑不适用SSL以节省服务器开销,使用reuseport:

listen 80 reuseport;  # Linux 3.9+ 端口复用提升性能
server_name _;

9. limit_conn并发连接数优化

limit_conn_zone $binary_remote_addr zone=addr:10m;  # 定义共享内存区(10MB)存储IP连接状态
limit_conn addr 6;  # 每个IP最多允许8个并发TCP连接

limit_conn_zone用于定义共享内存区域来存储连接状态,这里用$binary_remote_addr作为键,表示客户端的IP地址。zone=addr:10m分配了10MB的内存空间。limit_conn addr 8则是限制每个IP同时活跃的连接数为8。这里的“连接数”指的是同一时间的TCP连接,而不是请求数。每个HTTP请求可能复用同一个连接(在keepalive开启的情况下),但HLS的情况下,由于需要不断获取m3u8和ts,可能会有多个并发连接。

连接数估算
单播放器连接数:通常为 1(m3u8) + N(并行ts下载)。

例如:若播放器并行下载2个 ts 切片,则占用 1+2=3 个连接。

IP连接上限:若 limit_conn addr 6,则单个IP最多支持约 6/3=2 个播放器。

最后要重启nginx使配置生效:

# 根据系统服务管理工具选择命令
systemctl restart nginx    # Systemd

配置示例:

server
{
    listen 80 reuseport;
    server_name www.168itw.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.168itw.com;
    
    client_header_timeout 10; # 客户端请求头超时
    client_body_timeout 10; # 客户端请求体超时
    send_timeout 15; # 响应超时时间
    reset_timedout_connection on; # 超时后重置连接
    
    keepalive_timeout 10; # 保持连接的超时时间
    keepalive_requests 5000;     # 单个连接最多处理5000个请求
    
    # 限制单个IP的并发连接数
    limit_conn perip 6; # 每个IP最多6个连接
}

其中:

    keepalive_requests 5000;     # 单个连接最多处理5000个请求

# 限制单个IP的并发连接数
limit_conn perip 6; # 每个IP最多6个连接

这是限制IP连接请求的,在后端服务器上可以不用设置。

当 Nginx 作为反向代理时:

  • 客户端到 Nginx 的连接:由客户端行为或 Nginx 的 keepalive_timeout 控制。
  • Nginx 到后端 的连接:由 proxy_set_header Connection 和 keepalive 配置控制。

反代服务器配置

如果反代服务器需要高频繁高并发的与后端服务器通信,可以使用HTTP/1.1 keepalive连接复用。

nginx的http块中配置upstream backend,以连接复用:

    upstream backend {
        server backendserver.168itw.com;
        keepalive 1000;
    }

反代配置:

#PROXY-START/

location /
{
    proxy_pass http://backend;
    proxy_set_header Host backendserver.168itw.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_http_version 1.1;      # 强制使用 HTTP/1.1
    proxy_set_header Connection "";  # 清除 Connection 头
    proxy_connect_timeout 5s;   # 与后端建立TCP连接的超时时间(建议5-10秒)
    proxy_send_timeout 10s;     # 向后端发送请求数据的超时时间(建议10-15秒)
    proxy_read_timeout 10s;     # 从后端读取响应数据的超时时间(建议15-30秒)
    # proxy_hide_header Upgrade;
    #Persistent connection related configuration

    add_header X-Cache $upstream_cache_status;

}

#PROXY-END/

10. 针对元数据的优化

        # 在 server 级别开启并定义缓存池
        # 所有 location 共享这个大小为 5000 的缓存池
        open_file_cache max=5000 inactive=30s;
        open_file_cache_errors on;
        open_file_cache_min_uses 1; # 对所有文件都生效,第一次访问即缓存

        # 针对 M3U8 文件的 location 块
        location ~ \.m3u8$ {
            # 关键:为 M3U8 设置一个很短的有效性检查周期
            # 比如切片时长是 5s,这里就设置为 5s
            open_file_cache_valid 5s;

            add_header Cache-Control no-cache;
        }

        # 针对 TS 文件的 location 块
        location ~ \.ts$ {
            # 关键:为 TS 设置一个非常长的有效性检查周期
            # 因为 TS 文件一旦生成就不会改变,没必要频繁检查
            # 设置为 300s 小时甚至更长,可以极大地减少不必要的系统调用
            open_file_cache_valid 300s;
        }

几款开源可自建的笔记/知识管理系统

平时用notion比较多,但是也想自己搭建一个属于自己的笔记管理系统,用来替代notion。收集了几款市面上,或者GitHub上star数比较多的笔记/知识管理系统。

1、Obsidian黑曜石

https://obsidian.md

很好很强大, 应该说非常强大,使用人数也非常多,但是入门有点难度,有些地方不太符合中国人的使用习惯。

2、思源笔记

https://b3log.org/siyuan/?lang=cn

开源,支持Windows、MacOS、Linux、Android、iOS众多客户端,可自建WebDAV和S3来实现同步,非常符合中国人使用习惯。

3、AppFlowy

https://github.com/AppFlowy-IO/AppFlowy

GitHub上近8万star,应该说非常成熟了,界面跟notion非常像,“The Open Source Alternative To Notion”

4、AFFiNE

https://github.com/toeverything/AFFiNE

GitHub 4万多star,There can be more than Notion and Miro.

5、Trilium

https://github.com/zadam/trilium

GitHub 3万star。

6、NotionNext

https://github.com/tangly1024/NotionNext

使用 NextJS + Notion API 实现的,支持多种部署方案的静态博客,无需服务器、零门槛搭建网站,为Notion和所有创作者设计。

7、memos

https://github.com/usememos/memos

GitHub 4万star,一款非常轻量简洁的笔记系统,可以docker部署,近来非常受大众喜欢。

Linux安装ffmpeg、N_m3u8DL-RE推流mpd

根据你的服务器架构选择,下面以 Linux 64 为例

sudo apt update
sudo apt install ffmpeg

mkdir stream
cd stream
wget https://github.com/nilaoda/N_m3u8DL-RE/releases/download/v0.3.0-beta/N_m3u8DL-RE_v0.3.0-beta_linux-x64_20241203.tar.gz
tar -zxvf N_m3u8DL-RE_v0.3.0-beta_linux-x64_20241203.tar.gz

wget https://github.com/shaka-project/shaka-packager/releases/download/v3.4.1/packager-linux-x64

chmod +x N_m3u8DL-RE packager-linux-x64

推流:

RE_LIVE_PIPE_OPTIONS="-c copy -f hls -hls_time 6 -hls_list_size 5 -hls_flags delete_segments+append_list jade.m3u8" ./N_m3u8DL-RE https://168itw.com/J --key "111:222" --concurrent-download true --append-url-params true --live-keep-segments false --del-after-done true --select-video best --select-audio all --use-shaka-packager true --mp4-real-time-decryption true --decryption-binary-path "./packager-linux-x64" --ui-language "zh-CN" --live-pipe-mux