You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Titiler配置自定义root_path以适配现有Nginx配置?

问题描述

现有一个GeoNode实例,其Nginx使用官方的geonode.conf.envsubst配置文件。我希望添加Titiler上游服务,已编写如下Docker Compose文件:

version: '2.2'

services:
  titiler:
    image: ghcr.io/developmentseed/titiler:latest
    container_name: titiler
    environment:
      - PORT=8081
      - WORKERS_PER_CORE=1
      - TITILER_API_ROOT_PATH=/api/v1/titiler

同时配置了新的Nginx规则:

(...)
location /api/v1/titiler {
    set $upstream titiler:8081;
    proxy_pass http://$upstream;
    proxy_set_header HOST $host;
    proxy_set_header Referer $http_referer;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

问题在于,在Nginx容器内执行curl titiler:8081/api/v1/titiler时,返回{"detail":"Not Found"}。尽管在Titiler容器内通过代码from titiler.application.main import api_settings; print(api_settings.root_path)已确认root_path为"/api/v1/titiler",但Titiler似乎未正确使用该路径。由于该问题本质上与FastAPI相关,请问如何在现有服务器上正确配置Titiler?

解决方案

问题核心是Nginx代理路径与FastAPI root_path的匹配逻辑冲突,调整以下配置即可解决:

1. 修正Nginx代理规则

当前Nginx会把/api/v1/titiler开头的请求完整转发到Titiler容器的对应路径,但FastAPI的root_path是作为路由前缀存在的,Titiler内部的实际路由是基于/的。需要修改proxy_pass,在末尾添加/,让Nginx去掉匹配的路径前缀后转发:

location /api/v1/titiler {
    set $upstream titiler:8081;
    # 关键:添加末尾的/,转发时去除location匹配的前缀
    proxy_pass http://$upstream/;
    proxy_set_header HOST $host;
    proxy_set_header Referer $http_referer;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    # 额外添加X-Forwarded-Prefix,帮助FastAPI正确识别外部访问前缀
    proxy_set_header X-Forwarded-Prefix /api/v1/titiler;
  }
}

2. 强制指定Titiler的root_path(可选但更可靠)

Titiler的环境变量TITILER_API_ROOT_PATH有时可能未被正确加载,可通过启动命令直接指定--root-path参数,确保配置生效:

version: '2.2'

services:
  titiler:
    image: ghcr.io/developmentseed/titiler:latest
    container_name: titiler
    environment:
      - PORT=8081
      - WORKERS_PER_CORE=1
    # 直接通过uvicorn命令指定root_path
    command: uvicorn titiler.application.main:app --host 0.0.0.0 --port 8081 --root-path /api/v1/titiler

3. 验证配置

  • 在Nginx容器内执行curl titiler:8081/,应返回Titiler的正常API响应(内部路由根路径)
  • 外部访问http://你的域名/api/v1/titiler,即可正常使用Titiler服务

内容的提问来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:07:38