Skip to content

服务器笔记

2025-11-28

原始笔记链接:https://cloud.seatable.cn/dtable/external-links/59b453a8639945478de2/

0061 如何实现 token 加密

1、JWT 加密

2、设置过期时间,避免客户端泄露 token

0136 你对服务器有哪些了解

定位:前端为主,了解一些简单的后端(服务器)知识

知识点概念层面:RestFul API Graph 设计 API 的理念;请求并发,jwt token 验证,nginx 的反向代理,docker K8s 的基本使用(image container 实际运行环境等)权限控制

语言框架层面:Python django 和 flask,node 的 express 和 Koa 基本使用;mysql 关系型数据库的增删改查(redis mongoDB 非关系型数据库的概念)监听 URL

实际案例:以小说阅读器为例,用户注册,用户登录流程(服务器和客户端通信过程,HTTP 三次握手四次挥手 TCP get post 对应不同的 TCP 请求等,滑动窗口算法),管理员权限判断等;大文件断点续传;operations 的广播 socket WS 协议基本应用;单点登录等后端实现(session)

0212 Restful API 与 GraphQL

两种网络技术协议,RestAPI 和 GraphQL 的区别:

RestfulAPI 是早期的协议。在网络请求中,url 中表示请求的资源名称,请求的方法,对应数据库的增删改查操作(常见的四种请求方法,get post delete put 的特点,以及 head option 请求方法)。好处:URL 直接关注资源,不需要关注怎么操作资源,大部分项目使用这个协议。

GraphQL是新一代的协议。每一个请求都类似 POST 请求,前端把需要的参数通过 POST 类似 JSON 发给后端,然后后端根据需要的参数(查询数据库),返回前端。

好处:URL固定的,不会频繁变化。很多资源可以在一个 Query 中获取,这样服务器并行请求压力较小。服务器无需返回不需要的字段(前端需要用户姓名,后端会查询一次数据库,把用户很多信息拿到并返回)。

不足:需要设置很多的查询和错误处理(前端查询两个参数,一个出错,怎么返回;数据量较大,传输更加消耗时间——网络良好的情况下,不需要考虑这个)。

0213 vps 云服务器 物理服务器 的区别

物理服务器:真实的服务器,用于大企业,可靠性比较高,需要专人维护。内部维护比较安全稳定(例如金融电力通信行业)。

vps: Virtual Private Server(虚拟私有服务器),一般架设在云端,有固定的带宽,个人博客可以搭建在这里。企业的网站不适宜搭建。

云服务器:是 vps 的加强版,带宽可变,国内主要是华为云,阿里云,国外是亚马逊。

0878 服务器日志如何维护

1、设置不同日志等级,info warning error 避免日志打印过多。

2、每天创建日志文件,避免单日的日志太多。

3、可以定期把日志发送到邮箱,定期清理早期废弃的日志。

4、日志可以打印到单独的路径下,使用 logs/服务名称/警告级别/时间戳,多级打印目录。

0842 serverless 无服务器架构

Serverless无服务器架构是一种云计算架构模式

Michael 总结:云服务提供商,提供了云服务器+运维+登录验证,开发者只需要编辑业务和功能,不需要考虑底层运维

基本概念

开发者不用管服务器的配置、管理与运维,只需写业务逻辑代码并部署,由云服务提供商按需分配资源执行代码,按实际使用资源付费。

核心特点

  • 事件驱动:特定事件,触发应用执行,无需人工干预服务器操作。

  • 自动缩放:依业务负载自动扩缩资源,避免浪费。

  • 按使用量计费:按函数调用次数、执行时长等核算费用,控制成本。

主要组成部分

  • 函数即服务(FaaS):开发者写函数代表业务逻辑,被事件触发后,在云平台资源环境运行,运行完资源自动释放。

  • 后端即服务(BaaS):云服务提供数据库、身份认证等后端功能,开发者可直接用,简化开发。

