我想自建一个 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 5 天前
试试问问 gpt4o ? ”root /var/www/html; # 注意这里用 root 而非 alias “我刚刚搜的
|
2
jsutfun 5 天前
给我 ssh 我上去看看,是不是 alias /var/www/html 改成这样
|
3
andyfan OP |
4
X-Force 5 天前
你还需要转发 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 5 天前
你应该需要 stream 代理模块,而不是 proxy 。
|
6
xqzr 5 天前
反代 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 5 天前 via Android
@andyfan 不对吧,你这个 location 规则没问题
404 是不是有可能是你的 nginx 文件没有读取权限之类的? |
9
smallparking 5 天前 via Android
@smallparking 看一下 404 的请求的 error_log 就知道 404 的原因了
|
10
naoying 5 天前
我用你的配置文件验证了,没问题
location = / { add_header Cache-Control private; return 301 https://www.google.com; } |
12
liuliancao 4 天前
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; } |
14
andyfan OP @liuliancao 老哥你的分析思路太赞了, 改用 try_files 以后确实解决了问题, 感谢!
|