ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nginx Proxy Manager 404 Hosts 实战指南:为已下线域名提供 404 页面并追踪访问日志

Nginx Proxy Manager 404 Hosts 实战指南:为已下线域名提供 404 页面并追踪访问日志 Nginx Proxy Manager 404 Hosts 实战指南为已下线域名提供 404 页面并追踪访问日志【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager导读404 Host在 Nginx Proxy Manager 中也被称为 Dead Host / 死主机是一种特殊的主机配置它不将流量转发到任何上游服务而是直接对指定域名返回 HTTP 404。本文以 frontend/src/locale/src/HelpDoc/it/DeadHosts.md 为骨架结合后端源码、Nginx 模板与前端实现系统讲解 404 Host 的使用场景、配置字段、REST API、权限模型与底层配置生成原理帮助你完成域名下线后的 SEO 优雅处理、Referrer 来源追踪与站点收尾运维。一、什么是 404 Host404 Host 本质上就是一个只返回 404 页面、不做任何转发的主机配置。在 Nginx Proxy Manager 中它属于四类主机Proxy Host / Redirection Host / 404 Host / Stream之一后端代码中以dead_host为标识贯穿于数据表、Nginx 配置目录与审计日志。结合原文档与源码它的典型价值集中在两个方面1. 面向搜索引擎的优雅下线当一个域名已经不再提供服务但它仍出现在搜索引擎索引中时直接删除 DNS 解析往往会让用户得到连接被拒绝这类生硬结果。404 Host 提供了一种更规范的收尾方式为用户返回一个更友好的 404 错误页面比裸连接错误体验好得多明确告知搜索引擎爬虫该域名的页面已不存在HTTP 404 状态码会被搜索引擎正确识别并逐步从索引中移除避免旧页面被长期误判为仍在提供服务或内容被错误收录。2. 访问与来源追踪这是 404 Host 常被忽略的另一个收益由于它仍然是一个真实的 Nginxserver块所有命中该域名的请求都会被记录到独立的访问日志中运维人员可以跟踪有多少残留流量仍在访问已下线的域名例如旧的收藏夹、旧外链、过期营销活动查看 Referrer来源页反推这些访问是从哪些外部站点或搜索词进来的为后续的 301 迁移、内容恢复或彻底清理提供数据支撑。二、界面速览在管理后台的 Hosts 菜单下进入 404 Hosts 页面可以看到所有已创建的 404 Host。列表主要展示所有者Owner、来源域名Source含创建时间、SSL 状态HTTP Only / 证书名称以及在线状态Online / Offline并可通过右上角 Add 404 Host 按钮新建列表数据来自前端 DeadHosts 列表页通过useDeadHosts([owner, certificate])拉取并同时展开所有者与证书信息见 useDeadHosts.ts。三、创建与管理 404 Host点击Add 404 Host后前端会打开 DeadHostModal表单包含三个页签Details详情填写域名列表支持通配符域名前端以isWildcardPermitted开启该能力SSL证书选择已有 SSL 证书或现场签发新证书allowNew并配置 SSL 强制跳转等选项Advanced高级写入自定义 Nginx 配置片段advancedConfig。保存时前端通过useSetDeadHost见 useDeadHost.ts根据是否存在id自动调用createDeadHost或updateDeadHost接口。列表页 TableWrapper.tsx 还提供了搜索过滤、启用/禁用toggleDeadHost、删除deleteDeadHost等操作其中删除会经过DeleteConfirmModal二次确认删除与禁用后还会使dead-hosts、audit-logs、host-report、certificates等查询缓存失效保证页面数据一致。四、核心配置字段详解根据 dead-host-object.json 与 common.json 的 OpenAPI 定义404 Host 对象包含以下字段字段类型说明domain_namesstring[]绑定的域名列表必填最小 1 个、最多 100 个不能重复不允许包含空格与特殊字符certificate_idinteger / new关联的 SSL 证书 ID为0表示仅 HTTP传字符串new表示随主机一起申请新证书ssl_forcedboolean是否强制将 HTTP 跳转到 HTTPS仅在配置了证书时生效hsts_enabledboolean是否开启 HSTS 响应头依赖ssl_forcedhsts_subdomainsbooleanHSTS 是否覆盖所有子域名依赖hsts_enabledhttp2_supportboolean是否启用 HTTP/2 协议advanced_configstring追加到 server 块内的自定义 Nginx 配置enabledboolean主机启用状态metaobject运行时元数据如nginx_online、nginx_err字段之间的联动规则后端在 internal/host.js 的cleanSslHstsData中强制维护了一套级联约束若certificate_id为空无证书→ssl_forced、http2_support一律强制为false若ssl_forced为假 →hsts_enabled强制为false若hsts_enabled为假 →hsts_subdomains强制为false。也就是说证书是 SSL 系列开关的前提HSTS 是 SSL 强制的下游前端表单与后端会在创建/更新时共同保证这一逻辑成立。五、数据模型与持久化404 Host 在数据库中对应dead_host表其初始表结构定义于 initial 迁移包含owner_user_id归属用户、domain_namesJSON 数组、certificate_id、ssl_forced、advanced_config、meta等字段后续迁移又补充了enabled、hsts_*、http2_support等开关字段。ORM 模型 backend/models/dead_host.js 定义在 Objection.js 之上boolFieldsis_deleted、ssl_forced、http2_support、enabled、hsts_enabled、hsts_subdomains在读写数据库时自动在布尔与 0/1 整数间转换domain_names在插入和更新前自动排序与ownerUser、certificateCertificate建立了关系映射默认展开[owner, certificate]。在 backend/internal/dead-host.js 中实现了完整的内部 CRUD 逻辑create、update、get、getAll、delete、enable、disable、getCount。值得注意的实现细节软删除delete并非物理删除而是将is_deleted置为 1随后调用internalNginx.deleteConfig(dead_host, row)删除 Nginx 配置并reloaddead-host.js#L223-L246启用/禁用enable重新生成配置disable删除配置并 reload重复操作会抛出 Host is already enabled/disabled 校验错误dead-host.js#L255-L322创建即签发证书当certificate_id new时会调用internalCertificate.createQuickCertificate现场签发证书再回填到主机记录并通过 sanity check 校验证书创建成功dead-host.js#L21-L92审计日志创建/更新/删除/启停都会写入audit_logobject_type为dead-host方便追溯操作历史。六、Nginx 配置生成原理404 Host 的实际效果由 backend/templates/dead_host.conf 模板渲染而来{% include _header_comment.conf %} {% if enabled %} {% include _hsts_map.conf %} server { {% include _listen.conf %} {% include _certificates.conf %} {% include _hsts.conf %} {% include _forced_ssl.conf %} access_log /data/logs/dead-host-{{ id }}_access.log standard; error_log /data/logs/dead-host-{{ id }}_error.log warn; {{ advanced_config }} {% if use_default_location %} location / { {% include _hsts.conf %} return 404; } {% endif %} # Custom include /data/nginx/custom/server_dead[.]conf; } {% endif %}从中可以看到关键信息只有enabled为真时才输出配置监听端口、server_name与 HTTP/2 由 _listen.conf 注入listen 80配置证书时追加listen 443 sslserver_name由domain_names以空格连接证书路径由 _certificates.conf 注入Lets Encrypt 证书指向/etc/letsencrypt/live/npm-{certificate_id}/自定义证书指向/data/custom_ssl/npm-{certificate_id}/访问日志独立落盘/data/logs/dead-host-{id}_access.log这正是原文档所说的追踪命中日志与 Referrer的底层实现——每个 404 Host 都有自己独立的日志文件方便按域名分析残留流量核心行为location / { return 404; }在未提供自定义location /时生效通过include /data/nginx/custom/server_dead[.]conf支持外部自定义片段叠加。渲染流程由 backend/internal/nginx.js 的configure与generateConfig驱动先生成配置、执行nginx -t校验成功则写入meta.nginx_online true并 reload失败则将nginx_online置为false、记录错误详情并把问题配置改名为.err文件供排查nginx.js#L27-L101。生成的配置文件路径为/data/nginx/dead_host/{id}.conf见 getConfigName。另外若advanced_config中已包含location / {定义模板会自动跳过默认 404 location由advancedConfigHasDefaultLocation正则判断避免冲突。七、域名唯一性保护与 Proxy Host、Redirection Host 一样404 Host 的域名也不是随意填写的。创建与更新时internal/dead-host.js 会逐个调用 internal/host.js 的isHostnameTaken同时在三类主机proxy_host、redirection_host、dead_host中做全量模糊匹配再在内存中做大小写不敏感的精确比对若域名已被占用抛出ValidationErrorxxx is already in use更新自身时通过ignore_type dead与ignore_id排除自身记录允许不改动地提交原域名。该机制确保了同一域名在同一时刻只能属于一种主机类型避免 Nginxserver_name冲突导致配置无法通过nginx -t校验。八、权限模型与多用户可见性404 Host 支持细粒度的权限控制。在后端权限校验中相关权限点包括列表/查看dead_hosts:list、dead_hosts:get创建/修改dead_hosts:create、dead_hosts:update删除dead_hosts:delete权限定义可参考 dead_hosts-create.json要求permission_dead_hosts具备 manage 级别与 dead_hosts-list.jsonview 级别即可查看。create/get/getAll中还会根据permission_visibility判断非all可见性的用户只能操作owner_user_id等于自己的记录dead-host.js#L197-L199。前端则通过HasPermission组件按DEAD_HOSTS区块控制页面访问与增删按钮的显隐见 DeadHosts/index.tsx。九、REST API 实操404 Host 的对外 REST API 定义于 backend/routes/nginx/dead_hosts.js路由前缀为/api/nginx/dead-hosts方法路径说明GET/api/nginx/dead-hosts列出全部 404 Host支持?expandowner,certificate与?query搜索POST/api/nginx/dead-hosts创建 404 Hostbody 必填domain_namesGET/api/nginx/dead-hosts/:host_id获取单个 404 HostPUT/api/nginx/dead-hosts/:host_id更新 404 HostDELETE/api/nginx/dead-hosts/:host_id删除 404 HostPOST/api/nginx/dead-hosts/:host_id/enable启用POST/api/nginx/dead-hosts/:host_id/disable禁用创建请求示例对应 post.json 的 schemacurl -X POST https://your-npm-host/api/nginx/dead-hosts \ -H Authorization: Bearer token \ -H Content-Type: application/json \ -d { domain_names: [retired.example.com], certificate_id: 0, ssl_forced: false, advanced_config: , http2_support: false, hsts_enabled: false, hsts_subdomains: false, meta: {} }成功创建后返回 201 及完整的 404 Host 对象含id、owner、certificate等字段若certificate_id传new则会在创建流程中同步签发证书参见 post.json 的certificate_id定义。十、404 Host 与默认站点 404的区别需要区分两个容易混淆的概念404 Host针对特定域名创建的 server 块只对绑定域名生效拥有独立的访问日志与证书配置可精确管理每一个下线域名默认站点Default Site在 Settings 中配置的兜底行为作用于所有未匹配到任何主机配置的请求。其可选值包括congratulations欢迎页、404返回 404、444直接断开连接、redirect301 跳转、html自定义静态页渲染逻辑见 backend/templates/default.conf配置界面见 frontend/src/pages/Settings/DefaultSite.tsx。实际运维中两者可以组合使用让未知流量落入默认站点的 404/444 兜底同时为已知的存量域名建立 404 Host 以便单独统计日志。十一、实战建议SEO 收尾对已从产品中下线、但仍被搜索引擎收录的域名创建 404 Host 替代直接删解析配合默认站点 404 兜底保证任何残留入口都不会出现裸连接错误流量观测借助每个 404 Host 独立的/data/logs/dead-host-{id}_access.log定期分析 Referrer判断旧流量来源外链、书签、营销页据此决定是否需要改用 Redirection Host 做 301 迁移多用户环境为不同团队分配dead_hosts权限并设置visibility让各团队只能管理自己名下已下线域名避免误操作证书联动若希望下线页面仍以 HTTPS 呈现避免浏览器混入不安全警告可为 404 Host 绑定证书并开启ssl_forced同时按需开启 HSTS由于cleanSslHstsData的级联规则只需从证书 → SSL 强制 → HSTS顺序配置即可。【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表