优势

  • 降低运维成本:无需操心服务器运维事务,节省人力、物力和时间成本。

  • 加速开发进程:聚焦业务逻辑,利用现成资源,高效开发并推向市场。

  • 灵活应对变化:能适应业务量、功能变化,保障应用良好运行。

应用场景

  • Web应用开发:创业公司快速搭建包含多功能的Web应用。

  • 移动应用后端服务:为移动应用提供如数据存储、推送通知等后端服务,并按需调资源。

  • 物联网应用:处理物联网设备产生的数据及触发的操作,按需分配资源。

局限性

  • 冷启动问题:函数长时间未调用,再触发可能有延迟,对实时性要求高的场景不太适用。

  • 不适合复杂长期运行任务:处理长时、复杂状态管理任务效率不高。

  • 依赖云服务提供商:依赖其功能和资源配置,迁移应用可能有挑战。

0841 对象存储

对象存储 S3,是一种用于存储和管理数据的云计算存储架构。

Michael 总结:

传统文件结构:树形结构,可能存在嵌套很深问题,不能标记元数据,查找遍历文件树性能较差。

对象存储:用文件唯一标识和文件内容,组成对象结构,数据类型扁平化,便于扩展,便于编辑元数据。不是很直观的看出不同文件的依赖关系(parent_node_id, child_node_ids)。

基本概念

对象存储将数据以对象的形式进行存储。

一个对象包含了数据本身、相关的元数据(如对象的名称、创建时间、大小等信息)以及一个唯一标识符。

与传统的文件系统按文件目录层级结构存储、块存储以固定大小的数据块为单位不同,对象存储从逻辑上更扁平,通过对象的唯一标识(id)来进行访问和管理。

存储结构特点

  • 数据扁平化:它摆脱了传统文件系统复杂的目录树结构,海量数据存储时查找等操作相对更高效,不需要像文件系统那样层层进入目录去定位文件。例如在存储海量的图片、视频等文件时,不需要构建很深很复杂的文件夹层级。

  • 元数据管理:每个对象所带的元数据能提供丰富的描述信息,方便根据不同的属性(如创建时间范围、文件大小区间等)对对象进行分类、检索以及设置不同的访问权限等操作。

优势

  • 可扩展性强:能够轻松应对海量数据的增长,无论是存储几百GB的数据还是几百PB甚至更多的数据,都可以通过增加存储节点等方式灵活扩展存储容量,很适合互联网企业不断增长的业务数据存储需求,像电商平台大量的商品图片、用户评价中的图片视频等数据存储。

  • 数据安全性高:通常具备多副本冗余存储机制,数据会在不同的存储设备甚至不同的数据中心保存多个副本,即使某个存储节点出现故障,也能保障数据不丢失且可正常访问,同时还支持访问控制、加密等多种安全措施来保护数据隐私。

  • 性能优势:采用分布式架构,能并行处理大量的读写请求,在应对高并发的访问场景时(比如视频网站大量用户同时在线观看视频,频繁请求视频数据),可以提供稳定且高效的读写服务。

应用场景

  • 云存储服务:很多云服务提供商提供的网盘等云存储功能就是基于对象存储构建的,用户可以方便地上传、下载自己的文件,像百度网盘等存储大量用户的各类文件。

  • 大数据存储:企业积累的海量日志数据、用户行为数据等,借助对象存储来长期保存,后续用于数据分析挖掘等工作,例如互联网公司分析用户浏览轨迹来优化推荐算法。

  • 静态资源存储:网站的图片、脚本、样式文件等静态资源,放置在对象存储中,能快速响应客户端的访问请求,提升网站的加载速度和性能。

访问方式

可以通过多种协议和API(应用程序编程接口)进行访问,常见的如 RESTful API,开发人员可以在自己的应用程序中方便地集成对象存储功能,实现数据的上传、下载、删除等操作,无论是Web应用、移动端应用还是后端的数据处理服务等都能与之对接。

0839 caddy 配置和含义

Caddy 是一款开源的、用 Go 语言编写,轻量级 Web 服务器,同时具备反向代理服务器功能

Michael 笔记:candy 是 nginx 的替代品

