普通视图

发现新文章,点击刷新页面。
昨天以前首页

部署轻量友链朋友圈

2024年12月11日 20:17

前言

这两天突然发现,之前使用极简模式部署好的友链朋友圈没法获取到数据了。看了Github仓库才知道原项目已经停止支持了,取而代之的就是这个轻量友链朋友圈。

不知道是不是因为这个项目是为了 hexo 打造的原因,项目看了很久,愣是没看明白。直到把详细文档研究了一通,才大概明白了运行的原理。

其实严格来讲,该项目主要分为三个步骤:

  • 获取朋友圈JSON
  • 配置 Github Action
  • 拿到朋友圈文章列表JSON

获取朋友圈JSON

顾名思义,该步骤通过以下代码,将指定页面上的友链信息,直接转换成为一个 friend.json

原代码如下:

const YML = require('yamljs')
const fs = require('fs')

let friends = [],
    data_f = YML.parse(fs.readFileSync('source/_data/link.yml').toString().replace(/(?<=rss:)\s*\n/g, ' ""\n'));

data_f.forEach((entry, index) => {
    let lastIndex = 2;
    if (index < lastIndex) {
        const filteredLinkList = entry.link_list.filter(linkItem => !blacklist.includes(linkItem.name));
        friends = friends.concat(filteredLinkList);
    }
});

// 根据规定的格式构建 JSON 数据
const friendData = {
    friends: friends.map(item => {
        return [item.name, item.link, item.avatar];
    })
};

// 将 JSON 对象转换为字符串
const friendJSON = JSON.stringify(friendData, null, 2);

// 写入 friend.json 文件
fs.writeFileSync('./source/friend.json', friendJSON);

console.log('friend.json 文件已生成。');

比较遗憾的是,该代码仅适用于 HEXO 博客程序,如果想要用在HUGO中,需要做如下修改:

const cheerio = require('cheerio');
const fs = require('fs');
const path = require('path');

// 获取项目根目录的路径
const projectRoot = process.cwd();

// 读取 HTML 文件内容
const htmlFilePath = path.join(projectRoot, 'public', 'links', 'index.html');
const htmlContent = fs.readFileSync(htmlFilePath).toString();

// 使用 cheerio 解析 HTML
const $ = cheerio.load(htmlContent);

// 创建一个空的 friends 数组
let friends = [];

// 假设在 HTML 中每个好友信息存储在 <div class="friend-item"> 中,
// 并且每个条目包含 <a class="username">、<img class="avatar"> 和 <a class="link">
$('.friend-item').each((index, element) => {
    const username = $(element).find('.username').text().trim();  // 提取用户名
    const link = $(element).find('.link').attr('href');  // 提取链接
    const avatar = $(element).find('.avatar').attr('src');  // 提取头像

    // 如果都存在,添加到 friends 数组
    if (username && link && avatar) {
        friends.push({
            name: username,
            link: link,
            avatar: avatar
        });
    }
});

// 根据规定的格式构建 JSON 数据
const friendData = {
    friends: friends.map(item => {
        return [item.name, item.link, item.avatar];
    })
};

// 将 JSON 对象转换为字符串
const friendJSON = JSON.stringify(friendData, null, 2);

// 写入 friend.json 文件到根目录
fs.writeFileSync(path.join(__dirname, 'friend.json'), friendJSON);

console.log('friend.json 文件已生成。');

将该代码文件保存在根目录Link.js文件中。运行:

node link.js

就可以得到 friend.json 文件。

需要注意的是,这里需要用到 cheerio 解析 HTML。所以在运行前,需要:

npm install cheerio

以下就是JSON格式文件示例:

