关于反向代理,求助

最近在使用nginx proxy manager ,现在我遇到了反代错误的问题 。准确的说我的服务器上的80端口绑定了vaultbiten,但是反代本服务器上其他端口的不同程序时,永远只会进入80端口的程序,我开了泛域名解析,使用二级域名访问的不同服务。
之后我尝试换成caddy,结果还是一样的,不论用哪个子域名反代了哪个端口,永远只会访问处于80端口的服务。甚至caddy的证书好像还没生效,我也不知道caddyfile有没有写对,毕竟没有错误提示。

把密码绑定的80取消,让npm绑定80和443,然后npm设置转发到密码服务端口

你需要把配置文件贴出来才能判断哇。正常进行http80端口,https443端口。我运行正常的一个Caddyfile配置文件,和你想要实现的功能差不多,无任何路径,默认访问chat学术版。子域名实现其他服务反向代理,逻辑就是pan.example.com 首先访问443端口进行路径匹配,然后转发到本机的相应端口(5244)。链接在docker caddy

# Path:/home/test/CaddyWeb/Caddyfile
{
	order reverse_proxy before route
	admin off
	log {
		output file /var/log/caddy/access.log {
			roll_size 100mb
			roll_keep 5
			roll_keep_for 4320h
		}
	}
  #证书自动申请续期。
	acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}

# 泛域名设置
*.{$SERVER_NAME} {$SERVER_NAME} {
	#root * /var/www/html
	file_server
	encode gzip

	@root host {$SERVER_NAME}
  # 从上往下模式匹配,默认则为最后一项: aria2c: https://example.com/jsonrpc 端口号为443不为6800;
  # 
	handle @root {
		reverse_proxy /jsonrpc localhost:6800   		# aria2c 配置设置
		reverse_proxy /Seick localhost:65178     # 奇怪的伪装Path的服务
		reverse_proxy /frac localhost:27015      # 异星工厂服务器
		reverse_proxy localhost:22303 # chagpt
	}
  # 此处注意标签@pan ,访问网址为 pan.example.com,需要提前解析pan 子域名
	@pan host pan.{$SERVER_NAME}
	handle @pan {
		reverse_proxy localhost:5244  #Alist服务
	}
	@latex host latex.{$SERVER_NAME}
	handle @latex {
		reverse_proxy localhost:8085   # latex服务
	}

	@admin host admin.{$SERVER_NAME}
	handle @admin {
		reverse_proxy localhost:38574         #1panel服务
	}
	@rss host rss.{$SERVER_NAME}
	handle @rss {
		reverse_proxy localhost:8080     #freshrss
	}
}

佬友能帮我看看我的配置吗?我在5001端口部署了dockge,然后在docker里面部署了caddy,然后想让域名绑定到5001端口,结果我访问的时候就显示caddy默认的那个界面,没有我的5001端口的网站

example.com {
        reverse_proxy localhost:5001
}

这个可能是因为caddyfile没有配置好,目前看不出来啥。排查过程为 检查5001端口 能否ip正常访问(就是ssh 转发5001然后观察服务是否正常启动。) 然后检查 caddyfile 里面写一个简单的hellow world 文件。

刚尝试了一下好像就是配置文件没生效。访问之后还是显示Caddy默认的欢迎界面。

xxx.example.com {
    respond "Hello, World!" 200
}

这是我写的配置文件,是不是因为我的caddy部署在docker里面的原因?佬友这是我的compose.yml

version: "3.7"
services:
  caddy:
    image: caddy:latest
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
    volumes:
      - $PWD/Caddyfile:/opt/stacks/caddy/Caddyfile
      - $PWD/site:/srv
      - caddy_data:/data
      - caddy_config:/config
volumes:
  caddy_data:
    external: true
  caddy_config: null
networks:
  default:
    driver: bridge

推荐使用host模式,因为桥接模式此时localhost 是 cddy内部的ip,而不是原本主机的ip。 之前的教程

还是不行大佬,我换成host重启之后我访问我的域名还是显示caddy的默认界面;

root@iZj6c6kdpskhllga6bn6ieyeaZ:/opt/stacks/caddy# docker exec -it caddy-caddy-1 cat /opt/stacks/caddy/Caddyfile
dockge.example.com{
    respond "Hello, World!" 200
}
root@iZj6c6kdpskhllga6bn6ieyeaZ:/opt/stacks/caddy# 

你这个很明显挂载没对,文件没更新 docker需要重新更新哇

建议你不如直接使用系统地caddy就好, 二进制安装,不使用systemd 直接 caddy run --config Path -w 边修改文件边调试,打印log,申请80和443需要启用sudo 权限

我这挂载路径是我自己设置的,docker-compose我也更新了,都是我更新完重启的。

