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

Kong API网关无法访问PostgreSQL及权限异常排查求助

Kong网关Docker部署故障排查建议

问题背景

此前正常运行的Kong API网关(通过docker-compose部署,包含kong、postgres、migrations、konga四个容器)突发故障:

  1. 执行docker-compose up时,kong容器日志报错:

    Cannot mkdir /tmp/resty_fozOysRNjN: Permission denied

  2. 尝试以root身份运行容器后,出现PostgreSQL连接拒绝错误:

    2024/06/17 16:10:49 [error] 1#0: init_by_lua error: /usr/local/share/lua/5.1/kong/init.lua:660: [PostgreSQL error] failed to retrieve PostgreSQL server_version_num: connection refused

已确认PostgreSQL可通过psql正常连接,且相同docker-compose配置在其他机器可正常运行。

附docker-compose配置:

services:
  kong-db:
    image: postgres:9.6
    environment:
      POSTGRES_USER: kong
      POSTGRES_DB: kong
      POSTGRES_PASSWORD: kong
    ports:
      - "5432:5432"
    volumes:
      - kong-db-data:/var/lib/postgresql/data
    networks:
      - kong-net

  kong-migrations:
    image: kong:latest
    command: /bin/sh -c "sleep 10 && kong migrations bootstrap --vv"
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_PORT: 5432
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kong
      KONG_LOG_LEVEL: debug
    depends_on:
      - kong-db
    networks:
      - kong-net

  kong:
    image: kong:latest
    command: /bin/sh -c "sleep 30 && kong start --vv"
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_PORT: 5432
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kong
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
      KONG_LOG_LEVEL: debug
    depends_on:
      - kong-migrations
    ports:
      - "8000:8000"
      - "8443:8443"
      - "8001:8001"
      - "8444:8444"
    networks:
      - kong-net

  konga:
    image: pantsel/konga
    environment:
      NODE_ENV: production
    ports:
      - "1337:1337"
    depends_on:
      - kong
    entrypoint: /bin/sh -c "sleep 40 && npm start"
    networks:
      - kong-net

volumes:
  kong-db-data:

networks:
  kong-net:
    driver: bridge

排查步骤

一、解决/tmp目录权限问题

  • 检查宿主机/tmp目录权限:执行ls -ld /tmp查看权限,确保为drwxrwxrwt(其他用户有读写执行权限)。如果权限异常,执行chmod 1777 /tmp恢复默认权限。
  • 避免直接用root运行Kong容器:Kong官方镜像默认用kong用户运行,强制root会引发后续问题。可在docker-compose的kong服务中添加user: "1000:1000"(替换为宿主机上有/tmp权限的用户UID:GID),或者挂载自定义临时目录:
    kong:
      # ...其他配置
      volumes:
        - ./kong-tmp:/tmp
    
    宿主机执行mkdir -p kong-tmp && chmod 777 kong-tmp完成目录准备。

二、解决PostgreSQL连接拒绝问题(root运行容器时出现)

  • 检查PostgreSQL监听地址:进入postgres容器,执行cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses,确认listen_addresses设置为'*'。若不是,修改后重启postgres容器。
  • 验证容器间网络连通性:在kong容器内执行ping kong-db和telnet kong-db 5432,确认网络可达且端口开放。若无法连通,执行docker network inspect kong-net检查网络配置,确保所有服务都加入该网络。
  • 检查PostgreSQL用户连接权限:进入postgres容器执行psql -U kong,然后查询用户权限:
    SELECT rolname, rolhost FROM pg_roles WHERE rolname='kong';
    
    若rolhost不是'%',执行ALTER USER kong WITH LOGIN PASSWORD 'kong' HOST '%';修改权限。
  • 替换固定sleep为健康检查:当前依赖等待逻辑不可靠,修改docker-compose为postgres添加健康检查,让依赖服务等待postgres就绪后启动:
    kong-db:
      # ...其他配置
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U kong -d kong"]
        interval: 5s
        timeout: 5s
        retries: 5
    
    kong-migrations:
      # ...其他配置
      depends_on:
        kong-db:
          condition: service_healthy
      command: kong migrations bootstrap --vv  # 移除sleep
    
    kong:
      # ...其他配置
      depends_on:
        kong-db:
          condition: service_healthy
        kong-migrations:
          condition: service_completed_successfully
      command: kong start --vv  # 移除sleep
    
  • 清理旧容器和缓存:执行以下命令清理残留状态后重新部署:
    docker-compose down -v
    docker system prune -f
    docker-compose up -d
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:10:21