{
  "friends": [
    [
	    "林木木",
	    "https://immmmm.com",
	    "https://cravatar.cn/avatar/ba83fa02fc4b2ba621514941307e21be.jpeg?s=400"
    ],
    [
    
        "山卜方",
        "https://novcu.com",
        "https://cravatar.cn/avatar/6ebab96f3131621c51c08370d3c996f0.jpeg?s=400"
    ],
    [
		"大大的小蜗牛",
        "https://eallion.com",
        "https://cravatar.cn/avatar/171e4c30959e8c077a6c58b958624b31.jpeg?s=400"
    ]

} 

配置 Github Action

在 fork 了仓库:Friend-Circle-Lite 之后,只需要修改仓库中的 config.yaml 文件

spider_settings:
  enable: true
  json_url: "https://<你的地址>/friend.json"
  article_count: 5
  merge_result:
    enable: true
    merge_json_url: "<你的地址>"

如果需要邮件推送功能的,跟随官方文档完成相应配置即可。

拿到朋友圈文章列表JSON

在完成所有配置后,就可以手动或者自动的运行 Github Action ,该Action就会根据我们提供的 friend.json 拿到友链中所有朋友更新的文章啦。最后会在page分支中,生成一个 all.json ,通过调用这个文件,就可以做前端渲染了。

大功告成。

一台服务器最大能支持多少条 TCP 连接

2024年2月15日 00:00

这段时间频繁出现图床无法访问,之前为了防护攻击,杜老师选购了高防的服务器,奈何除流量攻击外,还有连接数的攻击形式。而杜老师为了保障服务稳定,将连接数设置较低。本篇文章就简单说明下一台服务器最大能支持多少条 TCP 连接。

一台服务器最大能打开的文件数

我们知道在 Linux 中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux 上能打开最大文件数量受三个参数影响,分别是 fs.file-max/soft nofile/fs.nr_open。

fs.file-max 参数描述了整个系统可以打开最大文件数量。但是 root 用户不会受该参数的限制。

soft nofile 限制单个进程上可以打开的最大文件数。不能针对不同用户配置不同的值。

fs.nr_open 限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值。

如果想加大 soft nofile,那么 hard nofile 参数值也需一起调整。如果因为 hard nofile 参数值设置的低,那么 soft nofile 参数的值设置的再高也没有用,实际生效的值会按照二者最低来。

如果增大了 hard nofile,那么 fs.nr_open 也需要跟着一起调整。如果不小心把 hard nofile 的值设置的比 fs.nr_open 还大,那么后果比较严重。会导致该用户无法登录。

一台服务器最大能支持多少连接

我们知道 TCP 连接从根本上看其实就是客户端和服务端在内存中维护的一组内核对象,它们只要能够找到对方,那就算是一条连接。那么一台服务器最大能建立多少条连接呢?

从理论上应该是约等于两百多万亿条连接。

但是实际上由于受其它软硬件的影响,我们一台服务器不可能能建立这么多连接。

如果只以已连接状态的连接来算,那么一台服务器最大可以建立多少连接呢?以一台 4G 内存的服务器为例!

我们知道一条已连接状态的连接大约消耗 3.3K 的内存,那么通过计算可得知一台 4G 内存的服务器,可以建立百万个 TCP 连接。

上面讨论的都是建立连接的理想情况,在现实中如果有频繁的数据收发,那么一台服务器能支撑 1000 连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析。抛开业务逻辑单纯的谈并发没有太大实际意义。

一台客户端机器最多能发起多少连接

我们知道客户端每和服务端建立一个连接便会消耗掉客户端一个端口。一台机器端口数量是 65535,那么是不是说一台客户机最多和一台服务端机器建立 65535 个连接呢?

由 TCP 连接的四元组特性可知,只要四元组里某个元素不同,那就认为这是不同的 TCP 连接。

如果一台客户端仅有一个 IP,服务端也仅有一个 IP 并且仅启动一个程序,监听一个端口的情况下,客户端和这台服务端最大可建立连接条数就是 65535 个。

如一台客户端有多个 IP,服务端仅有一个 IP 并仅启动一个程序,监听一个端口的情况下,一台客户端机器最大能建立的连接条数是 n*65535 个。

如果一台客户端仅有一个 IP,服务端也仅有一个 IP 但是服务端启动多个程序,每个程序监听一个端口的情况下,一台客户端机器最大能建立的连接数量为 65535*m 个

所以,不光是一台服务端可以接收百万个 TCP 连接,一台客户端照样能发出百万个 TCP 连接。

优化 TCP 连接数策略

在网络开发中,很多人对一个基础的问题始终没有彻底搞明白,那就是一台机器最多能支撑多少条 TCP 连接。不过由于客户端和服务端对端口使用方式不同,这个问题拆开来理解要容易一些。

注意,这里说的客户端和服务端都只是角色,并不是指某一台具体的机器。如对于我们自己开发的应用程序来说,当它响应客户端请求的时候,它就是服务端。当向 MySQL 请求数据的时候,它又变成了客户端。

增加服务器的内存可以支持更多的 TCP 连接。

优化 CPU 调度可以提高服务器性能,从而支持更多的 TCP 连接。

通过修改系统的文件描述符限制,可以提高服务器支持的 TCP 连接数。

优化网络配置可以提高服务器网络带宽,从而支持更多的 TCP 连接。

❌
❌