[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74627":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":16,"starSnapshotCount":16,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},74627,"nginxpulse","likaia\u002Fnginxpulse","likaia","轻量级 Nginx 访问日志分析与可视化面板，提供实时统计、PV 过滤、IP 归属地与客户端解析。","https:\u002F\u002Fnginx-pulse.kaisir.cn\u002F",null,"Go",2572,182,8,4,0,7,17,60,21,87.29,"MIT License",false,"main",true,[],"2026-06-12 04:01:15","\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fbrand-mark.svg\" alt=\"NginxPulse Logo\" width=\"120\" height=\"120\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flikaia\u002Fnginxpulse\u002Fblob\u002Fmain\u002FREADME_EN.md\">English\u003C\u002Fa> | 简体中文\n\u003C\u002Fp>\n\n# NginxPulse\n\n轻量级 Nginx 访问日志分析与可视化面板，提供实时统计、PV 过滤、IP 归属地与客户端解析。\n\n源码仓库：https:\u002F\u002Fgithub.com\u002Flikaia\u002Fnginxpulse\n\n## 文档站点（推荐）\n\n> **在线文档站点：\u003Chttps:\u002F\u002Fnginx-pulse-docs.kaisir.cn\u002F>**\n\n\n> ⚠️注意：此文档只讲解了如何使用这个项目，详细文档与示例配置请移步[在线文档站点](https:\u002F\u002Fnginx-pulse-docs.kaisir.cn\u002F)\n\n![demo-img-1.png](https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fdemo-img-1.png)\n\n![demo-img-2.png](https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fdemo-img-2.png)\n## 目录\n- [项目开发技术栈](#项目开发技术栈)\n- [IP 归属地查询策略](#ip-归属地查询策略)\n- [如何使用项目](#如何使用项目)\n  - [1) Docker](#1-docker)\n  - [2) Docker Compose](#2-docker-compose)\n  - [时区设置（重要）](#时区设置重要)\n  - [3) 手动构建（前端、后端）](#3-手动构建前端后端)\n  - [4) 单体部署（单进程）](#4-单体部署单进程)\n  - [5) Makefile 常用命令](#5-makefile-常用命令)\n- [Docker 部署权限说明](#docker-部署权限说明)\n- [常见问题](#常见问题)\n- [目录结构与主要文件](#目录结构与主要文件)\n- [致谢](#致谢)\n\n## 项目开发技术栈\n**重要提示（版本 > 1.5.3）**：已完全弃用 SQLite；单体部署必须自备 PostgreSQL 并配置 `DB_DSN`（或 `database.dsn`）。\n- **后端**：`Go 1.24.x` · `Gin` · `Logrus`\n- **数据**：`PostgreSQL (pgx)`\n- **IP 归属地**：`ip2region`（本地库） + `ip-api.com`（远程批量）\n- **前端**：`Vue 3` · `Vite` · `TypeScript` · `PrimeVue` · `ECharts\u002FChart.js` · `Scss`\n- **容器**：`Docker \u002F Docker Compose` · `Nginx`（前端静态部署）\n\n### IP 归属地查询策略\n1. **快速过滤**：空值\u002F本地\u002F回环地址返回“本地”，内网地址返回“内网\u002F本地网络”。\n2. **解析解耦**：日志解析阶段仅入库并标记“待解析”，IP 归属地由后台任务异步补齐并回填。\n3. **缓存优先**：持久化缓存 + 内存缓存命中直接返回（默认上限 1,000,000 条）。\n4. **本地优先（IPv4\u002FIPv6）**：优先查 ip2region，本地结果可用时直接使用。\n5. **远程补齐**：本地返回“未知”或解析失败时，调用远端 API（默认 `ip-api.com\u002Fbatch`，可配置）批量查询（超时 1.2s，单批最多 100 个）。\n6. **远程失败**：返回“未知”。\n\n> 归属地解析未完成时，页面会显示“待解析”，地域统计可能不完整。\n\n> 本地数据库 `ip2region_v4.xdb` 与 `ip2region_v6.xdb` 内嵌在二进制中，首次启动会自动解压到 `.\u002Fvar\u002Fnginxpulse_data\u002F`，并尝试加载向量索引提升查询性能。\n\n> 本项目会访问外网 IP 归属地 API（默认 `ip-api.com`），部署环境需放行该域名的出站访问。同时也支持自己搭建IP归属地查询服务，详见下文。\n\n## 如何使用项目\n\n### 1) Docker\n单镜像（前端 Nginx + 后端服务）：\n> 镜像内置 PostgreSQL，启动时会自动初始化数据库（未自备数据库时）。**必须挂载数据目录**：`\u002Fapp\u002Fvar\u002Fnginxpulse_data` 与 `\u002Fapp\u002Fvar\u002Fpgdata`。未挂载时容器会直接退出并报错。\n> 如果你准备在**初始化向导**里配置外部数据库，可先不挂载 `pgdata`，容器能正常启动；配置完成后重启容器即可生效。\n\n一键启动（极简配置，首次启动进入初始化向导）：\n\n```bash\ndocker run -d --name nginxpulse \\\n  -p 8088:8088 \\\n  -v .\u002Fdocker_local\u002Flogs:\u002Fshare\u002Flogs:ro \\\n  -v .\u002Fdocker_local\u002Fnginxpulse_data:\u002Fapp\u002Fvar\u002Fnginxpulse_data \\\n  -v .\u002Fdocker_local\u002Fpgdata:\u002Fapp\u002Fvar\u002Fpgdata \\\n  -v .\u002Fdocker_local\u002Fconfigs:\u002Fapp\u002Fconfigs \\\n  -v \u002Fetc\u002Flocaltime:\u002Fetc\u002Flocaltime:ro \\\n  magiccoders\u002Fnginxpulse:latest\n```\n\n> 注意：docker_local请替换为你宿主机存在的目录，确保文件权限设置正确，能被容器正常访问，否则会出现无日志的情况。\n\n\n> 如果更偏好配置文件方式，可将 `configs\u002Fnginxpulse_config.json` 挂载到容器内的 `\u002Fapp\u002Fconfigs\u002Fnginxpulse_config.json`。\n> 若未提供配置文件\u002F环境变量，首次启动会进入“初始化配置向导”。保存后会写入 `configs\u002Fnginxpulse_config.json`，需重启容器生效（建议挂载 `\u002Fapp\u002Fconfigs` 以持久化）。\n\n### 2) Docker Compose\n使用远程镜像（Docker Hub）：\n```yaml\nservices:\n  nginxpulse:\n    image: magiccoders\u002Fnginxpulse:latest\n    container_name: local_nginxpulse\n    ports:\n      - \"8088:8088\"\n      - \"8089:8089\"\n    volumes:\n      - .\u002Fdocker_local\u002Flogs:\u002Fshare\u002Flogs\n      - .\u002Fdocker_local\u002Fnginxpulse_data:\u002Fapp\u002Fvar\u002Fnginxpulse_data\n      - .\u002Fdocker_local\u002Fpgdata:\u002Fapp\u002Fvar\u002Fpgdata\n      - .\u002Fdocker_local\u002Fconfigs:\u002Fapp\u002Fconfigs\n      - \u002Fetc\u002Flocaltime:\u002Fetc\u002Flocaltime\n    stop_grace_period: 90s\n    restart: unless-stopped\n```\n\n```bash\ndocker compose up -d\n```\n\n> 建议保留 `stop_grace_period`（如 `90s`），让内置 PostgreSQL 在 `docker compose stop` 时有足够时间完成一致性关闭，避免下次启动进入恢复重试。\n\n### 时区设置（重要）\n本项目使用**系统时区**进行日志时间解析与统计，请确保运行环境时区正确。\n\n**Docker \u002F Docker Compose**\n- 推荐挂载宿主机时区：`-v \u002Fetc\u002Flocaltime:\u002Fetc\u002Flocaltime:ro`（Linux）\n- 若宿主机提供 `\u002Fetc\u002Ftimezone`，可额外挂载：`-v \u002Fetc\u002Ftimezone:\u002Fetc\u002Ftimezone:ro`\n- 若你只想指定时区，可设置 `TZ=Asia\u002FShanghai`，但需保证容器内有时区数据（例如安装 `tzdata` 或挂载 `\u002Fusr\u002Fshare\u002Fzoneinfo`）\n\n**单体部署（单进程）**\n- 默认使用当前系统时区\n- 可通过环境变量临时指定：`TZ=Asia\u002FShanghai .\u002Fnginxpulse`\n\n### 移动端访问（\u002Fm）\n- 入口地址：`http:\u002F\u002F\u003Chost>:8088\u002Fm`\n- 移动端仅提供 **概览 \u002F 日报 \u002F 实时 \u002F 日志** 四个页面\n- **首次初始化必须在电脑端完成**，移动端会提示在电脑打开\n\n### 3) 手动构建（前端、后端）\n前端构建：\n\n```bash\ncd webapp\npnpm install\npnpm run build\n```\n\n移动端构建（\u002Fm）：\n\n```bash\ncd webapp_mobile\npnpm install\npnpm run build\n```\n\n后端构建：\n\n```bash\ngo mod download\ngo build -o bin\u002Fnginxpulse .\u002Fcmd\u002Fnginxpulse\u002Fmain.go\n```\n\n本地开发（前后端一起跑）：\n\n```bash\n.\u002Fscripts\u002Fdev_local.sh\n```\n\n> 前端开发服务默认端口 8088，并会将 `\u002Fapi` 代理到 `http:\u002F\u002F127.0.0.1:8089`。\n> 本地开发前请准备好日志文件，放在 `var\u002Flog\u002F` 下（或确保 `configs\u002Fnginxpulse_config.json` 的 `logPath` 指向对应文件）。\n\n### 4) 单体部署（单进程）\n**重要提示（版本 > 1.5.3）**：已彻底弃用 SQLite。单体部署必须自备 PostgreSQL 并配置 `DB_DSN`（或在 `configs\u002Fnginxpulse_config.json` 填好 `database.dsn`）。  \n从仓库的releases下载对应平台的二进制文件，执行即可。\n\n执行后会生成单体可执行文件（已内置前端静态资源），启动后即可同时提供前后端服务：\n- 前端：`http:\u002F\u002Flocalhost:8088`\n- 后端：`http:\u002F\u002Flocalhost:8088\u002Fapi\u002F...`\n\n#### 单体部署的配置方式\n单体运行时读取配置有两种方式（任选其一）：\n\n**方式 A：配置文件（默认）**\n1. 在运行目录创建 `configs\u002F`\n2. 放入 `configs\u002Fnginxpulse_config.json`\n3. 启动：`.\u002Fnginxpulse`\n\n**方式 B：环境变量注入（无需文件）**\n```bash\nCONFIG_JSON=\"$(cat \u002Fpath\u002Fto\u002Fnginxpulse_config.json)\" .\u002Fnginxpulse\n```\n\n注意事项：\n- 配置文件路径为相对路径 `.\u002Fconfigs\u002Fnginxpulse_config.json`，请确保运行时工作目录正确。\n- 如果使用 systemd，请设置 `WorkingDirectory`，或改用 `CONFIG_JSON` 注入。\n- 数据目录 `.\u002Fvar\u002Fnginxpulse_data` 也是相对路径；找不到目录时请先确认当前进程的工作目录。\n\n### 5) Makefile 构建\n此项目也支持了通过Makefile来构建相关资源，命令如下：\n```bash\nmake frontend   # 构建前端（含移动端）webapp\u002Fdist + webapp_mobile\u002Fdist\nmake frontend-mobile # 仅构建移动端 webapp_mobile\u002Fdist\nmake backend    # 构建后端 bin\u002Fnginxpulse（不内嵌前端）\nmake single     # 构建单体包（内嵌前端 + 复制配置与gzip示例）\nmake dev        # 启动本地开发（前端8088，后端8089）\nmake clean      # 清理构建产物\n```\n\n指定版本号示例：\n```bash\nVERSION=v0.4.8 make single\nVERSION=v0.4.8 make backend\n```\n\n说明：\n- `make single` 默认构建 `linux\u002Famd64` 与 `linux\u002Farm64`，产物在 `bin\u002Flinux_amd64\u002F` 与 `bin\u002Flinux_arm64\u002F`。\n- 单平台构建时，产物在 `bin\u002Fnginxpulse`，配置在 `bin\u002Fconfigs\u002Fnginxpulse_config.json`（端口默认 `:8088`），gzip 示例在 `bin\u002Fvar\u002Flog\u002Fgz-log-read-test\u002F`。\n\n## Docker 部署权限说明\n\n镜像默认以非 root 用户（`nginxpulse`）运行。容器里能否读取日志、写入数据，**取决于宿主机目录的权限**。你在容器里用 `cat` 看到日志，通常是因为 `docker exec` 默认是 root，不代表应用用户有权限。\n\n推荐做法：**让容器内用户的 UID\u002FGID 与宿主机日志\u002F数据目录的属主一致**。\n\n步骤 1：查看宿主机目录的 UID\u002FGID\n```bash\nls -n \u002Fpath\u002Fto\u002Flogs \u002Fpath\u002Fto\u002Fnginxpulse_data \u002Fpath\u002Fto\u002Fpgdata\n# 或\nstat -c '%u %g %n' \u002Fpath\u002Fto\u002Flogs \u002Fpath\u002Fto\u002Fnginxpulse_data \u002Fpath\u002Fto\u002Fpgdata\n```\n\n步骤 2：启动容器时传入 `PUID\u002FPGID`（与上面一致）\n```bash\ndocker run ... \\\n  -e PUID=1000 \\\n  -e PGID=1000 \\\n  -v \u002Fpath\u002Fto\u002Flogs:\u002Fvar\u002Flog\u002Fnginx:ro \\\n  -v \u002Fpath\u002Fto\u002Fnginxpulse_data:\u002Fapp\u002Fvar\u002Fnginxpulse_data:rw \\\n  -v \u002Fpath\u002Fto\u002Fpgdata:\u002Fapp\u002Fvar\u002Fpgdata:rw \\\n  ...\n```\n\n步骤 3：确保目录对该 UID\u002FGID 可读\u002F可写\n```bash\nchown -R 1000:1000 \u002Fpath\u002Fto\u002Fnginxpulse_data \u002Fpath\u002Fto\u002Fpgdata\nchmod -R u+rx \u002Fpath\u002Fto\u002Flogs\n```\n\n如果你使用外部数据库（设置 `DB_DSN`），可以不挂载 `pgdata`。外置 PG **推荐使用 16 版本**。\n若你通过**初始化向导**配置外部数据库，同样可以不挂载 `pgdata`，保存后重启容器生效。\n\nSELinux 说明（RHEL\u002FCentOS\u002FFedora 等）：\n- 这些系统默认启用 SELinux，Docker 挂载目录可能因安全上下文导致“看得见但不可访问”。\n- 解决办法是在 volume 后加 `:z` 或 `:Z` 重新打标签：\n  - `:Z` 让该目录仅供当前容器使用（更严格）。\n  - `:z` 让该目录可被多个容器共享使用。\n```bash\ndocker run ... \\\n  -v \u002Fpath\u002Fto\u002Flogs:\u002Fvar\u002Flog\u002Fnginx:ro,Z \\\n  -v \u002Fpath\u002Fto\u002Fnginxpulse_data:\u002Fapp\u002Fvar\u002Fnginxpulse_data:rw,Z \\\n  -v \u002Fpath\u002Fto\u002Fpgdata:\u002Fapp\u002Fvar\u002Fpgdata:rw,Z \\\n  ...\n```\n\n不推荐做法：直接 `chmod -R 777`。这虽然省事，但权限过宽不安全，仅建议临时排查时使用。\n\n## 常见问题\n\n1) 日志明细无内容  \n通常是容器内无权限访问宿主机日志文件。请先阅读《Docker 部署权限说明》并按步骤处理权限。\n\n2) 日志存在，但 PV\u002FUV 无法统计  \n默认规则会排除内网 IP。若你希望统计内网流量，请将 `PV_EXCLUDE_IPS` 设为空数组并重启：\n```bash\nPV_EXCLUDE_IPS='[]'\n```\n重启后在“日志明细”页面点击“重新解析”按钮。\n\n3) 日志时间不正确  \n通常是运行环境时区未同步导致。请确认 Docker\u002F系统时区正确，并按“时区设置（重要）”章节调整后重新解析日志。\n\n4) 无法启动\n报错 tmp 目录无权限写入问题（旧版本可能出现），如果容器启动后出现如下所示的报错，请确认 `nginxpulse_data` 可写（具体权限问题请阅读《Docker 部署权限说明》），或设置 `TMPDIR` 到可写目录。\n```bash\nnginxpulse: initializing postgres data dir at \u002Fapp\u002Fvar\u002Fpgdata\n\u002Fapp\u002Fentrypoint.sh: line 91: can't create \u002Ftmp\u002Ftmp.KOdAPn: Permission denied\n```\n解决办法（任选其一）：\n```bash\n-e TMPDIR=\u002Fapp\u002Fvar\u002Fnginxpulse_data\u002Ftmp\n```\n\n5) 解析入库的数据会一直保留吗  \n不会。入库后的访问数据会按 `system.logRetentionDays` 定时清理（默认 30 天）。  \n例如你一次解析了几个月数据，后续仍会逐步清理掉保留天数之外的数据。  \n注意：该参数不影响原始 Nginx 日志文件，也不等于系统运行日志（`var\u002Fnginxpulse_data\u002Fnginxpulse.log`）的轮转策略。\n\n## 目录结构与主要文件\n\n```\n.\n├── cmd\u002F\n│   └── nginxpulse\u002F\n│       └── main.go                 # 程序入口\n├── internal\u002F                       # 核心逻辑（解析、统计、存储、API）\n│   ├── app\u002F\n│   │   └── app.go                  # 初始化、依赖装配、任务调度\n│   ├── analytics\u002F                  # 统计口径与聚合\n│   ├── enrich\u002F\n│   │   ├── ip_geo.go               # IP 归属地（远程+本地）与缓存\n│   │   └── pv_filter.go            # PV 过滤规则\n│   ├── ingest\u002F\n│   │   └── log_parser.go           # 日志扫描、解析与入库\n│   ├── server\u002F\n│   │   └── http.go                 # HTTP 服务与中间件\n│   ├── store\u002F\n│   │   └── repository.go           # PostgreSQL 结构与写入\n│   ├── version\u002F\n│   │   └── info.go                 # 版本信息注入\n│   ├── webui\u002F\n│   │   └── dist\u002F                   # 单体嵌入的前端静态资源\n│   └── web\u002F\n│       └── handler.go              # API 路由\n├── webapp\u002F\n│   └── src\u002F\n│       └── main.ts                 # 前端入口\n├── webapp_mobile\u002F                  # 移动端前端（\u002Fm）\n│   └── src\u002F\n│       └── main.ts                 # 移动端入口\n├── configs\u002F\n│   ├── nginxpulse_config.json      # 核心配置入口\n│   ├── nginxpulse_config.dev.json  # 本地开发配置\n│   └── nginx_frontend.conf         # 内置 Nginx 配置\n├── docs\u002F\n│   └── versioning.md               # 版本管理与发布说明\n├── scripts\u002F\n│   ├── build_single.sh             # 单体构建脚本\n│   ├── dev_local.sh                # 本地一键启动\n│   └── publish_docker.sh           # 推送 Docker 镜像\n├── var\u002F                            # 数据目录（运行时生成\u002F挂载）\n│   └── log\u002F\n│       └── gz-log-read-test\u002F       # gzip 参考日志\n├── Dockerfile\n└── docker-compose.yml\n```\n\n---\n\n如需更详细的统计口径或 API 扩展，建议从 `internal\u002Fanalytics\u002F` 与 `internal\u002Fweb\u002Fhandler.go` 开始。\n\n## 致谢\n\n非常感谢诸位好兄弟\u002F姐妹对此项目的[投币](https:\u002F\u002Fresource.kaisir.cn\u002Fuploads\u002FMarkDownImg\u002F20260128\u002FpEZcuA.jpg)支持。\n\n\u003Cp align=\"left\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-1.png\" width=\"60\" height=\"60\" alt=\"supporter-1\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-2.png\" width=\"60\" height=\"60\" alt=\"supporter-2\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-3.png\" width=\"60\" height=\"60\" alt=\"supporter-3\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-4.png\" width=\"60\" height=\"60\" alt=\"supporter-4\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-5.png\" width=\"60\" height=\"60\" alt=\"supporter-5\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-6.png\" width=\"60\" height=\"60\" alt=\"supporter-6\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-7.png\" width=\"60\" height=\"60\" alt=\"supporter-7\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-8.png\" width=\"60\" height=\"60\" alt=\"supporter-8\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Flikaia\u002Fnginxpulse\u002Fmain\u002Fdocs\u002Fthanks\u002Fsupporter-9.png\" width=\"60\" height=\"60\" alt=\"supporter-9\" \u002F>\n\u003C\u002Fp>\n\n## 写在最后\n\n本项目大部分代码通过codex生成，我投喂了很多开源项目和资料让他做参考，在此感谢大家对开源社区的贡献。\n\n* [有没有好用的 nginx 日志看板展示项目](https:\u002F\u002Fv2ex.com\u002Ft\u002F1178789)\n* [nixvis](https:\u002F\u002Fgithub.com\u002FBeyondXinXin\u002Fnixvis)\n* [goaccess](https:\u002F\u002Fgithub.com\u002Fallinurl\u002Fgoaccess)\n* [prometheus监控nginx的两种方式原创](https:\u002F\u002Fblog.csdn.net\u002Flvan_test\u002Farticle\u002Fdetails\u002F123579531)\n* [通过nginx-prometheus-exporter监控nginx指标](https:\u002F\u002Fmaxidea.gitbook.io\u002Fk8s-testing\u002Fprometheus-he-grafana-de-dan-ji-bian-pai\u002Ftong-guo-nginxprometheusexporter-jian-kong-nginx)\n* [Prometheus 监控nginx服务 ](https:\u002F\u002Fwww.cnblogs.com\u002Fzmh520\u002Fp\u002F17758730.html)\n* [Prometheus监控Nginx](https:\u002F\u002Fzhuanlan.zhihu.com\u002Fp\u002F460300628)\n","NginxPulse 是一个轻量级的 Nginx 访问日志分析与可视化面板，能够提供实时统计、PV 过滤、IP 归属地查询和客户端解析等功能。该项目使用 Go 语言开发，后端基于 Gin 框架，并采用 PostgreSQL 作为数据库存储，前端则利用 Vue 3 和 Vite 构建用户界面。其核心功能之一是高效的 IP 归属地查询策略，通过本地库 ip2region 与远程 API 相结合的方式，确保快速准确地获取访问者地理位置信息。此外，NginxPulse 支持 Docker 和 Docker Compose 部署，便于快速搭建及维护。此工具非常适合需要对网站流量进行监控分析、了解访客来源以及优化服务器配置的运维人员或网站管理员使用。",2,"2026-06-11 03:50:10","high_star"]