ARTICLE DETAIL

资讯详情

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

Nginx Proxy Manager 404 Host(Dead Host)完整实战指南:为已失效域名配置自定义 404 页面与访问日志追踪

Nginx Proxy Manager 404 Host(Dead Host)完整实战指南:为已失效域名配置自定义 404 页面与访问日志追踪 Nginx Proxy Manager 404 HostDead Host完整实战指南为已失效域名配置自定义 404 页面与访问日志追踪【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager本文以 Nginx Proxy Manager 仓库的官方帮助文档frontend/src/locale/src/HelpDoc/en/DeadHosts.md为骨架结合后端数据模型、REST API、权限体系与 Nginx 配置模板源码系统讲解 404 Host在代码中称为 Dead Host的用途、创建配置、底层生成原理与运维实践。读完本文你将掌握如何在 Nginx Proxy Manager 中为不再提供内容的域名托管一个返回 404 的虚拟主机利用它优化搜索引擎索引结果、收集失效域名的访问日志与来源referrer数据并学会通过 API、审计日志与自定义 Nginx 配置对这类主机进行精细化管理。什么是 404 HostDead Host按照官方帮助文档的定义A 404 Host is simply a host setup that shows a 404 page.404 Host 就是一个专门返回 404 页面的虚拟主机。它不像 Proxy Host 那样把请求转发到上游后端也不像 Redirection Host 那样返回 3xx 跳转而是对匹配到的域名直接返回 HTTP 404 状态码。在 Nginx Proxy Manager 的源码与数据库中这一功能被称为Dead Hostdead_host表、dead-host审计对象类型而在 Web 界面中则以404 Host的名字出现在 Hosts 404 Hosts 页面对应截图所示的管理表格。从数据模型看它与 Proxy Host / Redirection Host 同属主机体系dead_host表由初始迁移 backend/migrations/20180618015850_initial.js 创建包含域名列表、证书、SSL 强制开关、高级配置与 meta 等核心字段模型定义位于 backend/models/dead_host.js。为什么要使用 404 Host官方文档给出了两个核心动机结合 Nginx 能力可以进一步展开为四类典型场景为搜索引擎提供明确的内容已删除信号当你的域名出现在搜索引擎索引中但对应页面已经下线时返回 404 比返回 200 空页面更能准确地告诉搜索引擎索引器该页面已不存在从而加速失效页面的下线与索引清理。提供比默认错误页更友好的展示配合 SSL 证书与高级配置advanced_config404 Host 可以为访问者呈现定制化的错误页面而不是默认的 Nginx 报错页。追踪失效域名的访问日志与来源referrer这是官方文档单独强调的收益即使域名不再提供服务仍然会有流量例如旧链接、书签、外链访问它。404 Host 会为每个主机生成独立的访问日志文件你可以据此统计命中次数、查看访问来源判断哪些外链仍然指向已失效内容。接管通配域名的兜底流量前端域名输入组件 DomainNamesField 支持通配域名isWildcardPermitted因此可以用*.example.com形式的 404 Host 接管一批未使用的子域名避免它们落入默认站点。在 Web 界面中创建与管理 404 Host404 Host 的创建/编辑弹窗由 frontend/src/modals/DeadHostModal.tsx 实现包含三个标签页Details详情、SSLSSL、Advanced高级设置。Details 标签域名表单中唯一的必填字段是domainNames对应 API 中的domain_names。这里填写一个或多个要返回 404 的域名支持通配符如*.example.com。多个域名会在生成 Nginx 配置时合并为server_name列表。SSL 标签证书与 HTTPS 行为SSL 标签页包含 SSLCertificateField 与 SSLOptionsFields 两组字段对应 API 对象中的以下属性定义见 backend/schema/components/dead-host-object.json字段类型含义certificate_idinteger绑定的 SSL 证书 ID设为0表示不启用 HTTPS设为new时后端会自动签发新证书见下文自动签发ssl_forcedboolean是否强制跳转 HTTPS仅当已绑定证书时生效hsts_enabledboolean是否启用 HSTS 响应头hsts_subdomainsbooleanHSTS 是否覆盖所有子域名http2_supportboolean是否启用 HTTP/2这些布尔字段在数据库中以 0/1 整数存储由 backend/models/dead_host.js 中的boolFields列表is_deleted、ssl_forced、http2_support、enabled、hsts_enabled、hsts_subdomains在读写时自动与布尔值互转因此 API 层始终以true/false交互。Advanced 标签高级 Nginx 配置高级标签页对应advanced_config字段字符串类型默认。它会被原样注入到生成的 Nginxserver块中见下文模板解析适合写入自定义指令例如自定义 404 响应内容、缓存策略或额外的location规则。后端在创建时会对缺失值做兜底处理见 backend/internal/dead-host.js确保advanced_config始终是字符串。列表页的操作404 Hosts 列表页由 frontend/src/pages/Nginx/DeadHosts/Table.tsx 渲染展示列包括所属用户Gravatar 头像、源域名DomainsFormatter、SSL 证书、状态online/offline以及操作菜单编辑、启用/禁用onDisableToggle和删除。删除操作受权限控制HasPermission包裹见下文权限章节。数据模型与 REST APIdead_host 表结构由 backend/migrations/20180618015850_initial.js 创建的表结构如下id自增主键created_on/modified_on创建与修改时间由模型$beforeInsert/$beforeUpdate自动维护domain_names在插入与更新时都会自动排序owner_user_id所属用户 IDis_deleted软删除标记默认 0domain_namesJSON 数组certificate_id证书 ID默认 0ssl_forcedSSL 强制默认 0advanced_config高级配置文本默认空串metaJSON 元数据默认{}模型 backend/models/dead_host.js 同时定义了与userowner、certificate的关联关系列表查询默认按domain_names排序并支持expandcertificate,owner联查。REST 端点路由定义于 backend/routes/nginx/dead_hosts.js全部端点都需要 JWT 认证jwtdecode()方法与路径说明GET /api/nginx/dead-hosts列出全部 404 Host支持?expandcertificate,owner与?queryxxx搜索POST /api/nginx/dead-hosts创建201 返回新对象请求体至少需要domain_namesGET /api/nginx/dead-hosts/:host_id获取单个PUT /api/nginx/dead-hosts/:host_id更新DELETE /api/nginx/dead-hosts/:host_id删除软删除POST /api/nginx/dead-hosts/:host_id/enable启用并生成 Nginx 配置POST /api/nginx/dead-hosts/:host_id/disable禁用并移除 Nginx 配置创建请求的 OpenAPI 示例见 backend/schema/paths/nginx/dead-hosts/post.json{ domain_names: [test.example.com], certificate_id: 0, ssl_forced: false, advanced_config: , http2_support: false, hsts_enabled: false, hsts_subdomains: false, meta: {} }权限控制创建与更新 404 Host 需要dead_hosts:create/dead_hosts:update等权限见 backend/internal/dead-host.js 中各方法开头的access.can(...)调用。权限模型文件 backend/lib/access/dead_hosts-create.json 表明管理员admin 角色默认全权普通用户则需要具备permission_dead_hosts: manage权限并携带user角色。此外非管理员用户查询时会被限制为只能看到自己名下owner_user_id的 404 Hostbackend/internal/dead-host.js该可见性由user_permission表中的visibility字段控制backend/migrations/20180618015850_initial.js。底层原理Nginx 配置如何生成每次创建、更新或启用 404 Host 时后端都会调用internalNginx.configure(deadHostModel, dead_host, row)见 backend/internal/dead-host.js基于模板渲染出对应的 Nginxserver配置禁用或删除时则调用internalNginx.deleteConfig(dead_host, row)并reload。渲染所依赖的模板是 backend/templates/dead_host.conf其核心逻辑如下server { {% include _listen.conf %} # 监听端口、server_name、HTTP/2 {% include _certificates.conf %} # SSL 证书路径 {% include _hsts.conf %} # HSTS 头 {% include _forced_ssl.conf %} # 强制 HTTPS 跳转 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 / { return 404; # 核心所有请求返回 404 } {% endif %} # Custom include /data/nginx/custom/server_dead[.]conf; }各组成部分的职责_listen.confbackend/templates/_listen.conf监听 80 端口若绑定证书则追加 443 ssl 监听输出server_name多个域名以空格连接根据http2_support开关启用或关闭 HTTP/2。IPv6 监听由模板上下文中的ipv6变量控制。_forced_ssl.confbackend/templates/_forced_ssl.conf当certificate存在且certificate_id 0且ssl_forced为真时引入conf.d/include/force-ssl.conf实现 80→443 的强制跳转。访问日志每个 404 Host 有独立的dead-host-{{ id }}_access.log与dead-host-{{ id }}_error.log这正是官方文档所说追踪命中该主机的日志与来源的实现载体。return 404;位于location /内是返回 404这一核心行为的落点。use_default_location为模板预留的开关。自定义扩展点模板末尾include /data/nginx/custom/server_dead[.]conf;允许在容器挂载的 custom 目录中追加 server 级配置注意文件名需匹配server_dead.conf模式而advanced_config则提供界面内的配置注入通道两者互补。整个模板还引用了_header_comment.conf头部注释与_hsts_map.confHSTS map并整体包裹在{% if enabled %}条件中——即主机被禁用时不生成 server 块。生命周期与审计从创建到删除backend/internal/dead-host.js 完整实现了 404 Host 的生命周期关键流程如下创建create先校验权限然后对每个域名调用internalHost.isHostnameTaken检查是否与其他主机proxy/redirection/dead/stream冲突冲突即抛出ValidationError随后落库、写入审计日志、生成 Nginx 配置。若请求中certificate_id new会先删除该字段在主机创建成功后调用internalCertificate.createQuickCertificate自动签发证书并回填certificate_idbackend/internal/dead-host.js。更新update同样做域名占用检查与证书联动更新后若主机仍为启用状态则重新生成 Nginx 配置若已禁用则跳过配置生成backend/internal/dead-host.js。启用/禁用enable/disable切换enabled字段启用时生成配置禁用时删除配置并 reload Nginx对重复操作重复启用/禁用会抛出ValidationError。删除delete将is_deleted置 1软删除删除 Nginx 配置并 reload从而保证已删除的域名可以重新分配给其他主机。每一步操作都会通过internalAuditLog.add写入审计日志object_type: dead-hostaction 为 created / updated / enabled / disabled / deleted因此可以在 Audit Log 页面完整追溯 404 Host 的所有变更历史。常见问题与运维建议我该用 Proxy Host 还是 404 Host如果你希望某个域名故意不提供内容、只返回 404同时保留域名解析与 HTTPS请用 404 Host如果你需要把请求转发给上游应用请用 Proxy Host。如何自定义 404 页面两种方式在 Advanced 标签中向advanced_config写入自定义location规则例如返回静态 HTML 或反向代理到错误页服务或者在容器中挂载/data/nginx/custom/server_dead.conf追加 server 级指令。域名冲突如何处理一个域名只能属于一个主机。创建 404 Host 时后端会逐一校验若提示xxx is already in use说明该域名已被其他主机占用需要先删除或修改原主机。通配域名404 Host 支持*.example.com形式的通配域名可用于兜底拦截未启用的子域名流量并借助独立访问日志观察哪些子域名仍被外部引用。证书与强制 HTTPS先绑定证书certificate_id 0再开启ssl_forced否则强制跳转配置不会生效模板中该分支以存在证书为前提。参考文件索引官方帮助文档frontend/src/locale/src/HelpDoc/en/DeadHosts.md后端业务逻辑backend/internal/dead-host.js数据模型backend/models/dead_host.js建表迁移backend/migrations/20180618015850_initial.jsNginx 模板backend/templates/dead_host.conf、backend/templates/_listen.conf、backend/templates/_forced_ssl.confAPI 路由backend/routes/nginx/dead_hosts.js接口 Schemabackend/schema/components/dead-host-object.json、backend/schema/paths/nginx/dead-hosts/post.json前端表单与列表frontend/src/modals/DeadHostModal.tsx、frontend/src/pages/Nginx/DeadHosts/Table.tsx前端数据 Hookfrontend/src/hooks/useDeadHost.ts【免费下载链接】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),仅供参考
返回列表