一本码簿

众里寻码千百度,那段却在github处。

初始安装

1
2
3
4
5
6
7
8
sh -c "$(wget -qO- https://haies.cn/assets/install-zsh.sh)"
sh -c "$(wget -qO- https://haies.cn/assets/apt-install.sh)"
sh -c "$(wget -qO- https://haies.cn/assets/debian-init.sh)"
sh -c "$(wget -qO- https://haies.cn/assets/centos-init.sh)"
sh -c "$(wget -qO- https://haies.cn/assets/ubuntu-init.sh)"

sh -c "$(wget -qO- https://haies.cn/assets/yum-install-docker.sh)"
sh -c "$(wget -qO- https://haies.cn/assets/dns.sh)"

压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
7za a -mx0 -v4g backup.7z /path/to/data
7za a -mx0 -v4g backup.7z /path/to/*
7za x -mx0 "backup.7z.001" -o/path/to/

7za a -tzip backup.zip /path/to/data
7za x -tzip backup.zip /path/to/data

tar -cvpf - /path/to/folder | split -d -b 4g - backup.tar
tar -xvpf backup.tar.00 -C /path/to/target_folder #要求分卷是纯 tar 分割(未压缩),且分卷命名连续
cat backup.tar.* | tar -xpv -C /path/to/folder

tar -czvpf - /path/to/folder | split -d -b 4g - backup$(date +%Y%m%d).tar.gz
cat backup.tar.gz.* | tar -xzvp -C /path/to/folder
gzip -t backup.tar.gz

tar -cvpf nginx.tar /etc/nginx
tar -xvpf nginx.tar -C /path/to/folder

ls -l |grep ^d|awk {'print $9'}|xargs -t -i 7z a {}.7z {}

7z mx参数
7z mx参数
7z 压缩方案
7z 压缩方案

查看系统信息

1
2
3
4
5
6
id -un
uname -a
lsb_release -c
lscpu
lshw
cat /proc/meminfo

磁盘管理

查看磁盘格式:lsblk -f
查看磁盘信息:fdisk -l

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkfs.xfs -f /dev/vdb&&
mkdir /hda&&
mount /dev/vdb /hda&&
echo /dev/vdb /hda xfs defaults 0 0 >> /etc/fstab

mkfs.ext4 -T huge -b 4096 /dev/vdb&&
mkdir /hda&&
mount /dev/vdb /hda&&
echo /dev/vdb /hda ext4 defaults 0 0 >> /etc/fstab

mkfs.ext3 -T largefile -i 4096 /dev/xvdb1&&
mkdir /hda&&
mount /dev/xvdb1 /hda&&
echo /dev/xvdb1 /hda ext3 defaults 0 0 >> /etc/fstab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
parted /dev/sda
resizepart 2
pvresize /dev/sda
lvextend -l +100%FREE /dev/mapper/centos-home
xfs_growfs /dev/mapper/centos-home

fdisk /dev/sdb
pvcreate /dev/sdb1
vgextend ubuntu-vg /dev/sdb1
lvextend -L +9G /dev/ubuntu-vg/root

pvs
vgs
lvs

pvdisplay
vgdisplay
lvdisplay

NTFS读写

1
2
3
apt-get install ntfs-3g
mount -t ntfs-3g /dev/hdax /mnt/windows
/dev/hdax /mnt/windows ntfs-3g defaults 0 0

目录操作

迁移目录:

1
2
3
4
5
6
7
8
mkfs.xfs -f /dev/xvdb2&&
mkdir /vartemp&&
mount /dev/xvdb2 /vartemp&&
rsync -avx /var /vartemp&&
mv /var /var.old&&
mkdir /var&&
umount -lf /dev/xvdb2 /vartemp&&
mount /dev/xvdb2 /var

目录备份还原:dumprestore
目录占用查看:fuserlsof
合并文件夹:cp -rlfv parta/* partb/* part

配置主机

在~/.ssh/config中增加

1
2
3
4
5
6
Include ~/.ssh/config.d/*
Host aws
Hostname 10.2.*.*
Port 22
User ubuntu
IdentityFile ~/.ssh/aws.pem

远程执行命令

1
ssh root@59.202.*.* "cd /home/git/.ssh&&cat id_rsq.pub>>authorized_keys"

挂载DVD源

1
2
3
4
5
mkdir /iso&&
mount -t iso9660 -o loop /hda/debian7.8/debian-7.8.0-amd64-DVD-1.iso /iso&&
echo deb file:///iso/ wheezy main contrib>/etc/apt/sources.list&&
sudo apt-get update&&
sudo apt-get upgrade

增加用户

1
2
3
4
useradd oneuser -d /var/oneuser -G wheel&&
usermod -aG root oneuser&&
passwd oneuser

其他安装

  1. 配置Python环境 (使用阿里云镜像)

    鉴于UOS自带Python版本可能较低,我们使用 pyenv 安装新版Python。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 安装pyenv
    git clone https://gitee.com/mirrors/pyenv.git ~/.pyenv
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
    echo 'eval "$(pyenv init -)"' >> ~/.zshrc
    source ~/.zshrc

    # 配置pyenv使用国内镜像加速Python安装
    echo 'export PYTHON_BUILD_MIRROR_URL="https://mirrors.aliyun.com/python/"' >> ~/.zshrc
    source ~/.zshrc

    # 通过pyenv安装Python 3.8.12 (此版本与QEMU 7.2.21兼容性好)
    pyenv install 3.8.12
    pyenv global 3.8.12

以下是针对生产环境的GeoServer系统配置与数据发布完整教程,涵盖Docker化部署、影像与矢量发布全流程。

一、系统配置:基于Docker部署

1. 目录结构与文件准备

1
2
3
4
5
6
geoserver-production/          # 项目根目录
├── docker-compose.yml # Docker Compose 编排文件
├── .env # 环境变量文件(用于隔离敏感信息)
├── geoserver_data/ # GeoServer 主数据目录 (对应 GEOSERVER_DATA_DIR)
├── geoserver_gwc/ # GeoWebCache 瓦片缓存 (对应 GEOWEBCACHE_CACHE_DIR)
└── geoserver_logs/ # 应用日志目录

2. 关键环境变量详解(部署核心)

kartoza/docker-geoserver 完全通过环境变量配置 GeoServer 核心行为,以下是启动容器时最关键的环境变量分类及说明:

参数名称 描述与作用 建议值 / 示例 关键配置要点
GEOSERVER_DATA_DIR GeoServer 主数据目录,用于存储工作区、数据存储、样式等所有配置信息。 /opt/geoserver_data/data 必须通过卷(volumes)挂载到宿主机,实现配置持久化,避免容器重启后数据丢失。
GEOWEBCACHE_CACHE_DIR GeoWebCache 瓦片缓存目录,用于存储预生成的栅格或矢量瓦片文件。 /opt/geoserver_data/gwc 1. 同样必须挂载持久化
2. 生产环境建议使用高速存储(如SSD)。
3. 需定期清理旧缓存或设置磁盘配额。
GEOSERVER_ADMIN_USER 管理员用户名。出于安全考虑,建议修改默认值。 自定义(如:gs_admin 与强密码配合使用。仅在初始设置时生效,之后在Web界面修改。
GEOSERVER_ADMIN_PASSWORD 管理员密码。这是最关键的安全设置。 自定义(强密码) 必须修改。使用高强度密码(如:MyGe0S3rv3r!2024)。可通过.env文件管理,避免硬编码。
INITIAL_MEMORY JVM 堆内存初始大小 2g 通常设置为与 MAXIMUM_MEMORY 相同,以避免运行时动态调整带来的性能开销。
MAXIMUM_MEMORY JVM 堆内存最大大小。对性能影响最大。 4g8g 1. 黄金法则:不超过宿主机可用物理内存的75%。
2. 对于大量瓦片或高并发,建议设置为 8g 或更高。
STABLE_EXTENSIONS 预安装的官方稳定插件列表。用逗号分隔。 vector-tiles,monitor,importer 1. vector-tiles(矢量瓦片)是必选项。
2. monitor 用于生产监控。
3. importer 方便数据导入。
COMMUNITY_EXTENSIONS 预安装的社区插件列表。用逗号分隔。 control-flow,backup-restore 1. control-flow 可控制并发请求,防止过载。
2. backup-restore 便于配置备份。
GEOSERVER_CONTEXT_ROOT Web 应用的上下文路径(URL路径) /geoserver 默认即为 /geoserver,访问地址为 http://host:port/geoserver。非特殊需求无需修改。
ROOT_WEBAPP_REDIRECT 是否将根路径(/)重定向到 GeoServer 应用 true 设置为 true 后,访问 http://host:8080/ 会自动跳转到 http://host:8080/geoserver/web,非常便利。
CONSOLE_HANDLER_LEVEL 控制台日志输出级别,影响 Docker 日志的详细程度。 INFO 1. INFO:常规生产级别,记录重要事件。
2. DEBUG:调试时使用,日志量巨大。
3. WARN:仅记录警告和错误。

将上表参数整合到一个 docker-compose.yml 文件中,其核心部分如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
services:
geoserver:
image: kartoza/geoserver:latest
container_name: prod_geoserver
environment:
- GEOSERVER_ADMIN_USER=${GEOSERVER_ADMIN_USER}
- GEOSERVER_ADMIN_PASSWORD=${GEOSERVER_ADMIN_PASSWORD}
- GEOSERVER_DATA_DIR=/opt/geoserver/data_dir
- GEOWEBCACHE_CACHE_DIR=/opt/geoserver/gwc
- INITIAL_MEMORY=${INITIAL_MEMORY}
- MAXIMUM_MEMORY=${MAXIMUM_MEMORY}
- STABLE_EXTENSIONS=${STABLE_EXTENSIONS}
- COMMUNITY_EXTENSIONS=${COMMUNITY_EXTENSIONS}
- ROOT_WEBAPP_REDIRECT=true
- CONSOLE_HANDLER_LEVEL=${CONSOLE_HANDLER_LEVEL}
volumes:
- ./geoserver_data:/opt/geoserver/data_dir
- ./geoserver_gwc:/opt/geoserver/gwc
- ./geoserver_logs:/opt/geoserver/logs
ports:
- "8080:8080"

3. 日常运维命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 1. 前台启动(调试用,实时看日志)
docker-compose up

# 2. 后台启动(生产环境首选,不占用终端)
docker-compose up -d

# 3. 强制重新构建(仅修改Dockerfile/镜像后使用,修改环境变量无需此参数)
docker-compose up -d --build

# 4. 停止容器(保留容器和数据)
docker-compose stop

# 5. 重启容器(修改配置后生效)
docker-compose restart geoserver

# 6. 停止并删除容器(保留数据卷,仅删容器)
docker-compose down

# 7. 查看实时日志(排查启动/运行问题)
docker-compose logs -f geoserver

# 8. 查看最近100行日志(快速定位错误)
docker-compose logs --tail=100 geoserver

# 9. 进入容器(手动安装插件/调试)
docker exec -it prod_geoserver /bin/bash

核心配置优先级:数据目录持久化(必配)> 密码修改(必改)> 内存分配(性能关键)> 插件/跨域(按需配置)。

在 GeoServer 中发布 GeoTIFF 格式影像并启用瓦片缓存(通过 GeoWebCache, GWC)的标准步骤如下,适用于大多数 Web 地图应用场景:


二、影像数据发布

1. 准备 GeoTIFF 文件

  • 确保文件具有正确的地理参考信息(坐标系、范围等)。
  • 建议使用EPSG:4490(cgcs2000)、EPSG:4549(cgcs2000_3_gk_120E) 、EPSG:4326(WGS84)或 EPSG:3857(Web Mercator)以兼容主流地图客户端。

2. 登录 GeoServer 管理界面

  • 默认地址:http://localhost:8080/geoserver

3. 创建 Coverage Store

  • 导航:数据 > Stores > Add new Store
  • 选择 GeoTIFF(位于 “Raster Data Sources” 下)
  • 配置参数:
    • Workspace:选择或新建工作空间
    • Data Source Name:输入名称(如 my_geotiff_store
    • URL:填写 GeoTIFF 文件路径(如 file:/path/to/your/image.tif
  • 点击 Save

4. 发布图层(Layer)

  • GeoServer 会自动跳转到图层发布页面
  • 设置关键参数:
    • Name:图层名称(如 my_raster_layer
    • Declared SRS:建议设为文件实际坐标系(如 EPSG:3857)
    • Bounding Boxes:点击 “Compute from data” 和 “Compute from SRS bounds”
  • 保存图层

5. 启用并配置瓦片缓存(GWC)

  • 进入:Tile Caching > Tile Layers
  • 找到刚发布的图层(如 workspace:my_raster_layer),点击进入
  • 配置缓存选项:
    • Enabled:勾选
    • Grid Sets:至少勾选 EPSG:4326 和/或 EPSG:3857
    • Formats:选择输出格式(如 image/pngimage/jpeg
    • (可选)设置缓存目录、过期策略等

6. 预生成(Seed)瓦片(可选但推荐)

  • 在同一页面点击 Seed/Truncate
  • 选择:
    • Operation: Seed
    • Grid Set: 如 EPSG:3857
    • Zoom Start / Stop: 指定要缓存的级别(如 0 到 12)
    • Format: 与上一步一致
  • 点击 Submit 开始切片(后台运行)

7. 访问瓦片服务

  • WMTS(推荐用于瓦片地图)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    http://localhost:8080/geoserver/gwc/service/wmts?
    REQUEST=GetTile&
    SERVICE=WMTS&
    VERSION=1.0.0&
    LAYER=workspace:my_raster_layer&
    STYLE=&
    TILEMATRIXSET=EPSG:3857&
    TILEMATRIX={z}&
    TILEROW={y}&
    TILECOL={x}&
    FORMAT=image/png
  • TMS

    1
    http://localhost:8080/geoserver/gwc/service/tms/1.0.0/workspace:my_raster_layer@EPSG:3857@png/{z}/{x}/{y}.png

💡 提示

  • 首次访问未缓存的瓦片时,GeoServer 会动态生成并自动缓存。
  • 预切片(Seed)可显著提升高并发下的性能。
  • 确保 GeoServer 有足够磁盘空间存放缓存(默认在 GEOSERVER_DATA_DIR/gwc)。

通过以上步骤,即可成功在 GeoServer 中发布 GeoTIFF 影像,并通过内置的 GeoWebCache 实现高效瓦片服务。

三、ESRI ARCGIS影像瓦片发布

瓦片数据准备

确保ArcGIS瓦片目录结构正确:

1
2
3
4
5
6
7
arcgis-cache/
├── conf.xml # 瓦片方案配置文件
├── _alllayers/ # 瓦片数据目录
│ ├── L00/ # 金字塔层级
│ ├── L01/
│ └── ...
└── ArcGIS_瓦片_使用说明.txt

步骤 1:获取并安装 ArcGIS 瓦片插件

  1. 下载插件

    • GeoWebCache 官网 下载对应版本的 ArcGIS 插件(如 gwc-arcgiscache-1.25.4.jar
    • 确保插件版本与 GeoServer 版本匹配
  2. 安装插件

    1
    2
    # 将插件复制到 GeoServer 的 lib 目录
    cp gwc-arcgiscache-1.25.4.jar /path/to/geoserver/webapps/geoserver/WEB-INF/lib/

步骤 2:配置 GeoServer

2.1 配置缓存目录(可选但推荐)

  1. 编辑 geoserver/webapps/geoserver/WEB-INF/web.xml

    1
    2
    3
    4
    <context-param>
    <param-name>GEOWEBCACHE_CACHE_DIR</param-name>
    <param-value>/path/to/your/cache/directory</param-value>
    </context-param>
  2. 重启 GeoServer 使配置生效

2.2 配置 geowebcache.xml

  1. 编辑 geoserver/data_dir/gwc/geowebcache.xml

  2. <layers> 部分添加 ArcGIS 瓦片配置:

    1
    2
    3
    4
    5
    6
    7
    8
    <layers>
    <arcgisLayer>
    <name>your_layer_name</name> <!-- 图层名称 -->
    <tilingScheme>/path/to/your/conf.xml</tilingScheme> <!-- ArcGIS 的 conf.xml 路径 -->
    <tileCachePath>/path/to/your/tiles</tileCachePath> <!-- 瓦片存储目录 -->
    <hexZoom>false</hexZoom>
    </arcgisLayer>
    </layers>

    参数说明

    • name:在 GeoServer 中显示的图层名称
    • tilingScheme:ArcGIS 生成的 conf.xml 文件路径
    • tileCachePath:瓦片存储目录(与 ArcGIS 生成的瓦片目录一致)

步骤 3:发布瓦片

  1. 重启 GeoServer(使插件和配置生效)

  2. 验证瓦片服务

    • 访问 http://your-geoserver/geoserver/gwc/service/wmts?REQUEST=GetCapabilities
    • 检查响应中是否包含你的 ArcGIS 瓦片图层
  3. 预览瓦片

    • 进入 GeoServer 管理界面:http://your-geoserver/geoserver/web/
    • 导航到 Tile Layers > 选择你的图层 > Preview
    • 选择合适的坐标系和格式进行预览

4. 性能优化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- geoserver-data/gwc/geowebcache.xml 优化配置 -->
<gwcConfiguration xmlns="http://geowebcache.org/schema/1.12.0">
<layers>
<!-- 其他 wmsLayer 可共存 -->

<arcgisLayer>
<name>naturalearth</name> <!-- 图层名称(WMS/WMTS 中使用) -->
<tilingScheme>/opt/cache/naturalearth/Layers/conf.xml</tilingScheme> <!-- conf.xml 绝对路径 -->
<!-- 可选:指定切片目录(默认为 conf.xml 同级 _allLayers) -->
<tileCachePath>/opt/cache/naturalearth/_allLayers</tileCachePath>
<!-- 可选:若 ArcGIS 使用十六进制层级名(如 L0A),设为 true -->
<hexZoom>false</hexZoom>
</arcgisLayer>

</layers>
</gwcConfiguration>

📌 关键配置说明

配置项 说明 示例
tilingScheme ArcGIS 的 conf.xml 文件路径 /opt/geoserver/gwc/arcgis-cache/conf.xml
tileCachePath 瓦片存储目录 /opt/geoserver/gwc/arcgis-cache/_alllayers
name GeoServer 中显示的图层名称 arcgis-cache
hexZoom 是否使用十六进制缩放级别 false

💡 验证瓦片服务

瓦片服务 URL 格式:

1
2
3
4
5
6
7
8
9
10
11
http://localhost:8080/geoserver/gwc/service/wmts?
REQUEST=GetTile&
SERVICE=WMTS&
VERSION=1.0.0&
LAYER=workspace:your_layer_name&
STYLE=&
TILEMATRIXSET=EPSG:3857&
TILEMATRIX={z}&
TILEROW={y}&
TILECOL={x}&
FORMAT=image/png

⚠️ 常见问题解决

  1. 瓦片路径不匹配

    • 检查 tilingSchemetileCachePath 路径是否与实际瓦片目录一致
    • 确保路径使用正斜杠 /(Windows 系统中可使用正斜杠)
  2. 插件未加载

    • 检查 WEB-INF/lib 中是否包含插件 JAR 文件
    • 重启 GeoServer
  3. 瓦片显示异常

    • 检查瓦片坐标系是否与 GeoServer 一致
    • 确认瓦片范围与坐标系匹配

四、矢量数据发布教程

在 GeoServer 中基于 PostgreSQL/PostGIS 数据库发布 WMS(Web Map Service)矢量瓦片(Vector Tiles,如 MVT/PBF 格式) 是现代 Web GIS 应用的核心能力。以下是清晰、完整的配置步骤总结:

前提条件

  1. PostgreSQL + PostGIS 已安装并启用
    • 确保目标表已添加空间索引(CREATE INDEX ON table USING GIST(geom);
    • 表中包含 geometrygeography 类型字段
  2. GeoServer 已安装(建议 2.20+)
  3. PostGIS 插件已启用(通常默认包含)

📌 1. 步骤一:在 GeoServer 中连接 PostgreSQL 数据库

  • 进入 Data > Stores > Add new Store

  • 选择 **PostGIS (JNDI not required)**(或直接选 “PostGIS”)

  • 配置参数:

    1
    2
    3
    4
    5
    6
    7
    8
    Workspace:          your_workspace (e.g., "cite")
    Data Source Name: postgis_store
    Host: your-db-host (e.g., localhost)
    Port: 5432
    Database: your_db_name
    Schema: public (or your schema)
    User: db_user
    Password: db_password
  • ✅ 勾选 Expose primary keys(对矢量瓦片性能有帮助)

  • 点击 Save

💡 若使用 Docker 部署 GeoServer,确保容器能访问 PostgreSQL(网络互通)。


📌 2. 步骤二:发布矢量图层(WMS 基础)

  • 在 Store 创建后,点击 Publish 发布新图层
  • 设置:
    • Declared SRS: 与数据一致(如 EPSG:4326EPSG:3857
    • Bounding Boxes: 点击 “Compute from data”
  • 配置样式(Style):
    • 可使用默认 polygon, line, point 样式
    • 或自定义 SLD/CSS 样式

✅ 此时 WMS 服务已可用:

1
2
3
4
5
6
7
8
9
10
http://localhost:8080/geoserver/wms?
service=WMS&
version=1.1.0&
request=GetMap&
layers=workspace:layer_name&
styles=&
bbox=minx,miny,maxx,maxy&
width=800&height=600&
srs=EPSG:4326&
format=image/png

📌 3.步骤三:启用矢量瓦片(MVT / PBF)支持

GeoServer 从 2.11+ 开始原生支持 Mapbox Vector Tiles (MVT) 格式。

3.1 确认 MVT 输出格式已启用

  • 进入 Settings > Global Settings
  • 检查 Vector Tile Formats 是否包含 application/vnd.mapbox-vector-tile(通常默认启用)

若未显示,需确认 gt-mbtilesgt-vectortiles 插件已安装(现代版本通常内置)。

3.2 配置图层的矢量瓦片输出

  • 进入图层编辑页:Layers > your_layer > Tile Caching
  • Tile Image Formats 中勾选:
    • application/vnd.mapbox-vector-tile
  • (可选)在 Vector Tile 选项卡中:
    • 设置 Clipping(是否裁剪到瓦片边界)
    • 设置 Simplification(简化几何以提升性能)

3.3 预生成或动态请求矢量瓦片

方式 A:动态请求(推荐用于交互式地图)

客户端直接请求 MVT 瓦片 URL:

1
http://localhost:8080/geoserver/gwc/service/tms/1.0.0/workspace:layer_name@EPSG:3857@pbf/{z}/{x}/{-y}.pbf

注意:TMS 使用 -y(翻转 Y 轴),而 XYZ 用 y。Leaflet/OpenLayers 通常用 TMS 模式。

或通过 WMS 兼容接口(GeoServer 特有):

1
2
3
4
5
6
7
8
9
10
http://localhost:8080/geoserver/workspace/wms?
service=WMS&
version=1.3.0&
request=GetMap&
layers=layer_name&
format=application/vnd.mapbox-vector-tile&
tiled=true&
tileOrigin=lon,lat&
width=256&height=256&
bbox={bbox}

方式 B:预切片缓存(高并发场景)

  • 进入 Tile Caching > Seed/Truncate
  • 选择:
    • Format: application/vnd.mapbox-vector-tile
    • Grid Set: EPSG:3857(Web Mercator)
    • Zoom levels: 如 0–14
  • 点击 Submit 后台生成 .pbf 缓存

缓存路径:GEOSERVER_DATA_DIR/gwc/workspace_layer_name_EPSG_3857/application.x-protobuf.type=mapbox-vector/...


🧪 客户端调用示例(OpenLayers)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// WMS 图层(栅格)
const wmsLayer = new ol.layer.Tile({
source: new ol.source.TileWMS({
url: 'http://localhost:8080/geoserver/wms',
params: { LAYERS: 'workspace:layer_name' }
})
});

// 矢量瓦片图层(MVT)
const mvtLayer = new ol.layer.VectorTile({
source: new ol.source.VectorTile({
format: new ol.format.MVT(),
url: 'http://localhost:8080/geoserver/gwc/service/tms/1.0.0/' +
'workspace:layer_name@EPSG:900913@pbf/{z}/{x}/{-y}.pbf'
})
});

🔧 性能优化建议

优化项 说明
空间索引 确保 PostGIS 表有 GIST 索引
主键暴露 Store 中勾选 Expose primary keys
简化几何 在 Vector Tile 设置中启用简化
限制属性 在图层“Fields”选项卡中只发布必要字段
缓存策略 高频访问区域预瓦片(Seed)
内存调优 增加 GeoServer JVM 内存(如 -Xmx4g

验证清单

  • PostgreSQL 表含有效 geometry 字段
  • GeoServer 成功连接 PostGIS Store
  • WMS 图层可预览(PNG/JPEG)
  • 图层启用了 application/vnd.mapbox-vector-tile 格式
  • 能通过 TMS/WMS 接口获取 .pbf 瓦片
  • 客户端(如 OpenLayers、MapLibre)成功加载矢量瓦片

一、现象描述与原因解析

问题现象

在 Windows 11 笔记本上,开启移动热点(设置 → 网络和 Internet → 移动热点 → 编辑 → 网络频带),如果选择 5GHz 频段,系统提示 “所选网络波段不可用”,但是无线显卡本身是支持5GHz频段的。
设置频段
错误提示

原因分析

Windows 11 的移动热点功能(基于 WLAN Hosted Network 或 Wi-Fi Direct Virtual Adapter)会动态检测无线网卡的射频环境。当未连接任何 Wi-Fi(如仅通过有线网络上网)时,系统无法确认当前环境是否允许使用 5 GHz 频段。受中国无线电法规限制(国家码 CN),系统默认屏蔽 DFS 信道(52–144),导致其尝试启用受限信道时触发”所选网络波段不可用”错误。关键机制:系统仅在检测到设备已成功连接 5 GHz 合规信道(如 UNII-3 的 149/153/157/161/165)后,才允许启用 5 GHz 热点。因此,必须先连接 5 GHz Wi-Fi(保持连接),系统方能”学习”到环境合规性,后续即可开启 5 GHz 热点并断开原 Wi-Fi。

UNII频段 频率范围 信道范围 中心频率 中国法规限制 是否可用
UNII-1 5.15~5.25 GHz 36, 40, 44, 48 5180, 5200, 5220, 5240 MHz 仅限室内使用 ✅ 可用(但仅限室内)
UNII-2A 5.25~5.35 GHz 52, 56, 60, 64 5260, 5280, 5300, 5320 MHz 仅限室内使用 ✅ 可用(但仅限室内)
UNII-2C 5.47~5.725 GHz 100-144(以4为步长) 5500-5720 MHz 完全不可用(中国缺失) ❌ 不可用
UNII-3 5.725~5.825 GHz 149, 153, 157, 161, 165 5745, 5765, 5785, 5805, 5825 MHz 所有场景可用 ✅ 可用(推荐使用)

二、系统服务检查与显卡配置

检查系统服务

  1. 按 Win + R 输入 services.msc
  2. 确保 WLAN AutoConfig 和 Internet Connection Sharing (ICS) 服务正在运行

无线网卡设置

笔记本设置(设备管理器 > 网络适配器 > Intel Wi-Fi AX211 > 属性 > 高级)
无线网卡高级属性

以下是结合场景需求的必要设置项

1. 首选频带

  • 适用场景:希望无线网卡优先连接5GHz或6GHz频段(避开2.4GHz频段的设备拥挤、干扰问题)。
  • 说明:默认可能无频带优先级(或优先2.4GHz),手动设置“首选5GHz/6GHz”后,网卡会优先搜索并连接该频段信号。

2. 超高频段(6GHz)

  • 适用场景:当无线路由器支持 Wi - Fi 6E(即支持6GHz频段) 时,需开启此选项。
  • 说明:6GHz频段可提供更高网速、更低延迟,但需路由器硬件及固件支持6GHz,否则默认关闭(因6GHz需生态支持,普通家庭路由器可能不开放该频段)。

3. 唤醒幻数据包

  • 适用场景:需通过局域网唤醒(Wake - on - LAN)远程控制处于待机/关机状态的电脑(如远程访问家庭电脑)。
  • 说明:默认可能关闭,开启后允许特定网络数据包唤醒设备(需配合路由器设置“转发唤醒包”功能)。

4. 漫游主动性

  • 适用场景
    • 若移动中(如在房间走动)发现“信号弱但网卡不主动切换热点,导致卡顿/网速慢”,可调高数值(如3 - 4,数值越高切换越积极);
    • 若“频繁无故切换热点导致短暂断线”,可调低数值(如1 - 2,降低切换积极性)。
  • 说明:默认为“中等”(数值2 - 3),若无网络体验问题无需调整。

5. 信道宽度(2.4GHz频段)

  • 适用场景:2.4GHz频段干扰严重(如老旧小区、多路由器密集区域)。
  • 说明:默认“自动”可能选择40MHz,但干扰多时易断连;手动固定为20MHz可提升稳定性(5GHz/6GHz频段默认“自动”一般无需改,除非有特殊速度/稳定需求)。

其他说明

“无线模式、MIMO、节能卸载(ARP/GTK/NS)、传输电源、数据包合并、吞吐量助推器、与40MHz信道不兼容、U - APSD支持”等选项,默认设置已适配多数场景,无需手动干预,驱动会自动协商最优参数。
当移动

总结:仅当遇到6GHz路由器适配、远程唤醒、频段优先级、漫游切换异常、2.4GHz干扰严重等问题时,需针对性调整上述5类设置;其他选项保持默认即可获得最佳兼容性与性能。


三、开启 5GHz 移动热点

🔧 步骤 1:配置路由器为合规 5GHz 信道(必须!)

  1. 打开浏览器,输入路由器管理地址(如 192.168.1.1)。
  2. 登录后,进入 无线设置 > 5GHz 频段
  3. 将信道手动设置为
    149(推荐,干扰最少)或 153/157/161/165
    避免:自动选择、52–144 信道(DFS 信道)。
  4. 保存设置并重启路由器。

💡 为什么必须?这是让 Windows 识别合规环境的关键!
示例:TP-Link 路由器设置路径:无线设置 > 5GHz > 信道:149


📱 步骤 2:连接合规 5GHz Wi-Fi(保持连接)

  1. 在 Windows 11 任务栏右下角点击 网络图标
  2. 选择您的 5GHz Wi-Fi 网络(名称中含“5G”或“5GHz”)。
  3. 输入密码连接。
  4. 保持连接状态,不要断开!(系统需此过程学习合规环境)

✅ 此步骤是“解锁”5GHz 热点的关键!
检查:手机连接该 Wi-Fi 后,在 Wi-Fi 设置中查看“频段”是否显示“5GHz”


📡 步骤 3:开启 5GHz 移动热点

  1. 打开 设置 > 网络和 Internet > 移动热点
  2. 点击 “编辑”(位于“网络频带”下方)。
  3. 在下拉菜单中选择 “5 GHz” → 点击 “保存”
  4. 打开 移动热点开关

✅ 系统此时已识别为合规环境,5GHz 选项不再灰显


📱 步骤 4:断开第一步的 Wi-Fi 连接

  1. 在任务栏网络图标中,点击 当前连接的 5GHz Wi-Fi
  2. 选择 “断开”
  3. 移动热点将保持开启状态,无需重新设置!

✅ 验证:用手机连接热点,进入手机 Wi-Fi 设置 → 查看“频段”是否显示 5GHz


三、总结

步骤 作用
1. 路由器设为信道 149 创建合规 5GHz 环境(中国允许的信道)
2. 连接该 Wi-Fi Windows 学习到环境合规 → 临时解锁 5GHz 热点
3. 开启 5GHz 热点 系统基于学习到的环境,允许使用 5GHz
4. 断开 Wi-Fi 系统保留“合规环境”状态 → 热点持续使用 5GHz(无需重连)

最终效果
Windows 11 笔记本只要不关机即可使用 5GHz 移动热点,重新开机后需要重新执行WLAN连上5GHz热点→开启5GHz移动热点→断开WLAN5GHz热点的过程。

本文实现了一套安全、模块化、生产端的 Nginx 反向代理方案,核心功能包括:

  1. 统一代理支持:通过 Nginx 同时提供 HTTP 和 TCP 反向代理;
  2. 真实客户端信息透传:使用标准代理头(如 X-Real-IP、X-Forwarded-For)确保后端服务获取原始请求信息;
  3. 跨域控制(CORS):允许所有域名跨域请求,但仅限 IP 白名单中的客户端;
  4. 独立 IP 白名单:通过单独的 geo 配置文件实现访问控制,默认拒绝所有非白名单 IP,支持动态更新无需重启;
  5. 全局限制策略:统一设置最大上传文件大小(10MB)和响应空闲超时(60秒);
  6. 按需缓存与维护模式:仅对 /api/ 接口启用缓存,并支持通过文件开关快速切换维护页面。

整套方案采用配置分离、职责清晰、Docker 友好的设计,兼顾安全性、可维护性与高性能,适用于企业级生产环境。

📁 整体目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/etc/nginx/
├── nginx.conf # 全局配置文件
├── conf.d/
│ ├── http.conf # HTTP代理配置
│ ├── db.stream # 数据库代理配置
│ └── maintenance.conf # 维护界面独立配置
├── security/
│ ├── blacklist.conf
│ ├── whitelist.conf
│ ├── rate-limiting.conf
│ ├── security_rules.conf
│ ├── security_checks.conf
│ ├── blacklist.ip
│ └── whitelist.ip
├── proxy_params # 通用代理头配置
├── cache_params # 缓存配置
└── cors_params # 跨域控制独立配置

1. 统一配置

1.1 TCP和HTTP配置(/etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 全局配置:TCP 代理和全局参数
stream {
# TCP 代理配置(独立于 HTTP)
include /etc/nginx/conf.d/*.stream;
}

http {
# === 全局控制(所有 HTTP 代理生效) ===
include /etc/nginx/mime.types;
default_type application/octet-stream;

# 性能优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain application/json text/css application/javascript;
keepalive_timeout 65;
keepalive_requests 1000;
types_hash_max_size 2048;
server_tokens off;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;

# 超时控制
proxy_connect_timeout 30s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;

# 缓冲区优化
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
proxy_temp_file_write_size 8k;

# 上传文件控制
client_max_body_size 500M;
client_body_buffer_size 1m;
client_body_temp_path /tmp/nginx_body;
client_body_timeout 300s;
proxy_request_buffering on;

set $block_access 0;
set $block_reason "";

# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';

log_format security 'time=$time_iso8601 client=$realip_remote_addr '
'xff="$http_x_forwarded_for" method=$request_method '
'uri="$request_uri" status=$status '
'user_agent="$http_user_agent" '
'blocked=$block_access block_reason=$block_reason '
'rate_limit=$rate_limit_zone cache_status=$upstream_cache_status';

log_format json_combined escape=json
'{"time":"$time_iso8601",'
'"remote_addr":"$realip_remote_addr",'
'"x_forwarded_for":"$http_x_forwarded_for",'
'"method":"$request_method",'
'"uri":"$request_uri",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"is_whitelisted":$whitelist_ip,'
'"is_blacklisted":$blacklist_ip}';

# 访问日志
access_log /var/log/nginx/access.log main buffer=32k flush=5s;
access_log /var/log/nginx/security.log security;
access_log /var/log/nginx/audit/audit-$(date +%Y-%m-%d).log json_combined;
error_log /var/log/nginx/error.log warn;

# 真实IP处理(去掉SLB、CDN等内网IP)
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

# 通用代理头(复用)
include proxy_params;

# === 接口缓存配置(全局定义,独立文件生效) ===
# 缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:10m
max_size=1g inactive=60m use_temp_path=off;
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:100m
max_size=10g inactive=365d use_temp_path=off;

# 限制并发连接数
limit_conn_zone $binary_remote_addr zone=per_ip:10m;
limit_conn_zone $server_name zone=per_server:10m;

# 包含安全配置
include /etc/nginx/security/*.conf;

# 包含所有独立配置
include /etc/nginx/conf.d/*.conf;
}

💡 关键配置

  • TCP 代理独立在 stream 块(不能与 HTTP 混合)
  • 全局上传大小/超时设置在 http 块(避免重复配置)
  • 缓存路径全局定义,独立配置文件只指定作用域
  • 缓存路径 /var/cache/nginx 需在 Docker 容器中挂载(-v /host/cache:/var/cache/nginx

1.2 传递客户端的真实信息配置(/etc/nginx/proxy_params

1
2
3
4
5
6
7
8
9
# /etc/nginx/proxy_params
proxy_http_version 1.1;
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-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Server $hostname;

1.3 HTTP接口缓存配置(/etc/nginx/cache_params

1
2
3
4
5
6
7
# /etc/nginx/cache_params
proxy_cache api_cache;
proxy_cache_valid 200 302 1d; # 200/302 缓存 1 天
proxy_cache_valid 404 1m; # 404 缓存 1 分钟
proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on;
proxy_cache_lock on;

💡 缓存机制

  • 200/302 响应缓存 1 天(86400 秒)
  • 404 响应缓存 1 分钟
  • 缓存过期后,若后端返回 200 则更新缓存

1.4 CORS跨域控制配置/etc/nginx/cors_params

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# /etc/nginx/cors_params
# 允许所有域名(CORS 配置)
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-SinceCache-Control,Content-Type,Authorization' always;

# 处理预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-WithIf-Modified-Since,Cache-Control,Content-Type,Authorization' always;
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}

💡 关键配置

  • always 参数确保响应头始终添加(避免缓存干扰)

2. 独立代理配置文件(/etc/nginx/conf.d/

✅ 2.1 HTTP 代理(http.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 仅处理特定域名的 HTTP 代理
server {
listen 80;
server_name api.example.com;

location / {
# 限流(白名单豁免)
if ($rate_limit_exempt != 1) {
limit_req zone=$rate_limit_zone burst=20 nodelay;
limit_req_status 429;
}
proxy_pass http://backend:8080; # Docker 服务名
include cache_params;
}
}

✅ 2.2 TCP代理(db.conf

1
2
3
4
5
6
7
8
9
10
11
    upstream mysql_backend {
server db:3306; # Docker 服务名
}

server {
listen 3306;
proxy_pass mysql_backend;
proxy_connect_timeout 1s; # TCP 连接超时
proxy_timeout 10s; # TCP 响应超时
}
}

✅ 2.3 维护界面(maintenance.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 仅对根路径生效(维护模式时重定向)
server {
# 维护模式开关
set $maintenance_mode off;

# 通过环境变量控制维护模式
if ($maintenance_mode = on) {
return 503;
}

# 维护页面配置
error_page 503 @maintenance;
location @maintenance {
# 静态维护页面
root /usr/share/nginx/html;
try_files /maintenance.html =503;

# 或者重定向到外部维护页面
# return 307 https://maintenance.example.com;
}

# API特殊处理(返回JSON)
location /api/ {
if ($maintenance_mode = on) {
add_header Content-Type application/json;
return 503 '{"status":503,"message":"系统维护中,请稍后再试"}';
}

proxy_pass http://backend-service:8080;
}
}

3. 安全配置文件(/etc/nginx/security/

✅ 3.1 限流控制(rate-limiting.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# /etc/nginx/security/rate-limiting.conf

# 限流区域定义
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=3r/m;
limit_req_zone $binary_remote_addr zone=search_limit:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=static_limit:10m rate=500r/s;

# 基于请求URI的限流区域映射
map $request_uri $rate_limit_zone {
default global_limit;

# API接口
~*/api/v1/ api_limit;
~*/api/v2/ api_limit;

