请教下 nginx 反代配置

1 天前
 andyfan

我想自建一个 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;
	}
996 次点击
所在节点    NGINX
13 条回复
wyd011011daniel
1 天前
试试问问 gpt4o ? ”root /var/www/html; # 注意这里用 root 而非 alias “我刚刚搜的
jsutfun
1 天前
给我 ssh 我上去看看,是不是 alias /var/www/html 改成这样
andyfan
1 天前
@wyd011011daniel 感谢, GPT 的 nginx 配置经常胡说八道, 我尝试了没问出有用的回答

@jsutfun 是一台只有 ipv6 的机器, 你有 v6 的话发下公钥我给你加上
X-Force
1 天前
你还需要转发 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;
}
Ipsum
1 天前
你应该需要 stream 代理模块,而不是 proxy 。
xqzr
1 天前
反代 HTTPS 可能需要发送 SNI
proxy_ssl_server_name on;
andyfan
23 小时 53 分钟前
谢谢各位, 可能我没有表达清楚问题. 目前反代回源的部分是正常的, 我的问题是希望直接访问域名根路径的时候( http://docker.aaaa.com/), 能被`location = / {`捕获, 从而返回 index.html 文件. 在访问其他路径的时候(比如 http://docker.aaaa.com/v2)才反代到 docker.io 处理.

但实际上是所有请求都走了反代, 导致 http://docker.aaaa.com/请求也被送到了 docker.io 处理
smallparking
23 小时 42 分钟前
@andyfan 不对吧,你这个 location 规则没问题
404 是不是有可能是你的 nginx 文件没有读取权限之类的?
smallparking
23 小时 40 分钟前
@smallparking 看一下 404 的请求的 error_log 就知道 404 的原因了
naoying
23 小时 35 分钟前
我用你的配置文件验证了,没问题


location = / {
add_header Cache-Control private;
return 301 https://www.google.com;
}
jsutfun
23 小时 34 分钟前
@andyfan #3 这么狠么哈哈哈哈哈哈哈哈
liuliancao
3 小时 11 分钟前
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;
}
aarontian
2 小时 41 分钟前
@andyfan 你要反代 /v2 的请求应该是单独配置一个 location=/v2/ 的 alias 吧,而不是把整个/都配置掉

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1097996

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX