
我想自建一个 docker 的镜像源, 写了个配置文件反代 registry-1.docker.io, 同时希望访问这个域名根路径的时候不要反代, 返回网站目录下的 index.html
但我的配置文件没有按照预期那样工作, 直接访问域名根路径的时候还是反代到了 registry-1.docker.io 导致返回 404, 希望有熟悉 nginx 的老哥帮忙看看, 这要怎么修改?
我的 server 配置如下
location = / { add_header Cache-Control private; alias /var/www/html/; index index.html; } location / { # Docker hub 的官方镜像仓库 proxy_pass https://registry-1.docker.io; proxy_set_header Host registry-1.docker.io; 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 $scheme; # 关闭缓存 proxy_buffering off; # 转发认证相关 proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; # 对 upstream 状态码检查,实现 error_page 错误重定向 proxy_intercept_errors on; recursive_error_pages on; # 根据状态码执行对应操作,以下为 381 、302 、387 状态码都会触发 error_page 301 302 307 = @handle_redirect; } 1 wyd011011daniel 2024-12-16 19:50:56 +08:00 试试问问 gpt4o ? ”root /var/www/html; # 注意这里用 root 而非 alias “我刚刚搜的 |
2 jsutfun 2024-12-16 19:56:25 +08:00 给我 ssh 我上去看看,是不是 alias /var/www/html 改成这样 |
3 andyfan OP |
4 X-Force 2024-12-16 20:17:06 +08:00 你还需要转发 auth.docker.io 来完成验证 # location 要多加这一段 location /token { resolver 8.8.8.8 valid=600s; proxy_pass https://auth.docker.io; proxy_set_header Host auth.docker.io; 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 $scheme; proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; proxy_buffering off; } |
5 Ipsum 2024-12-16 20:19:16 +08:00 你应该需要 stream 代理模块,而不是 proxy 。 |
6 xqzr 2024-12-16 20:33:48 +08:00 反代 HTTPS 可能需要发送 SNI proxy_ssl_server_name on; |
7 andyfan OP 谢谢各位, 可能我没有表达清楚问题. 目前反代回源的部分是正常的, 我的问题是希望直接访问域名根路径的时候( http://docker.aaaa.com/), 能被`location = / {`捕获, 从而返回 index.html 文件. 在访问其他路径的时候(比如 http://docker.aaaa.com/v2)才反代到 docker.io 处理. 但实际上是所有请求都走了反代, 导致 http://docker.aaaa.com/请求也被送到了 docker.io 处理 |
8 smallparking 2024-12-16 20:58:07 +08:00 via Android @andyfan 不对吧,你这个 location 规则没问题 404 是不是有可能是你的 nginx 文件没有读取权限之类的? |
9 smallparking 2024-12-16 20:59:23 +08:00 via Android @smallparking 看一下 404 的请求的 error_log 就知道 404 的原因了 |
10 naoying 2024-12-16 21:04:43 +08:00 我用你的配置文件验证了,没问题 location = / { add_header Cache-Control private; return 301 https://www.google.com; } |
12 liuliancao 2024-12-17 17:29:06 +08:00 error_log 开启 debug 可以看到里面又跳转到了 index.html 了,可以考虑用 try_files 这样就没跳转了 2024/12/17 17:25:18 [debug] 23691#23691: *63 generic phase: 13 2024/12/17 17:25:18 [debug] 23691#23691: *63 content phase: 14 2024/12/17 17:25:18 [debug] 23691#23691: *63 content phase: 15 2024/12/17 17:25:18 [debug] 23691#23691: *63 open index "/var/www/html/index.html" 2024/12/17 17:25:18 [debug] 23691#23691: *63 internal redirect: "/index.html?" 2024/12/17 17:25:18 [debug] 23691#23691: *63 rewrite phase: 1 try_files 参考 location = / { add_header Cache-Control private; alias /var/www/html/; try_files index.html $uri/index.html; } |
13 aarontian 2024-12-17 17:58:52 +08:00 @andyfan 你要反代 /v2 的请求应该是单独配置一个 location=/v2/ 的 alias 吧,而不是把整个/都配置掉 |
14 andyfan OP @liuliancao 老哥你的分析思路太赞了, 改用 try_files 以后确实解决了问题, 感谢! |