# 认证接口
~*/auth/login login_limit;
~*/oauth/token login_limit;
~*/user/login login_limit;

# 搜索接口
~*/search search_limit;
~*/query search_limit;
~*/find search_limit;

# 静态资源
~*\.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ static_limit;

# 管理接口
~*/admin/ global_limit;
~*/system/ global_limit;
}

# 白名单不限流
map $whitelist_ip $rate_limit_exempt {
0 0;
1 1;
}

# 连接数限制
limit_conn per_ip 10;
limit_conn per_server 1000;

✅ 3.2 黑白名单控制(blacklist.confwhitelist.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# /etc/nginx/security/blacklist.conf

# 全局黑名单设置
geo $blacklist_ip {
default 0;

# 动态黑名单(从文件读取)
include /etc/nginx/security/blacklist.ip;

# 静态黑名单
10.0.0.0/8 1;
192.168.1.100 1;
172.16.0.0/12 1;
}

# /etc/nginx/security/whitelist.conf
# 全局白名单设置
geo $whitelist_ip {
default 0;

# 动态白名单(从文件读取)
include /etc/nginx/security/whitelist.ip;

# 静态白名单
10.0.0.0/8 1;
192.168.1.100 1;
172.16.0.0/12 1;
}

# API白名单路径
map $request_uri $whitelist_path {
default 0;

# 健康检查
/health 1;
/status 1;
/ping 1;

# 监控
/metrics 1;
/nginx-status 1;

# 静态资源
~*\.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|mp4|webm|mp3)$ 1;

# 公开API
/api/v1/public/ 1;
/api/v1/docs 1;
/swagger-ui 1;

# 机器人协议
/robots.txt 1;
/sitemap.xml 1;
/favicon.ico 1;
}
1
2
3
4
5
6
7
8
9
10
# /etc/nginx/security/blacklist.ip(whitelist.ip)

