V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
andyfan
V2EX  ›  NGINX

请教下 nginx 反代配置

  •  
  •   andyfan · 22 小时 54 分钟前 · 969 次点击

    我想自建一个 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;
    	}
    
    13 条回复    2024-12-17 17:58:52 +08:00
    wyd011011daniel
        1
    wyd011011daniel  
       22 小时 49 分钟前
    试试问问 gpt4o ? ”root /var/www/html; # 注意这里用 root 而非 alias “我刚刚搜的
    jsutfun
        2
    jsutfun  
       22 小时 44 分钟前
    给我 ssh 我上去看看,是不是 alias /var/www/html 改成这样
    andyfan
        3
    andyfan  
    OP
       22 小时 40 分钟前
    @wyd011011daniel 感谢, GPT 的 nginx 配置经常胡说八道, 我尝试了没问出有用的回答

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

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


    location = / {
    add_header Cache-Control private;
    return 301 https://www.google.com;
    }
    jsutfun
        11
    jsutfun  
       21 小时 35 分钟前
    @andyfan #3 这么狠么哈哈哈哈哈哈哈哈
    liuliancao
        12
    liuliancao  
       1 小时 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
        13
    aarontian  
       41 分钟前
    @andyfan 你要反代 /v2 的请求应该是单独配置一个 location=/v2/ 的 alias 吧,而不是把整个/都配置掉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3667 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:40 · PVG 18:40 · LAX 02:40 · JFK 05:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.