我正试着和码头建立geoserver和traefik,但是在路径上有问题。
Geoserver的主要入口点在/geoserver,但我希望在域的根路径上访问它,比如example.com。下面是我放在一起的docker-compose文件:
version: "3"
services:
traefik:
image: traefik:2.4
restart: unless-stopped
networks:
- web
ports:
- 80:80
- 443:443
command:
- --log.level=DEBUG
- --providers=docker
- --providers.docker.network=geoserver_web
- --entrypoints.websecure.address=:443
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=websecure
# - --api.dashboard=true
- --certificatesresolvers.lets-encrypt.acme.email=admin@example.com
- --certificatesresolvers.lets-encrypt.acme.storage=acme.json
- --certificatesresolvers.lets-encrypt.acme.tlschallenge=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
geoserver:
image: oscarfonts/geoserver:latest
restart: unless-stopped
networks:
- web
labels:
- traefik.port=8080
- traefik.http.routers.geoserver.rule=Host(`example.com`)
- traefik.http.routers.geoserver.entrypoints=websecure
- traefik.http.routers.geoserver.tls=true
- traefik.http.routers.geoserver.tls.certresolver=lets-encrypt
- traefik.http.middlewares.geoserver.replacepathregex.regex=(.*)
- traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$1
networks:
web:在浏览了traefik文档之后,我认为在geoserver服务上使用replacepathregex应该在传递给geoserver的所有请求的路径上优先使用/geoserver,并且应该使服务在example.com上可用,而不是example.com/geoserver,但是它没有工作。
我也尝试过addPrefix,但这也不起作用。
配置不正确吗?还是我对那些中间人的理解?是否有一种方法可以将我的服务配置为可在example.com访问,而不是example.com/geoserver
发布于 2021-08-23 18:04:32
原来问题是我的traefik配置!我需要将中间件添加到geoserver路由器。下面是更新的docker-compose.yml (我使用的是addprefix而不是replacepathregex,因为后者太过了):
version: "3"
services:
traefik:
image: traefik:2.4
restart: unless-stopped
networks:
- web
ports:
- 80:80
- 443:443
command:
- --log.level=DEBUG
- --providers=docker
- --providers.docker.network=geoserver_web
- --entrypoints.websecure.address=:443
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=websecure
# - --api.dashboard=true
- --certificatesresolvers.lets-encrypt.acme.email=admin@example.com
- --certificatesresolvers.lets-encrypt.acme.storage=acme.json
- --certificatesresolvers.lets-encrypt.acme.tlschallenge=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
geoserver:
image: oscarfonts/geoserver:latest
restart: unless-stopped
networks:
- web
labels:
- traefik.http.middlewares.add-geoserver-prefix.addprefix.prefix=/geoserver
- traefik.port=8080
- traefik.http.routers.geoserver.rule=Host(`example.com`)
- traefik.http.routers.geoserver.entrypoints=websecure
- traefik.http.routers.geoserver.tls=true
- traefik.http.routers.geoserver.tls.certresolver=lets-encrypt
- traefik.http.routers.geoserver.middlewares=add-geoserver-prefix@docker
networks:
web:发布于 2021-08-21 02:09:23
关于ReplacePathRegex:配置示例,Docker选项卡,它提到如下示例:
# Replace path with regex
labels:
- "traefik.http.middlewares.test-replacepathregex.replacepathregex.regex=^/foo/(.*)"
- "traefik.http.middlewares.test-replacepathregex.replacepathregex.replacement=/bar/$$1"连同以下引文
我使用Regex101来测试和确保上面的样例配置,并进行扩展,这样我们就可以实现我们的需求,如下所示。
测试用例1
/foo/(.*) (注:这里没有前导插入符号^ )https://my.domain.com/foo/api/bar/$1 (注:这里有一美元唱$,请稍后解释)https://my.domain.com/bar/api测试用例2
/foo/(.*)https://my.domain.com/foo/api/$1https://my.domain.com/api测试用例3: geoserver第1轮
(.*)/(.*)https://my.domain.com/api$1/geoserver/$2https://my.domain.com/geoserver/api测试用例4: geoserver第2轮
(.*)/(.*)https://my.domain.com/api/geoserver/$2/geoserver/api侧边栏1:为什么我们需要双元唱歌($$)?
因为docker-compose以$VARIABLE和${VARIABLE}的形式提供变量替换,所以美元符号是一个key word / reserved word,我们必须避开它,使我们在docker-compose.yml中使用美元歌唱($$)。详情请参阅StackOverflow 问题和回答。
侧栏2:前导插入符(^)
经过一段时间的试验和错误之后,我意识到有一点不同,因为Traefik需要前导插入符,而Regex101不需要。到目前为止,我仍然不知道为什么是这样,我记得是这样的:
总结
要通过遵循测试用例4实现我们的需求,docker-compose标签应该如下所示
labels:
- traefik.http.middlewares.geoserver.replacepathregex.regex=^(.*)/(.*) # <-- the leading caret
- traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$2编辑1
测试用例5: geoserver第3轮
^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?/(.*)$https://my.domain.com/path- Substitution: `/geoserver/$4`
- The result: `/geoserver/path`https://my.domain.com/path/to- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to`https://my.domain.com/path/to/api- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to/api`https://my.domain.com/path/to/api?key=value- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to/api?key=value`https://my.domain.com/path/to/api?key=value&anotherkey=anothervalue- Substitution: `/geoserver/$4`
- The result: `/geoserver/path/to/api?key=value&anotherkey=anothervalue`总结
为了实现我们的需求,应该遵循测试用例5,docker-compose标签,如下所示
labels:
- traefik.http.middlewares.geoserver.replacepathregex.regex=^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?/(.*)$$ # <-- the leading caret and double dollar sign at the end
- traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$4https://stackoverflow.com/questions/68867660
复制相似问题