# 格式:IP/CIDR 标志值;
# 可以通过脚本动态更新

# 恶意IP示例
203.0.113.1 1;
198.51.100.0/24 1;
10.20.30.40 1;

✅ 3.3 综合安全控制(blacklist.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# security/security-rules.conf


# 恶意User-Agent检测
map $http_user_agent $bad_bot {
default 0;

# 已知恶意爬虫
~*(ahrefs|mj12bot|semrushbot|masscan) 1;
~*(sqlmap|nmap|nikto|dirbuster) 1;
~*(nessus|openvas|acunetix|nessus) 1;

# 垃圾机器人
~*(spammer|scraper|harvest|collector) 1;

# 可疑模式
~*[0-9]{10}bot 1;
~*bot[0-9]{10} 1;
"" 1;

# 允许的友好爬虫
~*(baiduspider|googlebot|bingbot|yandexbot|duckduckbot) 0;
~*(slurp|twitterbot|facebookexternalhit|linkedinbot) 0;

# 正常浏览器和工具
~*(Mozilla|Chrome|Safari|Firefox|Edge|Opera) 0;
~*(curl|wget|python-requests|PostmanRuntime) 0;
}

# 恶意请求检测
map $request_uri $bad_request {
default 0;

# 路径遍历
~*(\.\./|\.\.\\|/%2e%2e|/%252e%252e) 1;

# 敏感文件
~*(/etc/passwd|/etc/shadow|/proc/self|/etc/hosts) 1;
~*(\.git/|\.svn/|\.hg/|\.bzr/|\.DS_Store) 1;
~*(\.env|config\.php|settings\.py|web\.config) 1;

# 管理后台
~*(phpmyadmin|adminer|wp-admin|/admin/login|/manager/html) 1;

# SQL注入模式
~*(union\s+select.*from) 1;
~*(sleep\(|benchmark\(|waitfor\s+delay) 1;
~*(load_file\(|into\s+outfile|into\s+dumpfile) 1;
~*(select\s+.*from.*where.*=.*\() 1;

# XSS攻击
~*(<script|javascript:|onload=|onerror=|alert\(|confirm\(|prompt\() 1;

# 命令注入
~*(\|\s*sh|\|\s*bash|\|\s*cmd|\;\s*rm\s+|\;\s*wget\s+) 1;

# 可疑文件
~*\.(asp|aspx|jsp|php|pl|py|sh|cgi|exe|dll|bat|cmd)$ 1;

# 扫描特征
~*(/w00tw00t|test.cgi|xmlrpc.php|/vendor/phpunit) 1;
}

# 错误页面映射
map $block_reason $block_error_page {
default /errors/403.html;
"blacklist_ip" /errors/403.html;
"bad_bot" /errors/444.html;
"bad_request" /errors/403.html;
"rate_limit" /errors/429.html;
"whitelist_only" /errors/403.html;
}

# 访问控制决策
map "$whitelist_ip:$maintenance_mode" $access_allowed {
# 规则优先级:白名单 > 维护模式

# 1. 白名单IP直接允许(即使维护模式)
"~^1:.+" 1;
# 2. 其他情况拒绝
default 0;
}

# 维护模式检测
map $maintenance_mode $is_maintenance {
default 0;
"on" 1;
"yes" 1;
"true" 1;
"1" 1;
}

✅ 3.4 安全检查(security-checks.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# security/security-checks.conf

# 初始化阻塞原因
set $block_reason "";
set $block_access 0;

# 1. 白名单路径检查(直接通过)
if ($whitelist_path = 1) {
set $block_access 0;
return 200; # 继续处理请求,但标记为不阻止
}

# 2. 访问控制决策
if ($access_allowed = 0) {
set $block_access 1;

if ($whitelist_ip = 0) {
set $block_reason "whitelist_only";
}

if ($maintenance_mode = "on" && $whitelist_ip = 0) {
set $block_reason "maintenance_mode";
return 503;
}
}

# 3. 黑名单检查(白名单可以覆盖)
if ($whitelist_ip != 1) {
if ($blacklist_ip = 1) {
set $block_access 1;
set $block_reason "blacklist_ip";
access_log /var/log/nginx/blocked.log security;
return 403;
}
}

# 4. 恶意User-Agent检查
if ($bad_bot = 1) {
set $block_access 1;
set $block_reason "bad_bot";
access_log /var/log/nginx/bad_bots.log combined;
return 444;
}

# 5. 恶意请求检查
if ($bad_request = 1) {
set $block_access 1;
set $block_reason "bad_request";
access_log /var/log/nginx/attack.log combined;
return 403;
}

🐳 Docker 部署关键配置

1. docker-compose.yml 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# docker-compose.yml
version: '3.8'

services:
nginx:
build: .
container_name: nginx-proxy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- NGINX_ENV=production
- BACKEND_SERVICE=backend:8080
- MAINTENANCE_MODE=${MAINTENANCE_MODE:-off}
- API_KEY_WHITELIST=${API_KEY_WHITELIST:-}
- INTERNAL_NETWORK=172.16.0.0/12
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf.d:/etc/nginx/conf.d:ro
- ./security:/etc/nginx/security:ro
- ./templates:/etc/nginx/templates:ro
- ./ssl:/etc/nginx/ssl:ro
- ./html:/usr/share/nginx/html:ro
- ./logs:/var/log/nginx
- ./scripts:/scripts:ro
- dynamic_data:/etc/nginx/dynamic
networks:
- proxy-network
healthcheck:
test: ["CMD", "/scripts/health-check.sh"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"

backend:
image: ${BACKEND_IMAGE:-your-backend:latest}
container_name: backend-app
restart: unless-stopped
environment:
- VIRTUAL_HOST=app.example.com
- VIRTUAL_PORT=8080
networks:
- proxy-network
expose:
- "8080"

networks:
proxy-network:
driver: bridge
ipam:
config:
- subnet: 172.16.0.0/12

volumes:
dynamic_data:

2. nginx容器Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Dockerfile
FROM nginx:1.24-alpine

# 安装必要工具
RUN apk add --no-cache \
curl \
jq \
certbot \
certbot-nginx \
bash \
gettext \
openssl \
geoip \
geoip-dev \
libmaxminddb \
libmaxminddb-dev \
&& rm -rf /var/cache/apk/*

# 安装nginx模块
RUN apk add --no-cache nginx-mod-http-geoip2

# 创建目录结构
RUN mkdir -p \
/etc/nginx/security \
/etc/nginx/dynamic \
/etc/nginx/templates \
/usr/share/nginx/html/errors \
/scripts \
/var/log/nginx/audit

# 复制配置文件
COPY nginx.conf /etc/nginx/
COPY conf.d/ /etc/nginx/conf.d/
COPY security/ /etc/nginx/security/
COPY templates/ /etc/nginx/templates/
COPY ssl/ /etc/nginx/ssl/
COPY html/ /usr/share/nginx/html/
COPY scripts/ /scripts/

# 设置权限
RUN chmod +x /scripts/*.sh \
&& chown -R nginx:nginx /var/log/nginx \
&& chmod 600 /etc/nginx/security/.htpasswd \
&& chmod 644 /etc/nginx/security/*.map \
&& chmod 755 /etc/nginx/dynamic

# 生成SSL证书(如果不存在)
RUN if [ ! -f /etc/nginx/ssl/cert.pem ]; then \
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/key.pem \
-out /etc/nginx/ssl/cert.pem \
-subj "/C=CN/ST=State/L=City/O=Organization/CN=localhost"; \
fi

# 生成强DH参数
RUN if [ ! -f /etc/nginx/ssl/dhparam.pem ]; then \
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048; \
fi

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD /scripts/health-check.sh

# 启动脚本
ENTRYPOINT ["/scripts/entrypoint.sh"]

🛠️ 生产环境验证建议

  1. 测试跨域

    1
    curl -H "Origin: https://frontend.example.com" -X OPTIONS http://api.example.com/api/test

    应返回 204 No Content 且包含 CORS 头

  2. 测试维护模式

    1
    2
    3
    4
    5
    6
    # 启用维护
    export MAINTENANCE_MODE=on


    # 访问应返回 503
    curl -I http://example.com
  3. 测试缓存

    1
    2
    3
    4
    5
    # 第一次请求(应返回 200)
    curl -I http://api.example.com/api/data

    # 第二次请求(应返回 200 from cache)
    curl -I http://api.example.com/api/data

✅ 总结

功能 位置 作用范围 Docker 适配关键点
TCP 代理 nginx.conf (stream) 全局 独立于 HTTP,端口映射 3306:3306
上传大小/超时 nginx.conf (http) 全局 全局生效,避免重复配置
HTTP 代理 http_proxy.conf 按域名生效 通过 Docker 网络解析服务名
跨域控制 cors.conf /api/ always 参数确保头始终添加
接口缓存 cache.conf /api/ 缓存路径挂载到主机,避免容器重启丢失
维护界面 maintenance.conf 仅根路径 通过文件开关,无需重启 Nginx

💡 为什么这样设计?

  1. 全局配置:TCP 和基础参数(上传/超时)放在全局,避免重复且易于全局调整
  2. 独立文件:每个功能模块独立配置,符合“单一职责原则”
  3. Docker 适配
    • 所有挂载路径(/var/cache/nginx, /var/www/maintenance)在主机定义
    • 服务名通过 Docker 网络自动解析(backend:8080
    • 维护模式通过文件开关,无需修改 Nginx 配置

1. 相对于Docker的核心优势

基于 nerdctl(容器CLI工具)和 containerd(行业标准容器运行时)的容器化部署栈,是现代化、云原生优先的架构选择。相较于传统的Docker引擎,其核心优势体现在架构、性能、安全性和生态集成等多个维度。

特性维度 Nerdctl + Containerd Docker Engine 优势分析与影响
架构与定位 模块化、解耦。Containerd作为底层运行时,Nerdctl为兼容Docker CLI的客户端工具。 单体、一体化。Docker Daemon (dockerd) 集成了运行时、构建、网络、存储等多种功能。 更轻量、更专注。Containerd仅负责核心的容器生命周期管理,减少了攻击面和资源开销,符合Unix哲学。
与Kubernetes集成 原生、深度集成。Kubernetes通过Container Runtime Interface (CRI) 直接调用Containerd 间接、桥接。历史上通过dockershim(已弃用),现需额外组件cri-dockerd桥接。 路径更短、更稳定高效。作为K8s默认运行时,移除中间层,减少了故障点,是生产集群的官方推荐方案
资源占用 极低。仅包含核心运行时,无冗余守护进程。 较高。包含完整的Docker Daemon及其附加功能。 显著节省系统资源,尤其适用于大规模集群、边缘计算和资源受限环境。
安全模型 强大的Rootless容器支持。利用RootlessKit和用户命名空间映射,实现非特权用户运行容器,极大提升安全性 Rootless模式相对成熟但集成度与生态稍逊。 有效遏制容器逃逸风险,将安全漏洞的影响范围限制在非特权用户内,是生产环境关键安全实践
核心特性 1. 命名空间隔离:支持多租户(如隔离k8s.io和默认命名空间)。
2. **延迟拉取(Stargz)**:加速大镜像启动。
3. 镜像加密等实验性功能。
生态成熟,桌面体验和开发者工具链(如Docker Compose)完善。 更专注于探索容器技术前沿,与K8s原生特性(如多租户)结合更紧密。
CLI兼容性 Nerdctl命令与 docker 命令高度兼容,支持绝大部分常用命令和标志。 拥有最完整、统一的命令行生态。 学习迁移成本极低,熟悉Docker的用户可以几乎无缝切换。

2. 安装与设置步骤(基于nerdctl-full一体包)

nerdctl-full发行版包含了运行完整容器环境所需的所有组件(containerd, nerdctl, CNI插件, BuildKit, RootlessKit等),是推荐的部署方式。

2.1 系统依赖与环境准备

确保系统已安装基础依赖,这些通常是现代Linux发行版的标配。

1
2
3
4
5
# 基于Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y libseccomp2 socat iproute2 iptables
# 基于RHEL/CentOS/Fedora
sudo yum install -y libseccomp socat iproute iptables

2.2 核心安装与初始化

  1. 下载并解压 nerdctl-full
    访问 nerdctl GitHub Releases 获取最新稳定版。

    1
    2
    3
    export NERDCTL_VERSION="1.7.6" # 请替换为最新版本
    wget "https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz"
    sudo tar Cxzvf /usr nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz
  2. 生成配置并启动Containerd服务

    1
    2
    3
    4
    5
    6
    7
    # 生成默认配置文件
    sudo containerd config default > /etc/containerd/config.toml
    # 编辑配置文件(详见第3部分)
    sudo vi /etc/containerd/config.toml
    # 启动并设置开机自启
    sudo systemctl daemon-reload
    sudo systemctl enable --now containerd
  3. 验证基础安装

    1
    2
    3
    sudo containerd --version
    nerdctl version
    sudo nerdctl run --rm hello-world # 运行测试容器

2.3 服务管理

  • Containerd服务

    1
    2
    3
    sudo systemctl status containerd
    sudo systemctl restart containerd
    sudo journalctl -u containerd -f # 查看日志
  • BuildKit服务(用于镜像构建):
    nerdctl-full包含BuildKit,建议启用其服务以支持nerdctl build

    1
    sudo systemctl enable --now buildkit

2.4 设置Rootless无根模式(关键安全实践)

允许非root用户安全地运行容器,是生产环境的重要安全加固步骤。

  1. 安装用户态依赖

    1
    2
    3
    4
    # Ubuntu/Debian
    sudo apt-get install -y uidmap slirp4netns fuse-overlayfs
    # RHEL/Fedora/CentOS
    sudo yum install -y shadow-utils slirp4netns fuse-overlayfs
  2. 执行Rootless安装脚本
    nerdctl-full包内提供了便捷的设置工具。

    1
    containerd-rootless-setuptool.sh install

    该脚本会自动配置用户命名空间、cgroup委托等。安装后,注销并重新登录使用户组变更生效。

  3. 验证与使用Rootless模式

    1
    2
    3
    4
    # 以普通用户身份操作
    id # 确认用户
    nerdctl run -d -p 8080:80 --name my-nginx nginx:alpine
    nerdctl ps

    重要:Rootless模式下,容器网络、端口映射(通常只支持>1024的端口)、存储驱动(如fuse-overlayfs)与特权模式有所不同,需适应。

3. Containerd常用配置 (/etc/containerd/config.toml)

config.toml是Containerd的核心配置文件。以下为关键配置项,修改后需执行 sudo systemctl restart containerd

配置分类 配置项路径 (TOML) 推荐值/示例 作用说明
镜像仓库代理/加速 plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io" endpoint = ["https://<your-mirror>"] 配置国内镜像加速器(如阿里云、中科大源),解决拉取慢问题。
日志配置 plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options SystemdCgroup = true 可配置容器日志的格式、大小和保留策略。
数据存储目录 root /var/lib/containerd Containerd工作根目录。可更改为更大容量的磁盘路径。
私有仓库认证 plugins."io.containerd.grpc.v1.cri".registry.configs."myreg.com".auth username="<user>", password="<pass>" 配置访问私有镜像仓库的认证信息。支持credsStore使用本地凭证助手。
Sandbox 镜像 plugins."io.containerd.grpc.v1.cri".sandbox_image registry.aliyuncs.com/google_containers/pause:3.9 替换K8s Pod基础镜像,通常用于解决gcr.io访问问题。
Cgroup 驱动 plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.SystemdCgroup true 必须与Kubelet的cgroup驱动一致。对于使用systemd作为init系统的发行版,设为true
运行时数据目录 state /run/containerd 运行时状态目录。
默认运行时 plugins."io.containerd.grpc.v1.cri".containerd.default_runtime name = "runc" 设置默认的底层OCI运行时(如runc, kata, gVisor)。

配置片段示例(镜像加速与cgroup驱动)

1
2
3
4
5
version = 2
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io", "https://mirror.ccs.tencentyun.com"]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true

4. 容器管理与编排常用命令

4.1 基本容器管理(类比Docker)

nerdctl命令与docker高度相似,以下为常用操作:

功能 Nerdctl命令示例 说明
拉取镜像 nerdctl pull nginx:alpine 从仓库拉取镜像。
运行容器 nerdctl run -d --name web -p 80:80 nginx:alpine 后台运行容器并映射端口。
列出容器 nerdctl ps -a 查看所有容器(含停止的)。
执行命令 nerdctl exec -it web sh 进入运行中的容器。
查看日志 nerdctl logs -f web 跟踪容器日志。
停止/删除 nerdctl stop web && nerdctl rm web 停止并删除容器。
构建镜像 nerdctl build -t myapp:latest . 使用当前目录Dockerfile构建镜像(需BuildKit服务)。
镜像管理 nerdctl images, nerdctl rmi <image> 列出、删除镜像。

4.2 关键概念:命名空间管理

这是与Docker管理上最重要的区别。Containerd使用命名空间隔离容器、镜像等资源。Kubernetes创建的Pod默认都在k8s.io命名空间

  • 为Kubernetes准备镜像

    1
    2
    nerdctl -n k8s.io pull nginx:alpine  # 拉取镜像到k8s.io命名空间
    nerdctl -n k8s.io images # 查看供K8s使用的镜像
  • 调试Kubernetes Pod

    1
    2
    nerdctl -n k8s.io ps -a | grep <pod-name>  # 查找对应容器
    nerdctl -n k8s.io logs <container-id> # 查看容器日志
  • 管理独立容器(非K8s管理):默认在default命名空间,可省略-n default

4.3 容器编排:Nerdctl Compose

nerdctl支持docker-compose.yml格式的编排文件,用于本地多容器应用管理。

1
2
3
4
5
6
7
8
# 启动一个Compose项目(需在docker-compose.yml所在目录)
nerdctl compose up -d
# 查看状态
nerdctl compose ps
# 停止并清理
nerdctl compose down
# 查看日志
nerdctl compose logs -f

4.4 网络与数据卷管理

  • 网络nerdctl默认使用CNI插件管理容器网络。

    1
    2
    nerdctl network ls                 # 列出网络
    nerdctl network create my-net # 创建自定义网络
  • 数据卷

    1
    2
    nerdctl volume create my-vol       # 创建数据卷
    nerdctl volume ls # 列出数据卷

总结与建议

  1. 场景选择:若你的工作流深度依赖Kubernetes,或追求极致的轻量化和安全性nerdctl+containerd是理想选择。若开发环境需要一体化的桌面体验和图形界面,Docker Desktop仍有其价值。
  2. 运维核心
    • 牢记命名空间:区分管理k8s.io和默认命名空间的资源。
    • 拥抱Rootless:生产环境应优先采用Rootless模式运行非特权容器。
    • **善用config.toml**:正确配置镜像加速、cgroup驱动和私有仓库是稳定运行的基础。
  3. 迁移路径:从Docker迁移时,建议先在测试环境熟悉nerdctl命令和命名空间概念,并严格按照kubelet配置变更流程操作。

该技术栈代表容器运行时的发展方向,随着Kubernetes的统治地位日益巩固,containerd作为其默认运行时,与配套工具nerdctl的协同将变得更加普遍和重要。

前端

  1. 了解Vue.js
  2. 了解vue-element-admin
  3. 掌握ES2015基本用法及新属性
  4. 了解Mapbox地图库
  5. 了解WebPack及常用

后端

  1. 了解CentOS、Nginx、Postgres基本运维操作。
  2. 掌握Docker、Docker-compose工具基本使用方法。
  3. 掌握Springboot、Mybatis、logback、AOP、消息队列、异步、定时任务等内容。
  4. 掌握 Maven、Http Client等工具使用。
  5. 掌握 IntelliJ Idea操作及常用快捷键。

工具

  1. 掌握 IntelliJ Idea操作及常用快捷键。
  2. 掌握 VS Code操作及常用快捷键。
  3. 掌握git分支管理、代码合并、冲突解决等内容。

网络安全

禁止登录或设置弱口令账户(包括第三方网站),禁止传送包含绝密、机密、秘密等字样的标密文档(包括第三方文档),禁止政务网电脑同时接互联网,禁止使用向日葵、TeamViewer等远程工具,禁止使用翻墙工具,禁止使用内网穿透工具,禁止访问不明来源网站。

弱口令规则:
1.小于8位
2.不足三类,大小字母,数字,符号
3.包含用户名
4.包含4个及以上的连续字符,数字
5.包含3个及以上相同的字符、数字
6.包含4个键盘上连续的字符
7.属于常用密码

注意事项:

系统运维安全注意事项
网络终端安全注意事项

单目录智能压缩解压

1
wget -qO- https://haies.cn/assets/tar_single.sh

使用说明

该脚本是一个功能完整的大容量单目录分卷压缩、解压工具,具有以下特点:

  1. 支持三种压缩算法:gzip、zstd(推荐)、xz
  2. 支持三种操作模式:创建压缩包、解压、验证完整性
  3. 自动检测压缩格式,无需手动指定算法
  4. 提供分卷校验和验证,确保数据完整性
  5. 彩色日志输出,包含时间戳,便于跟踪和审计

基本用法

命令格式

1
./tar_single.sh -[操作方式][压缩算法] [操作对象]

参数说明

  • 操作方式
    • c:创建压缩包
    • x:解压压缩包(自动检测格式)
    • t:测试压缩包完整性(自动检测格式)
  • 压缩算法(仅创建时需要):
    • z:gzip(默认)
    • s:zstd(推荐,速度快)
    • o:xz(压缩比高)

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
# 创建压缩包(使用不同算法)
./tar_single.sh -cz /path/to/data # gzip压缩
./tar_single.sh -cs /path/to/data # zstd压缩(推荐)
./tar_single.sh -co /path/to/data # xz压缩

# 解压操作(自动检测格式)
./tar_single.sh -x /path/to/archive_dir # 解压目录中的压缩包
./tar_single.sh -x /path/to/archive.tar.zst.part00 # 解压分卷压缩包

# 测试完整性(自动检测格式)
./tar_single.sh -t /path/to/archive_dir # 测试目录中的压缩包
./tar_single.sh -t /path/to/archive.tar.gz.part00 # 测试分卷压缩包

关键特性

  • 解压和测试时自动识别压缩格式,无需指定算法参数
  • 提供详细的带时间戳的日志输出,便于问题排查
  • 默认使用并行压缩工具,处理大文件时效率更高

存档批量压缩

1
wget -qO- https://haies.cn/assets/tar_batch.sh

使用说明

智能压缩指定目录内文件数量较多的文件夹,自动根据目录深度和文件数量应用不同压缩规则,并排除文档、图片、视频、音频等特定文件类型,这个脚本特别适合处理日志目录、临时文件目录、上传目录等包含大量小文件的场景,能有效减少inode使用量,提升文件系统性能。

基本用法

1
./tar_batch.sh [目标目录]
  • 不指定目录时,默认处理脚本所在目录
  • 处理深度3-5的目录,按从浅到深顺序

使用示例

  1. 压缩当前目录 :./tar_batch.sh
  2. 压缩指定目录:./tar_batch.sh /path/to/your/data

压缩规则

  1. 深度 < 4:不含排除文件类型,文件数50-100 → 压缩
  2. 深度 = 4:不含排除文件类型,文件数 > 50 → 压缩
  3. 深度 > 4:无条件压缩
  4. 搜索深度:仅处理深度3-5的目录

排除的文件类型

  • 文档:.txt .pdf .doc .docx .xls .xlsx .ppt .pptx .odt .md .rtf
  • 图片:.jpg .jpeg .png .gif .bmp .tiff .svg .webp
  • 视频:.mp4 .avi .mov .mkv .flv .wmv .m4v .webm
  • 音频:.mp3 .wav .flac .aac .ogg .m4a .wma

执行后,符合条件的目录会被压缩,并在同级位置生成:

  • 单卷包:目录名.tar.gz
  • 多卷包:目录名_archive/ 文件夹(内含分卷文件)

脚本执行期间,终端会单行显示当前正在压缩的文件名。
脚本会在目标目录生成带时间戳的日志文件。

存档批量压缩

1
wget -qO- https://haies.cn/assets/svn_server_tool.sh

使用说明

本脚本主要用于在服务器端直接查看统计SVN代码仓库的信息,无需通过客户端连接。适用于系统管理员、运维人员或开发人员直接访问SVN服务器文件系统,快速获取代码仓库的相关信息。包括以下功能:

  1. 目录内容查看

    • 查看SVN仓库的目录结构
    • 仅显示指定目录的第一层内容(非递归)
    • 区分显示目录和文件
  2. 代码修改历史查询

    • 查看指定文件或目录的所有修改记录
    • 显示每次修改的版本号、作者、时间、提交信息
    • 查看具体的文件变更操作(添加、删除、修改等)
  3. 代码提交统计分析

    • 统计指定文件或目录的提交情况
    • 按作者统计提交次数和百分比
    • 显示最早和最晚提交时间
    • 可视化展示提交分布情况

基本用法

命令格式

1
./svn_server_tool.sh <功能> <仓库路径> [目录/文件路径]

参数说明

  1. 功能参数(第一个参数):

    • ls:列出目录内容
    • log:查看修改历史
    • stat:统计提交信息
  2. 仓库路径(第二个参数):

    • SVN仓库在服务器上的物理路径
    • 示例:/var/svn/repos/myproject
  3. 目标路径(第三个参数):

    • 对于ls功能:可选,指定要查看的SVN仓库内目录
    • 对于logstat功能:必填,指定要分析的目标路径(SVN仓库内的相对路径)

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看仓库根目录
./svn_server_tool.sh ls /var/svn/repos/myproject

# 查看指定目录
./svn_server_tool.sh ls /var/svn/repos/myproject /trunk/src

# 查看文件修改历史
./svn_server_tool.sh log /var/svn/repos/myproject /trunk/src/main.java

# 查看目录修改历史
./svn_server_tool.sh log /var/svn/repos/myproject /trunk/src

# 统计文件提交情况
./svn_server_tool.sh stat /var/svn/repos/myproject /trunk/src/main.java

# 统计目录提交情况
./svn_server_tool.sh stat /var/svn/repos/myproject /trunk/src

PPT备注批量提取

1.打印为PDF文件,并选择打印内容为备注页
alt text

2.打开PDF文件,Ctrl+A,Ctrl+C即可复制出全部的备注内容。

3.制作页面合适的带备注的PDF版本PPT
根据第一步打印出来的PDF文件一般为A4,页面有大量空白,选择备注最多的页面,通过WPS裁切页面功能,设定固定裁切范围,可批量把所有页面的留白去掉。
alt text

WPS安装字体

1️⃣ 鸿蒙4.2

  1. 在 文件管理 中打开 显示隐藏文件 和 显示系统隐藏文件 菜单。
    显示隐藏
  2. 把字体文件(.ttf/.otf)放进手机存储的 内部存储/Fonts 文件夹(没有就新建一个),该规则全局生效,对所有支持的APP都生效。
    全局字体
  3. 针对PC应用,把字体文件放到 内部存储/PCEngine/.fonts 文件夹(没有就新建一个),该规则对PC应用引擎下的APP生效,也就是wps office pc版生效。(小米澎湃OS对应位置**内部存储/HyperEngine/fonts/**)
    PC引擎字体
  4. 重启APP生效。

2️⃣ 鸿蒙5+

鸿蒙5+平板和电脑支持可选择第三方字体安装,手机上仅支持在线字体安装。
平板字体安装

统信桌面操作系统V20专业版1070(UOS V20 1070)于 2024年05月06日正式发布,与Debian buster、Ubuntu 20.04 LTS(Focal Fossa )软件包版本和依赖关系相似,其核心组件版本如下:

组件 版本
Linux 4.19.0
glibc 2.28.31-deepin1
glib 2.58.3.16-deepin1
libgcc 8.3.0.13-deepin1
systemctl 241

安装QGIS

通过官方源安装Debian Buster版本的 QGIS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

sudo apt install gnupg software-properties-common;
sudo mkdir -m755 -p /etc/apt/keyrings;
sudo wget -O /etc/apt/keyrings/qgis-archive-keyring.gpg https://download.qgis.org/downloads/qgis-archive-keyring.gpg;

sudo tee /etc/apt/sources.list.d/qgis.list <<'EOF'
Types: deb deb-src
URIs: https://qgis.org/debian-ltr
Suites: buster
Architectures: amd64
Components: main
Signed-By: /etc/apt/keyrings/qgis-archive-keyring.gpg
EOF;

sudo apt update;
sudo apt install qgis qgis-plugin-grass;
sudo apt install qgis-server;

以上一键安装脚本

1
sh -c "$(wget -qO- https://haies.cn/assets/install-qgis-uos.sh)"

安装KVM

UOS 编译安装KVM

0%