特点

  • 自动 HTTPS 配置:它能自动从 Let's Encrypt 等证书颁发机构获取并更新 SSL/TLS 证书,极大地简化了网站启用加密连接(https)的流程,让网站可以轻松实现安全访问,无需手动去申请和配置复杂的证书相关内容。

  • 配置简单:使用简洁直观的配置语法,相较于一些传统的 Web 服务器(如 Apache、Nginx 等),其配置文件更易读懂和编写,新手也能较快上手,快速搭建起服务器应用。

  • 跨平台支持:可以运行在 Windows、Linux、macOS 等多种主流操作系统上,方便不同环境下的部署使用,满足多样化的部署需求。

  • 灵活的插件机制:拥有丰富的插件生态,通过插件可以扩展诸如缓存、认证、日志记录等诸多功能,能够根据具体的业务场景定制化服务器功能。

应用场景

  • 网站托管:可以直接用来托管静态网站,将网站的相关文件部署在服务器上指定位置,通过 Caddy 配置好对应的域名等信息,就能对外提供访问服务。

  • 反向代理:可作为反向代理服务器,位于后端真实服务器(比如运行着 Web 应用的服务器)之前,接收来自互联网的请求,并将请求转发到后端服务器处理,同时可以做负载均衡、安全防护等相关工作,适用于架构较为复杂的网络应用部署场景。

Caddy 的配置系统非常灵活,支持多种格式(Caddyfile、JSON、环境变量)。

下面介绍最常用的 Caddyfile 格式,并通过示例说明核心配置概念。

基本结构

Caddyfile 采用 站点块(Site Block)​ 组织配置,每个块对应一个域名或 IP 地址:

example.com {
    # 针对 example.com 的配置指令
    root * /var/www/html
    file_server
}
:8080 {
    # 监听 8080 端口的配置
    reverse_proxy http://localhost:3000
}

核心指令

1. 静态文件服务
example.com {
    root * /var/www/html  # 设置网站根目录
    file_server           # 启用文件服务器
    encode gzip zstd      # 启用压缩
}
2. 反向代理

将请求转发到后端服务(如 Node.js、Python 应用):

api.example.com {
    reverse_proxy http://localhost:3000  # 转发到本地 3000 端口
}
3. HTTPS 配置

Caddy 默认自动管理证书,无需额外配置。若需自定义:

example.com {
    tls me@example.com  # 指定邮箱(可选)
    # 或使用自定义证书
    # tls /path/to/cert.pem /path/to/key.pem
}
4. 日志与错误处理
example.com {
    log {
        output file /var/log/caddy/access.log
        format json
    }
    handle_errors {
        respond "Error: {http.error.status_code}"
    }
}
5. 路径匹配与处理组

针对不同路径应用不同配置:

example.com {
    handle /api/* {  # 匹配 /api/ 开头的路径
        reverse_proxy http://localhost:8000
    }

    handle /static/* {  # 静态资源
        root * /var/www/static
        file_server
    }

    handle {  # 默认处理
        root * /var/www/html
        file_server
    }
}

高级功能

1. 请求头与响应头修改
example.com {
    header {
        +Cache-Control "max-age=3600"  # 添加响应头
        -Server                        # 移除 Server 头
    }
}
2. 缓存控制
example.com {
    handle /cache/* {
        cache {
            match path *.jpg *.png *.css *.js
            match header Cache-Control public
            max_size 100MB
        }
    }
}
3. 基本认证
example.com/admin {
    basicauth * {
        username hash(password)  # 使用 caddy hash-password 生成哈希
    }
    root * /var/www/admin
    file_server
}
caddy run --config /etc/caddy/Caddyfile

常用命令

  • 启动服务:caddy run(前台运行)或 caddy start(后台运行)

  • 重新加载配置:caddy reload

  • 停止服务:caddy stop

参考资源

0824 服务器如何部署多个服务

需求:一台服务器上部署多个服务,例如同时部署博客、部署小说服务器服务。

关键点:设置 nginx 的不同路径,默认入口改成博客的路径,其他服务正常启动。

1、安装环境(Ubuntu系统)

sudo apt update

sudo apt install nginx python3 python3-pip

# 启动 nginx
sudo systemctl start nginx

# 自启动 nginx
sudo systemctl enable nginx

2、设置不同服务的目录

/var/www/
├── blog/          # 博客文件目录
│   ├── index.html
│   ├── css/
│   ├── js/
│   └── images/
└── dev/           # 开发项目目录
    ├── project1/
    ├── project2/
    └── ...
  • /var/www/blog:用于存放博客的 HTML、CSS、JavaScript 等文件。

  • /var/www/dev:用于存放开发项目,每个项目可创建一个独立的子目录。

3、配置 Nginx 以支持博客

编辑 Nginx 的配置文件,通常位于 /etc/nginx/sites-available/default:

sudo nano /etc/nginx/sites-available/default

将配置文件中的 root 指令修改为博客目录:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/blog;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}

保存并退出文件后,检查配置文件是否存在语法错误:

sudo nginx -t

若没有错误,重新加载 Nginx 配置:

sudo systemctl reload nginx

4、上传博客文件

你可以使用 scp 命令或者 FTP 工具将本地的博客文件上传到 /var/www/blog 目录。例如,使用 scp 命令:

scp -r /path/to/local/blog/* user@your_server_ip:/var/www/blog/

5、测试其他服务

在 /var/www/dev 目录下创建和开发项目。

例如,创建一个 Python Flask 测试项目:

cd /var/www/dev

mkdir my_flask_project

cd my_flask_project

python3 -m venv venv

source venv/bin/activate

pip install flask

增加一个测试应用

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

运行 Flask 应用:

python app.py

0694 微服务架构是什么

个人理解:

服务器架构发展历史

早期的互联网应用模式,就是 BS 模式,browser-server 服务器-客户端模式。

当访问量增加后,单一服务器无法处理复杂事务,就增加了分布式系统,负载均衡、反向代理服务器,用于平衡不同服务器的压力。

当功能越来越多,传统的服务器模式中,一个服务器上需要运行很多服务(例如 用户登录,用户评论,书籍管理,操作日志等各种服务),那么在一个服务器上运行多个服务,可能代码维护比较复杂,可能测试流程复杂,代码的耦合性等较大——例如更改新的功能,可能需要测试全部的服务等。

所以此时引入了微服务和微服务架构等。

微服务

微服务:不同的服务器负责不同单一的功能(可能是外部多个 APIs),如果某个功能改动,不会影响其他功能;某个服务扩容也不会影响其他功能。

在多个业务微服务模块基础上,还需要支持服务(服务网关 api-gateway, 服务注册中心,服务配置中心)

  • 服务网关:统一处理外部的请求,并把不同类型的服务继续发送到不同的服务上

  • 服务注册中心:不同服务之间不清楚对方的功能和变化,所以需要在注册中心去注册服务,这样就能互相调用了 rpc

  • 服务配置中心:如果每个服务都有自己的配置,那么不利于后期维护和更新(运维)所以统一一个服务配置项目

优点

不同服务位于不同的服务器,方便扩容,方便改动功能,方便测试维护,故障隔离。

缺点

增加了学习和部署成本。如果小公司,服务不多,还要部署多个微服务,那么维护比较困难。

在前端中的使用

理论上前端不复杂时,不需要微服务架构,实际上也用到类似的概念。

不同模块(用户服务,书籍服务)等维护在不同模块,模块内部只实现某个功能的管理,外部业务组件调用模块的 API,不需要考虑模块的具体细节。这个可以说,是 redux 状态管理的一个扩展。redux 仅仅把一个状态维护在公共部分。微前端微服务就是把状态进一步封装成一个前端服务,例如 users 是状态,那么写一个 UserService 提供了 getUsers, setUsers, clearUsers APIs 外部调用这些 API 即可完成 user 的操作,不需要考虑 users 具体怎样存储的,怎样和服务器交互的等等逻辑。

参考

https://zhuanlan.zhihu.com/p/381847108

https://zhuanlan.zhihu.com/p/345552079

https://www.zhihu.com/question/600277145

0700 S3是什么

‌S3,Simple Storage Service 简单存储服务

对象存储服务协议

‌S3,全称为‌ Amazon Simple Storage Service,是‌亚马逊推出的一种对象存储服务协议,旨在为开发者提供一种简单、高效、可靠的方式来存储和管理大量的数据对象。S3协议的设计目标是提供一种易于使用的接口,使得用户可以通过互联网轻松地存储、访问和管理数据。它采用了基于对象的存储模型,每个数据对象都被视为一个独立的实体,可以通过唯一的键来识别和访问。

S3的基本特性包括:

  • 对象存储:S3是一种对象存储服务,用户可以将文件保存到S3存储桶上。

  • 文件大小:每个文件的大小可以从0字节到5TB,支持分段上传最大5TB的文件。

  • 存储容量:S3存储桶的容量是无限的,没有总文件容量的限制。

  • 命名规则:S3存储桶的命名是全球唯一的,不能和任何区域的任何账号内的S3存储桶同名。

S3的URL结构也具有其独特性,通过统一的资源标识符(URI)进行查找和访问。

这种服务模式特别**适合存储和访问大量的非结构化数据,如视频、图片、文档等,并且能够根据需求快速扩展,满足各种规模的数据存储需求**。‌

0214 docker 和 K8S 的关系

docker 和 K8S 的关系:docker and kubernetes

Docker

Docker 是轻量级的环境部署工具,相对传统虚拟机,占用资源少,可以提供若干个独立的环境部署不同的服务,架构是 image-container 从镜像创建不同的容器,然后在容器中执行操作,创建服务。不同容器共用底层硬件资源,数据层不互相影响。

image: 镜像(类)

container: 容器(类的实例)

docker 只适用于单机部署环境,对于集群部署服务,文件管理等需要下面的 k8s.

undefined

k8s

k8s 是一个集群环境-cluster,包括一个 Master 主节点和很多 Node 工作节点。

Master 主节点:负责调度管理不同的 Node 节点,提供了对外的接口 API,对内的控制器 Controller,Node 节点之间的调度,以及 etcd 存储系统。

Node 工作节点:每一个工作节点,运行了 Docker 创建容器的工具,创建了多个 POD 进程(独立的服务)还有其他的支持模块,例如 proxy 代理,日志模块,搜索模块等。

参考链接

https://juejin.cn/post/6952331691524358174

https://juejin.cn/post/6844903943051411469

https://zhuanlan.zhihu.com/p/53260098

0877 如何实现后端搜索

1、数据库加索引

2、Algolia

小型项目,可以使用 Algolia 进行搜索,很多文档都使用这个搜索引擎

algolia本质上是个搜索引擎服务接口,把索引提前建好,索引就像目录,提前建好搜索时就能秒出。我们作为用户,在搜索关键词时向algolia提出请求,由它计算并传送结果,送交我们的图书馆显示。algolia提供给个人用户上限1万条索引记录和每月1万次的搜索次数。

存在的问题:

1、index.json 这个中文和英文索引,怎么生成?

2、本地自己的搜索组件中,怎样调用 Algolia 这个索引库?

3、大型项目 Elastic search(ES)

通常搜索使用 Elasticsearch(ES)这个适用于大型项目

4、Hugo

https://github.com/gohugoio/hugo Go 语言框架实现的搜索系统,看一下能否应用到目前的项目

https://zhuanlan.zhihu.com/p/568538285 这个博客是是基于 hugo 框架实现的个人图书馆

Hugo 应该是内置的搜索配置文件

0273 VNC 连接

https://blog.csdn.net/jks212454/article/details/131453847

VNC (Virtual Network Console)是虚拟网络控制台的缩写。它 是一款优秀的远程控制工具软件,可以实现远程控制计算机的功能。应用于云服务器控制平台,便于远程操作。

0412 代理服务器和反向代理服务器

代理服务器 Proxy 三个作用

1、缓存:代理服务器是客户端和真实服务器的链接,代理服务器硬盘可以缓存真实服务器中返回的数据,如果请求量较大或者重复请求时,可以加快速度;

2、防火墙:代理服务器可以过滤一些不安全的请求,起到防火墙的作用;

3、翻墙:代理服务器可以翻墙访问其他不能直接访问的服务器的资源。

反向代理 reverse proxy

反向代理部署在服务器端。当用户请求很多时,单一服务器无法满足用户的大量的请求,所以设置一个反向代理服务器,处理负载均衡。当我们访问 baidu.com 时,发送请求到 nginx 反向代理服务器,然后反向代理服务器再把请求转到真实的服务器(分布式集群)。用户可以获取相同的资源,不需要知道真实的服务器,单个服务器端的压力会减小。

反向代理服务器需要将用户发到服务器的请求分配到空闲的服务器上,同时真实服务器可以返回自己的服务到反向代理服务器;如果需要增减新的服务器,不会影响到现有的服务,只需要修改负载均衡服务器列表。用户域名解析的服务器 IP 不是真实的服务器 IP,是负载均衡服务器的 IP。

常用协议和对应端口号

http 代理,主要用于网站访问,端口号 80,8080

ssl 代理:加密网站代理,端口号 443;

ftp 代理,端口号 21,2121;

POP3 代理,端口号 110;

telnet 代理,端口号 23;

socks 全能代理,支持 http/tcp/udp 协议,标准端口是 1080

0408 nginx 常用配置和含义

详细内容见本地实际配置

下面是简化的 nginx.conf

log_format 日志模块

定义了一个 yuiformat 的变量,包括一系列日志

nginx服务器日志相关指令主要有两条

1 log_format,用来设置日志格式
2 access_log,用来指定日志文件的存放路径、格式和缓存大小

参数说明:
$remote_addr 和 $http_x_forwarded_for 用于记录IP地址
$request 用于记录请求URL与HTTP协议
$status 用于记录请求状态,例如成功时状态为200,页面找不到时状态为404
$body_bytes_sent 用于记录发送客户端的文件主体内容大小
$http_referer 用于记录是从哪个页面链接访问过来的;
$http_user_agent 用于记录客户浏览器的相关信息。
$upstream_response_time 请求过程中,upstream 响应时间
log_format yuiformat '[$time_iso8601] $http_x_forwarded_for $remote_addr "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';

upstream 上游模块

可支持多个上游服务器,实现负载均衡和主备分离

可以设置多个上游服务器,并设置权重 weight,nginx 把请求依次发送到不同服务器上,减少并发量

keepalive 指令用于设置长连接的超时时间

upstream servers {
  server 127.0.0.1:5000 weight=5;
  server 127.0.0.1:5001 weight=5;
  server 127.0.0.1:5002 weight=1;
  server 127.0.0.1:5003 backup;
  keepalive 20;
}

server 服务器模块

server {
  # 这个 default_server 块是默认的服务器块。当没有其他服务器块能够处理请求时,Nginx 会使用默认的服务器块。
  listen 80 default_server;
  listen [::]:80 default_server;


  # root 指定的是服务器根目录,用于处理 HTTP 请求时,所使用的默认根目录
  # 例如,若root /var/www/html; 则访问 http://example.com/index.html 会定位到 /var/www/html/index.html 文件
  root /var/www/html;


  index index.html index.htm index.nginx-debian.html

  # server_name 用于设置虚拟主机服务名称
  server_name _;

  # 访问根目录 /
  location / {
    proxy_pass http://127.0.0.1:8000;

    # proxy_set_header 设置代理服务器,向后端服务器转发请求时的头部信息。
    # 这个指令允许你定制代理请求头,比如修改用户代理(User-Agent)、主机名、内容类型等
    # 以便更好地控制流量或隐藏客户端信息。
    # Host $host; 设置请求的目标主机为原始请求的主机;

    proxy_set_header HOST $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;

    # X-Forwarded-For: 传递客户端代理的 IP 链接,对于多个代理层会有多个 IP。


    # proxy_read_timeout 通常在代理服务器中使用,它设置了从上游服务器接收数据的最大等待时间。
    # 如果超过这个时间限制但没有接收到预期的数据,代理服务器会认为连接超时,然后可能会关闭连接,以秒为单位
    # 用于控制网络请求的响应时间,防止因长时间等待导致的性能问题或资源浪费。
    proxy_read_timeout 600s;


    # client_max_body_size 是一个配置选项,通常用于Web服务器中,允许客户端通过HTTP请求发送的最大数据体(body)大小。这个设置对于限制潜在的恶意攻击或防止服务器资源被大文件上传消耗过多。
    # 如果设置了较高的值,可能会增加服务器处理大文件的能力,但同时也增加了被DDoS攻击的风险。
    # 如果设置过低,可能会导致一些大文件无法正常上传,例如文件上传功能的网站。
    # 在实际部署中,你需要根据应用的需求和服务器性能来合理配置这个值。
    client_max_body_size: 0;

    # add_header 用于在 HTTP响应头 中添加自定义的元数据,这对于控制HTTP缓存、设置安全策略、提供特定信息给客户端或代理服务器等场景非常有用。
    # 使用add_header,你可以动态地插入如 Cache-Control、Content-Security-Policy、X-Frame-Options等头信息。
    add_header Access-Control-Allow-Origin * always;
    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
    add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
    if ($request_method = 'OPTIONS') {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type,Content-Range,Content-Disposition";
        return 204;
    }
    # 日志位置
    access_log /data/logs/yui.access.log yuiformat;
    error_log /data/logs/yui.error.log;
  }

  # alias 别名,nginx会将 location 后面的 xxx 替换为 alias 指令指定的路径 xxx
  location /media/assets/scripts {
    alias /data/dev/static/scripts;
  }
  location /media {
    alias /data/dev/statis/media;
  }
}

0823 使用 socket.io 发送消息

需求:使用 socket-io 进行消息发送,或者进行多人编辑协同

第一步,安装依赖

{
  "name": "sexample",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "express": "^4.18.2",
    "socket.io": "^4.7.1"
  },
  "scripts": {
    "start": "node index.js"
  },
  "author": "Michael An",
  "license": "ISC"
}

第二步,服务器使用 express + socket

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);

// express 基本支持
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

// socket-io 提供协同
io.on('connection', (socket) => {
  socket.on('in-out message', (msg) => {
    io.emit('in-out message', msg);
  });

  socket.on('chat message', (msg) => {
    io.emit('chat message', msg);
  });

  socket.on('disconnect', () => {
    io.emit('in-out message', '某个人退出了聊天室');
  });
});

// 开启服务器
server.listen(3050, () => {
  console.log('listening on *:3050');
});

第三步,客户端显示基本 UI

<!DOCTYPE html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }
      #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); }
      #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; }
      #input:focus { outline: none; }
      #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages > li { padding: 0.5rem 1rem; }
      #messages > li:nth-child(odd) { background: #efefef; }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form id="form" action="">
      <input id="input" autocomplete="off" />
      <button>Send</button>
    </form>
  </body>
  <script src="/socket.io/socket.io.js"></script>
  <!-- <script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script> -->
  <script>
  </script>
</html>

第四步,前端显示 socket-io 通信信息

let socket = io();
let form = document.getElementById('form');
let input = document.getElementById('input');

// 打开页面时,直接让用户输入自己的姓名(实际上应该需要后端登录验证,这里为了简单处理)
let username = prompt("请输入您的姓名:");
window.currentUserName = username;

// 向全局广播进入的消息
socket.emit('in-out message', username + ' 进入了聊天室');

// 点击按钮,提交消息
form.addEventListener('submit', function(e) {
  // 阻止表单默认提交
  e.preventDefault();
  if (input.value) {
    // 发送给全部用户
    socket.emit('chat message', input.value + ' by ' + username);
    input.value = '';
  }
});

// 监听消息,并把消息显示到页面
socket.on('chat message', function(msg) {
  let item = document.createElement('li');
  item.textContent = msg;
  messages.appendChild(item);
  window.scrollTo(0, document.body.scrollHeight);
});

// 监听到进出的消息
socket.on('in-out message', function(msg) {
  let item = document.createElement('li');
  item.textContent = msg;
  messages.appendChild(item);
  window.scrollTo(0, document.body.scrollHeight);
});

// 退出时,向全局广播退出的消息
// 如果直接关闭浏览器或者操作系统,获取不到用户用户的退出信息
window.onbeforeunload = function() {
  socket.emit('in-out', username + ' 退出了聊天室');
};

实现效果

undefined

未来扩展功能

1、需求:支持显示谁在打字

解决:当用户键盘输入时,发送请求给服务器并广播给其他用户

2、需求:支持在线的用户列表

解决:增加心跳检测,检测用户是否在线(客户端定期向服务器发送消息,如果长时间不发送消息,那么就是用户离线)

3、需求:支持私聊信息

解决:发送消息时,增加 target ID, 服务器广播后,指定的 ID 接收消息并显示,其他的不显示

4、需求:支持多人编辑普通文本

解决:普通文本可以按照行号进行分割,字符串转换成一个数组或者对象。

腾讯文档:当某人编辑某个段落时,此人锁定这个段落,然后其他人无法编辑这个段落,但是可以编辑其他段落

实际项目:某人和其他人可以同时编辑多个段落,最后提交到服务器,然后服务器做 diff 算法,并增加版本号,然后分发给其他客户端。客户端中对比版本号进行更新

5、需求:支持多种协同 数据结构划分,把 chat message 分成不同的消息,然后不同的消息按照不同类型处理

需求:权限控制等,管理能否把某个用户强制下线操作 需要服务器端进行登录验证,socket 向 python 请求管理员权限,然后把某个连接断开

0881 BT-Panel 是什么

宝塔面板

便捷的操作界面:提供了可视化的 Web 操作界面,相较于传统通过命令行来管理服务器的方式,极大降低了操作门槛,即使是不太熟悉服务器运维命令的新手也能轻松上手,快速进行各种服务器相关配置操作。

多环境支持:支持多种常见的服务器环境搭建与管理,比如可以轻松部署 LNMP(Linux、Nginx、MySQL、PHP)以及 LAMP(Linux、Apache、MySQL、PHP)等环境,满足不同类型网站、应用程序的运行需求。

软件安装管理便捷:集成了众多常用的服务器软件,像 Web 服务器软件(如 Nginx、Apache)、数据库管理系统(如 MySQL、MariaDB 等)以及各种编程语言的运行环境,能够方便地进行软件的一键安装、更新、卸载等操作。

站点管理功能强大:可以方便地进行网站的创建、域名绑定、SSL 证书配置等工作,便于快速搭建和管理多个网站,还能针对每个站点进行个性化的配置,例如设置访问权限、伪静态规则等。

安全管理功能:提供了诸如防火墙设置、端口安全管理、恶意访问拦截等安全防护相关功能,帮助服务器管理员增强服务器的安全防护能力,降低被攻击的风险。

0883 nmap 命令扫描端口

nmap + ip 地址

可以扫描服务器开发的端口号和服务,例如下面的扫描结果

Nmap scan report for 39.98.59.100
Host is up (0.015s latency).
Not shown: 995 filtered tcp ports (no-response)

PORT     STATE  SERVICE
80/tcp   open   http
443/tcp  closed https
8888/tcp open   sun-answerbook
9001/tcp open   tor-orport
9002/tcp open   dynamid

可以看到 80 端口打开 http 网络服务,443 ssl 端口关闭不支持 https 网络服务

8888 9001 9002 端口都打开,启动不同的服务

22 ssh 端口没有打开(远程登录服务)

黑客可以利用这个工具进行扫描,通过端口开放进行破解等(例如对数据库端口尝试暴力破解密码)