本站支持搜索的镜像仓库:Docker Hub、gcr.io、ghcr.io、quay.io、k8s.gcr.io、registry.gcr.io、elastic.co、mcr.microsoft.com

nginx - proxy 运行一个包含 Nginx 和 [docker - gen][1] 的容器。docker - gen 会为 Nginx 生成反向代理配置,并在容器启动或停止时重新加载 Nginx。
了解[为什么需要使用此工具][2]。
!latest 0.8.0 !nginx 1.19.3 !License MIT   
nginx - proxy 提供两种镜像变体:
基于 debian:jessie 的 Nginx 镜像。
$ docker pull jwilder/nginx - proxy:latest
基于 nginx:alpine 镜像,完全支持 HTTP/2(包括最新 Chrome 版本所需的 ALPN)。使用时需配合有效的证书(详见下文“使用 Let's Encrypt 实现 SSL 支持”)。
$ docker pull jwilder/nginx - proxy:alpine
启动 nginx - proxy 容器:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx - proxy
然后启动需要被代理的容器,并设置环境变量 VIRTUAL_HOST=subdomain.youdomain.com:
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
被代理的容器必须通过 Dockerfile 的 EXPOSE 指令或 docker run/docker create 的 --expose 标志暴露(expose)需要代理的端口,且需处于同一网络。默认情况下,若创建 nginx - proxy 容器时未指定 --net 标志,它仅连接到默认的 bridge 网络,因此无法代理其他网络中的容器。
确保 DNS 配置将 foo.bar.com 转发到运行 nginx - proxy 的主机,请求将被路由到设置了 VIRTUAL_HOST 环境变量的容器。
version: '2' services: nginx - proxy: image: jwilder/nginx - proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro whoami: image: jwilder/whoami environment: - VIRTUAL_HOST=whoami.local
启动服务:
$ docker - compose up
测试访问:
$ curl -H "Host: whoami.local" localhost I'm 5b129ab83266
通过环境变量 VIRTUAL_HOST 指定容器对应的虚拟主机,支持多个主机(用逗号分隔),例如:VIRTUAL_HOST=foo.bar.com,baz.bar.com。
若容器暴露多个端口,nginx - proxy 默认使用 80 端口。通过 VIRTUAL_PORT 环境变量可指定其他端口,例如:VIRTUAL_PORT=3000。若容器仅暴露一个端口且设置了 VIRTUAL_HOST,则自动使用该端口。
默认情况下,nginx - proxy 仅连接到 bridge 网络。要代理其他网络中的容器,创建容器时需指定 --net=my - network,并可通过 docker network connect 连接到其他网络:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro \ --name my - nginx - proxy --net my - network jwilder/nginx - proxy $ docker network connect my - other - network my - nginx - proxy
通过设置环境变量 ENABLE_IPV6=true 启用 IPv6 支持:
$ docker run -d -p 80:80 -e ENABLE_IPV6=true -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx - proxy
设置默认主机,当请求未匹配任何 VIRTUAL_HOST 时使用:
$ docker run -d -p 80:80 -e DEFAULT_HOST=foo.bar.com -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx - proxy
支持主机名开头或结尾的通配符,例如 *.bar.com 或 foo.bar.*,也支持正则表达式(需以 ~ 开头),如 ~^foo\.bar\..*\.xip\.io 可匹配 foo.bar.127.0.0.1.xip.io 等。更多信息见 nginx server_names 文档。
若需通过 HTTPS 连接后端,在后端容器设置 VIRTUAL_PROTO=https。注意:若后端同时暴露 80 和 443 端口,需配合 VIRTUAL_PORT=443,否则默认使用 80 端口的 HTTPS,这通常不符合预期。
设置 VIRTUAL_PROTO=uwsgi,后端容器需监听端口并暴露该端口(而非 socket)。
设置 VIRTUAL_PROTO=fastcgi,后端容器需监听端口并暴露该端口(而非 socket)。通过 VIRTUAL_ROOT=xxx 指定 FastCGI 的根目录。
通过设置后端容器的 NETWORK_ACCESS=internal 环境变量,可限制其仅允许内网访问(默认内网定义为 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)。自定义内网范围需挂载文件到 nginx - proxy 的 /etc/nginx/network_internal.conf,内容示例:
# 定义为内网的网络 allow 127.0.0.0/8; allow 10.0.0.0/8; allow 192.168.0.0/16; allow 172.16.0.0/12; # 拒绝其他网络流量 deny all;
启用内网访问限制后,外部客户端将收到 HTTP 403 Forbidden 响应。
若 nginx - proxy 前有负载均衡器/反向代理隐藏客户端 IP(如 AWS ALB),需使用 nginx 的 realip 模块(已预装)提取客户端 IP,配置可添加到
/etc/nginx/conf.d/目录下的文件中。详见 nginx realip 模块文档。
启用 SSL 需挂载证书目录:
$ docker run -d -p 80:80 -p 443:443 -v /path/to/certs:/etc/nginx/certs -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx - proxy
证书和私钥需按虚拟主机名命名,格式为 <virtual_host>.crt 和 <virtual_host>.key,例如 VIRTUAL_HOST=foo.bar.com 对应 foo.bar.com.crt 和 foo.bar.com.key。
letsencrypt - nginx - proxy - companion 是 nginx - proxy 的轻量级 companion 容器,可自动创建/续期 Let's Encrypt 证书。设置 DHPARAM_GENERATION=false 可禁用 Diffie - Hellman 参数生成(默认 true):
$ docker run -e DHPARAM_GENERATION=false ....
默认启用 Diffie - Hellman(DH)参数,预生成的 dhparam.pem 位于 /etc/nginx/dhparam/dhparam.pem。可挂载自定义文件覆盖,或按虚拟主机命名为 <virtual_host>.dhparam.pem。生成新参数可能耗时数分钟,首次启动时在后台低优先级进行。
DHPARAM_GENERATION=falseDHPARAM_BITS=1024(默认 2048,低位数兼容旧客户端如 Java 6/7)分离容器部署时,需手动生成 DH 参数并挂载到 Nginx 容器的
/etc/nginx/dhparam/dhparam.pem。
通配符证书命名为域名的主域,例如 *.bar.com 证书对应 bar.com.crt 和 bar.com.key。
多域名证书可通过 CERT_NAME=<name> 指定证书名,例如共享证书 shared.crt/shared.key,后端容器设置 CERT_NAME=shared 即可使用。
为域名启用 OCSP 装订,需在证书目录放置包含 CA 证书链的 PEM 文件 <domain>.chain.pem(中间 CA 到根 CA 的拼接),nginx - proxy 将其用于 ssl_trusted_certificate 指令并启用 OCSP 装订。
默认 SSL 密码套件基于 Mozilla Intermediate 配置文件(版本 5.0),兼容 Firefox 27+、Android 4.4.2+ 等。设置 SSL_POLICY=Mozilla-Modern 可使用 Modern 配置文件(兼容 Firefox 63+、Android 10.0+ 等,不兼容 IE)。其他可用策略包括 Mozilla-Old 及 AWS ELB 策略(如 AWS-TLS-1-2-2017-01)。
默认行为:若容器有有效证书,80 端口请求重定向到 443;无证书则返回 503。通过 HTTPS_METHOD 自定义:
redirect(默认):HTTP 重定向到 HTTPSnoredirect:同时支持 HTTP 和 HTTPS,不重定向nohttp:禁用 HTTPnohttps:禁用 HTTPS可在 nginx - proxy 容器(全局)或后端容器(单个)设置。使用 noredirect 时 HSTS 自动禁用。
默认启用 HSTS(HTTP Strict Transport Security),max - age=31536000。通过 HSTS=off 禁用,或自定义如 HSTS=max - age=31536000; includeSubDomains; preload。
添加 /etc/nginx/proxy.conf 文件可替换默认代理配置,默认配置示例:
# HTTP 1.1 支持 proxy_http_version 1.1; proxy_buffering off; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $proxy_connection; 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 $proxy_x_forwarded_proto; proxy_set_header X - Forwarded - Ssl $proxy_x_forwarded_ssl; proxy_set_header X - Forwarded - Port $proxy_x_forwarded_port; # 缓解 httpoxy 攻击 proxy_set_header Proxy "";
在 /etc/nginx/conf.d/ 添加 .conf 文件(如 my_proxy.conf),可添加全局配置,例如:
FROM jwilder/nginx - proxy RUN { echo 'server_tokens off;'; echo 'client_max_body_size 100m;'; } > /etc/nginx/conf.d/my_proxy.conf
或挂载文件:
$ docker run -d -p 80:80 -v /path/to/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro ... jwilder/nginx - proxy
在 /etc/nginx/vhost.d/ 添加与 VIRTUAL_HOST 同名的文件,例如 app.example.com。多主机可使用符号链接共享配置。
/etc/nginx/vhost.d/default 文件为未指定单独配置的虚拟主机提供默认设置。
添加 <VIRTUAL_HOST>_location 文件(如 app.example.com_location)可配置 location 块。默认配置文件为 default_location。
为虚拟主机启用基本认证,需在 /etc/nginx/htpasswd/ 目录创建与 VIRTUAL_HOST 同名的文件。使用 apache2 - utils 生成凭证:
$ docker run -d -p 80:80 -p 443:443 \ -v /path/to/htpasswd:/etc/nginx/htpasswd \ -v /path/to/certs:/etc/nginx/certs \ -v /var/run/docker.sock:/tmp/docker.sock:ro \ jwilder/nginx - proxy $ htpasswd -c /path/to/htpasswd/foo.bar.com user
可将 nginx - proxy 拆分为 Nginx 和 docker - gen 两个容器运行,避免将 docker socket 绑定到暴露的服务。需准备 nginx.tmpl 模板文件。
$ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx
$ docker run --volumes-from nginx \ -v /var/run/docker.sock:/tmp/docker.sock:ro \ -v $(pwd):/etc/docker - gen/templates \ -t jwilder/docker - gen -notify-sighup nginx -watch /etc/docker - gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
提交 PR 或 issue 前,请先检查 GitHub 确保不存在重复。
构建测试镜像:
docker build -t jwilder/nginx - proxy:test . # Debian 变体 # 或 docker build -f Dockerfile.alpine -t jwilder/nginx - proxy:test . # Alpine 变体
运行测试:
test/pytest.sh # 或 make test
使用问题请在 Q&A Group 提问。
[1]: [] - gen [2]: [] - nginx - reverse - proxy - for - docker/
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录方式配置轩辕镜像加速服务,包含7个详细步骤
在 Linux 系统上配置轩辕镜像源,支持主流发行版
在 Docker Desktop 中配置轩辕镜像加速,适用于桌面系统
在 Docker Compose 中使用轩辕镜像加速,支持容器编排
在 k8s 中配置 containerd 使用轩辕镜像加速
在宝塔面板中配置轩辕镜像加速,提升服务器管理效率
在 Synology 群晖NAS系统中配置轩辕镜像加速
在飞牛fnOS系统中配置轩辕镜像加速
在极空间NAS中配置轩辕镜像加速
在爱快ikuai系统中配置轩辕镜像加速
在绿联NAS系统中配置轩辕镜像加速
在威联通NAS系统中配置轩辕镜像加速
在 Podman 中配置轩辕镜像加速,支持多系统
配置轩辕镜像加速9大主流镜像仓库,包含详细配置步骤
无需登录即可使用轩辕镜像加速服务,更加便捷高效
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429