version: "3.7"
services:
  caddy:
    image: caddy:latest
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
    volumes:
      - $PWD/Caddyfile:/opt/stacks/caddy/Caddyfile
      - $PWD/site:/srv
      - caddy_data:/data
      - caddy_config:/config
volumes:
  caddy_data:
    external: true
  caddy_config: null
networks:
  default:
    driver: host

你这个还是桥接模式,注意看我教程里面的配置文件写法

# Path:/home/test/CaddyWeb/docker-compose.yaml
services:
  caddy:
    image: ghcr.io/caddybuilds/caddy-cloudflare:latest
    restart: unless-stopped
    env_file:
      - $PWD/.env
    cap_add:
      - NET_ADMIN
    network_mode: host
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile
      - $PWD/access.log:/var/log/caddy/access.log
      - $PWD/caddy_data:/data/caddy

已经使用了host 和 ports 就是冲突的。 另外以下几点:

  1. 如果是最新版本的docker 已经去掉了version 了,那部分不用写。
  2. 容器内部何必需要自定义路径名称, /opt 完全是冗余的,还可能会报错,因为默认的caddy 配置文件是 /etc/caddy/Caddfile
  3. caddy 作为容器的 好处也就一般,感觉不如直接系统级别的安装(host类似),docker 不容易调试,反而有麻烦。caddy run -c Path -w 自动重载文件,也很方便,调试照log文件之类的。

谢谢大佬,请问我想使用Caddy反代的话是不是意味着我其他的服务也需要使用这种network_mode: host模式

你还是没有看我之前发的相应的链接链接(使用docker搭建服务简易教程(caddy反代,自动SSL、泛域名证书、反代配置各类服务)),其他服务没有任何关系emm。 docker设置的caddy和系统下的caddy区别不太大,我认为后者更好一些,在于调试log都方便。

host意味着caddy 的网络栈和本地主机结合在一起。docker inspect caddy 显示暴露出80,443,2019端口,nginx和caddy某种角度:arrow_up:来说是二选一。 至于你其他的服务,当然不用host模式,只需要桥接即可。

docker 网络栈不太熟练吧,另外你之前提供的docker compose 压根就运行不起来,理论上 ports 和 host就是冲突的。

这个我感觉没有那么复杂呀。

我现在的compose.yml是这样, caddy我看也运行起来了, 之所以使用docker来装就是因为想熟悉熟悉docker,佬友的教程我也看了,感觉并没有跟现在这种情况相关的或许也可能是我没看懂,毕竟有些知识是隐形的,现在还是访问域名出现的是caddy默认的欢迎界面,这个可以说明caddy已经运行起来了,只不过没有代理成功:

version: "3.7"
services:
  caddy:
    image: caddy:latest
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
    volumes:
      - $PWD/Caddyfile:/opt/stacks/caddy/Caddyfile
      - $PWD/site:/srv
      - caddy_data:/data
      - caddy_config:/config
    network_mode: host
volumes:
  caddy_data:
    external: true
  caddy_config: null

这个是我dockge的compose:

services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    ports:
      # Host Port : Container Port
      - 5001:5001
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data

      # If you want to use private registries, you need to share the auth file with Dockge:
      # - /root/.docker/:/root/.docker

      # Stacks Directory
      # ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH.
      # ⚠️ 1. FULL path only. No relative path (MUST)
      # ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST)
      - /opt/stacks:/opt/stacks
    environment:
      # Tell Dockge where is your stacks directory
      - DOCKGE_STACKS_DIR=/opt/stacks
~                                            

Caddyfile:

dockge.example.com{
      tls [email protected]
      reverse_proxy  localhost:5001 {
        trusted_proxies private_ranges
      }
}

注释掉 ports 呀,兄弟,提示过了 ports 和 host 是冲突的。按理说根本运行不起来,另外缓存要清理的哇。

也提示过了另外一点,就是caddyfile docker默认设置是 /etc/caddy/caddyfile,你自己自定义路径要用自定义设置。

如果你运行了 docker inspect caddy ,一定回发现一个 command 命令,那就是 运行的原始命令,你自定义了就要在docker-compase.yaml 文件当中添加一个 command 的部分。你的配置文件可以好好对一下,我提供了源代码的。

修改意见:

  1. caddy 路径 /opt那个修改为 /etc/caddy/Caddyfile 或者 增加 command: caddy run -c /opt地玩意。

  2. 注释80和443

  3. 你的服务里面不建议使用 5001:5001,修改成 127.0.01:5001:5001,安全起见。

如果可能,请按照教程配置文件搭建好。你修改配置文件需要建立在:o:配置文件了解基础之上,

caddy没用过 npm用过
帮不上忙了 看楼上佬的吧

我说一下别的吧
网络流量从外网到你的路由器或云服务器的外网端口,然后外网端口再走到你的反代软件的监听端口,然后通过二级域名分到你的内网服务的端口,要先搞懂这个再挨个排查