ARTICLE DETAIL

资讯详情

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

Nginx Proxy Manager 代理服务(Proxy Host)完全指南:从转发原理到源码级配置

Nginx Proxy Manager 代理服务(Proxy Host)完全指南:从转发原理到源码级配置 Nginx Proxy Manager 代理服务Proxy Host完全指南从转发原理到源码级配置【免费下载链接】nginx-proxy-managerDocker container for managing Nginx proxy hosts with a simple, powerful interface项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager代理服务Proxy Host是 Nginx Proxy Manager 中最核心、使用频率最高的功能模块它把对外暴露的域名与后端的网络应用连接起来并可选地提供 SSL 终止能力。本文以项目自带的帮助文档为主线结合 backend/internal/proxy-host.js、backend/templates/proxy_host.conf 等源码与配置深入讲解代理服务的概念、核心配置字段、Nginx 配置生成原理以及权限控制帮助你彻底理解并熟练使用这一功能。什么是代理服务Proxy Host代理服务是你想转发网络应用的主机。 代理服务可以为没有 SSL 服务的网络应用提供 SSL 服务可选。 代理服务是 Nginx 代理管理器的最常见用途之一。这三句话概括了代理服务的全部本质拆解开来是三个关键点转发代理服务是一个入口主机它接收来自公网的请求并把请求转发给后端的网络应用源站。这里的主机在 Nginx 层面体现为一个server配置块监听指定的域名server_name。SSL 终止如果后端应用本身不支持 HTTPS例如内网服务、开发环境服务代理服务可以在 Nginx 这一层终结 TLS 加密后端只收到明文的 HTTP 请求从而为没有 SSL 服务的网络应用提供 SSL 服务。最常见的用途无论是托管个人网站、反向代理内部工具还是给 Docker 容器暴露 Web 服务代理服务都是默认首选方案。代理服务在 Nginx 层的落地在源码层面转发这一行为由 Nginx 的proxy_pass指令完成。容器内统一的代理配置位于 docker/rootfs/etc/nginx/conf.d/include/proxy.confadd_header X-Served-By $host; proxy_set_header Host $host; proxy_set_header X-Forwarded-Scheme $x_forwarded_scheme; proxy_set_header X-Forwarded-Proto $x_forwarded_proto; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_pass $forward_scheme://$server:$port$request_uri;其中$forward_scheme、$server、$port三个变量正是代理服务配置中的转发协议、转发主机、转发端口它们在生成的 Nginx 配置中被显式赋值详见下文第四节。代理服务的核心能力转发与 SSL 终止转发四要素决定去向一个代理服务要把请求送到正确的后端需要四个要素它们也是创建代理服务时必填的核心字段配置字段说明取值范围 / 示例domain_names对外服务的域名列表可多个对应 Nginxserver_name如app.example.comforward_scheme转发到后端时使用的协议http/httpsforward_host后端主机地址IP 或域名如127.0.0.1forward_port后端服务端口165535如8080这些字段的定义可以在 API 模式定义 backend/schema/components/proxy-host-object.json 中找到例如forward_host限制为 1255 个字符forward_port限制在 165535 的整数范围内。SSL 终止为后端代劳HTTPSSSL 终止的流程是客户端 → HTTPS → Nginx代理服务→ HTTP → 后端应用。代理服务通过certificate_id关联一张 SSL 证书证书可在创建代理服务时一并自动签发见下文第五节然后由 Nginx 配置模板完成监听与证书装载。在 backend/templates/_listen.conf 中可以看到监听端口的生成逻辑listen 80; {% if certificate -%} listen 443 ssl; {% endif %} server_name {{ domain_names | join: }}; {% if http2_support 1 or http2_support true %} http2 on; {% else -%} http2 off; {% endif %}也就是说只有关联了证书才会监听 443 端口并启用 SSL同时http2_support决定是否启用 HTTP/2。而强制 SSL把 HTTP 请求 301 跳转到 HTTPS由 backend/templates/_forced_ssl.conf 控制当配置了有效证书且ssl_forced开启时会引入conf.d/include/force-ssl.conf实现跳转。代理服务的关键配置字段详解在 Nginx Proxy Manager 的代理服务编辑界面中除了上述转发四要素还有一系列可选项。结合 proxy-host-object.json 与数据模型 backend/models/proxy_host.js其中boolFields定义了布尔字段列表整理如下字段类型作用ssl_forced布尔是否强制将所有 HTTP 请求跳转到 HTTPScaching_enabled布尔是否启用缓存对应_assets.conf引入的静态资源缓存逻辑block_exploits布尔是否启用常见攻击特征拦截对应_exploits.confallow_websocket_upgrade布尔是否允许 WebSocket 升级。开启后 Nginx 会配置Upgrade/Connection头并启用 HTTP/1.1http2_support布尔是否启用 HTTP/2hsts_enabled/hsts_subdomains布尔是否启用 HSTS 响应头以及是否覆盖子域名trust_forwarded_proto布尔是否信任X-Forwarded-Proto等转发头影响强制 SSL 的判断逻辑access_list_id整数关联访问控制列表实现基于 IP / 认证的访问限制advanced_config字符串自定义 Nginx 配置片段会插入到server块中locations数组自定义转发路径location块可对同一域名下的不同路径转发到不同后端meta对象运行时元信息例如nginx_online、nginx_errWebSocket 升级的模板实现当allow_websocket_upgrade开启时backend/templates/proxy_host.conf 会在server块和默认location /块中分别注入proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_http_version 1.1;这一能力让代理服务可以直接代理 WebSocket / SSE 类实时应用无需额外手工配置。代理服务如何生成 Nginx 配置源码级原理创建或更新一个代理服务后Nginx Proxy Manager 并不会直接使用你的表单数据而是经历一条完整的后端调用链位于 backend/internal/proxy-host.js 的create/update方法权限校验通过access.can(proxy_hosts:create / proxy_hosts:update, ...)检查当前用户是否有操作权限。域名冲突检测对domain_names中每个域名调用internalHost.isHostnameTaken()如果与其他主机代理、重定向、流媒体等重复则抛出ValidationError提示xxx is already in use。数据落库将配置写入proxy_host表模型见 backend/models/proxy_host.js其中domain_names、meta、locations为 JSON 字段布尔字段在读写时自动转换。生成 Nginx 配置调用internalNginx.configure(proxyHostModel, proxy_host, row)用 backend/templates/proxy_host.conf 渲染出对应域名的主机配置文件并执行nginx -t校验。审计日志写入created/updated/enabled/disabled/deleted等操作记录见 backend/internal/audit-log.js。主模板proxy_host.conf的核心结构如下已简化server { set $forward_scheme {{ forward_scheme }}; set $server {{ forward_host }}; set $port {{ forward_port }}; # 监听、证书、HSTS、强制 SSL、缓存、攻击拦截等按需 include access_log /data/logs/proxy-host-{{ id }}_access.log proxy; error_log /data/logs/proxy-host-{{ id }}_error.log warn; {{ advanced_config }} {{ locations }} location / { # 访问控制、HSTS、WebSocket 升级 include conf.d/include/proxy.conf; # 真正的 proxy_pass 转发 } # 自定义 include /data/nginx/custom/server_proxy[.]conf; }可以看到转发变量$forward_scheme、$server、$port在此被赋值最终由proxy.conf中的proxy_pass $forward_scheme://$server:$port$request_uri;完成实际转发而advanced_config、locations则被直接渲染进server块实现高级配置与自定义路径能力。同时# Custom注释还揭示了另一个扩展点管理员可以把自定义配置放到/data/nginx/custom/server_proxy.conf该文件会被自动 include 进每个代理服务。创建代理服务的两种方式界面与 API界面操作Web UI在仪表盘左侧菜单进入Hosts → Proxy Hosts点击Add Proxy Host打开创建表单表单组件见 frontend/src/modals/ProxyHostModal.tsx填写Domain Names要代理的域名支持通配符如*.example.com。Forward Hostname / IP Forward Port Scheme后端地址与协议。SSL 选项卡选择已有证书或选择 Request a new SSL Certificate 自动申请HTTP 或 DNS 验证。高级选项卡WebSocket 支持、访问列表、HSTS、高级配置等。保存后即可在列表页看到新主机Nginx 配置随之生成并热加载。API 方式代理服务的完整 REST 接口定义在 backend/routes/nginx/proxy_hosts.js请求体模式位于 backend/schema/paths/nginx/proxy-hosts/post.json。一个典型的创建请求体{ domain_names: [app.example.com], forward_scheme: http, forward_host: 127.0.0.1, forward_port: 8080, access_list_id: 0, certificate_id: 0, ssl_forced: false, caching_enabled: false, block_exploits: false, allow_websocket_upgrade: true, http2_support: false, hsts_enabled: false, hsts_subdomains: false, advanced_config: , meta: { letsencrypt_agree: false }, locations: [], enabled: true }值得注意的一个细节当certificate_id传入字符串new时源码中const createCertificate thisData.certificate_id new后端会在保存主机后调用internalCertificate.createQuickCertificate()自动签发证书并把新证书 ID 回填到主机上——这正是界面中同时申请证书选项的底层实现。启停与删除每个代理服务都支持enable / disable操作启用时重新生成 Nginx 配置禁用时删除配置并执行nginx reload见 proxy-host.js 中的enable/disable。删除则是软删除is_deleted: 1同时删除对应 Nginx 配置并 reload。权限与多用户支持代理服务支持细粒度的权限控制。后端通过 backend/lib/access/proxy_hosts-create.json、proxy_hosts-update.json、proxy_hosts-get.json、proxy_hosts-list.json、proxy_hosts-delete.json等文件定义各操作的权限要求管理员admin 角色拥有全部操作权限普通用户需要拥有permission_proxy_hosts权限其中创建 / 更新 / 删除要求manage级权限查看 / 列表只需view级权限。此外非管理员用户在查询时还会按owner_user_id过滤只能看到自己创建的代理服务见get/getAll中的permission_visibility ! all分支从而实现多用户环境下的数据隔离。审计日志则会记录每次创建、更新、启停与删除的完整元数据。代理服务与其它主机类型的区别在 Nginx Proxy Manager 中主机不止代理服务一种理解它们的差异有助于正确选型主机类型用途后端源码 / 模板代理服务Proxy Host反向代理到后端应用支持 SSL 终止backend/internal/proxy-host.js / proxy_host.conf重定向主机Redirection Host将域名 301/302 跳转到另一个地址backend/internal/redirection-host.js404 主机Dead Host为未匹配的域名返回自定义 404 页面backend/internal/dead-host.js流媒体主机Stream基于 TCP/UDP 的四层流量转发如数据库、游戏服务backend/internal/stream.js代理服务是唯一面向HTTP(S) 应用、同时提供证书管理与 SSL 终止的通用型主机如果你的需求是把一个 Web 服务安全地暴露到公网它始终是首选方案。小结代理服务Proxy Host是 Nginx Proxy Manager 的核心模块它以域名 转发目标 可选证书的简洁模型把复杂的 Nginxserver/location/proxy_pass配置封装成可视化操作。理解其背后 proxy_host.conf 模板的渲染机制、proxy_pass变量的赋值链路以及 backend/internal/proxy-host.js 中域名校验、快速签发证书、权限与审计的完整流程将帮助你更准确地配置代理服务也能在遇到问题时快速定位根因。【免费下载链接】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),仅供参考
返回列表