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 镜像。
bash$ docker pull jwilder/nginx - proxy:latest
基于 nginx:alpine 镜像,完全支持 HTTP/2(包括最新 Chrome 版本所需的 ALPN)。使用时需配合有效的证书(详见下文“使用 Let's Encrypt 实现 SSL 支持”)。
bash$ docker pull jwilder/nginx - proxy:alpine
启动 nginx - proxy 容器:
bash$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx - proxy
然后启动需要被代理的容器,并设置环境变量 VIRTUAL_HOST=subdomain.youdomain.com:
bash$ 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 环境变量的容器。
yamlversion: '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
启动服务:
bash$ docker - compose up
测试访问:
bash$ 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 连接到其他网络:
bash$ 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 支持:
bash$ docker run -d -p 80:80 -e ENABLE_IPV6=true -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx - proxy
设置默认主机,当请求未匹配任何 VIRTUAL_HOST 时使用:
bash$ 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 需挂载证书目录:
bash$ 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):
bash$ 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 文件可替换默认代理配置,默认配置示例:
Nginx# 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),可添加全局配置,例如:
DockerfileFROM jwilder/nginx - proxy RUN { echo 'server_tokens off;'; echo 'client_max_body_size 100m;'; } > /etc/nginx/conf.d/my_proxy.conf
或挂载文件:
bash$ 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 生成凭证:
bash$ 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 模板文件。
bash$ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx
bash$ 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
bash$ docker run -e VIRTUAL_HOST=foo.bar.com ...
提交 PR 或 issue 前,请先检查 GitHub 确保不存在重复。
构建测试镜像:
bashdocker build -t jwilder/nginx - proxy:test . # Debian 变体 # 或 docker build -f Dockerfile.alpine -t jwilder/nginx - proxy:test . # Alpine 变体
运行测试:
bashtest/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 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429