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

Nginx容器500内部服务器错误及Keycloak代理问题求助

问题解决:Docker部署Nginx、Keycloak时的500错误及连接问题

一、重定向循环导致500 Internal Server Error

错误原因

日志显示的rewrite or internal redirection cycle是因为Nginx配置存在循环重定向逻辑:

  1. server块中index指令错误地写成了index /index.html;,带斜杠的路径会触发内部重定向
  2. location /中的try_files $uri $uri/ /index.html;在请求根路径时,会再次指向/index.html,和index指令的处理形成循环

修复步骤

  1. 修正index指令,去掉路径前的斜杠:
    index index.html;
    
  2. 确认root /home/admin/newprodle/frontend/build;路径下存在index.html文件,并且Nginx进程对该目录有读取权限(Docker容器内需确保挂载目录的权限配置正确)
  3. 单页应用(SPA)场景下,try_files $uri $uri/ /index.html;的逻辑可以保留,但必须确保index指令配置正确

二、Nginx用localhost无法连接Keycloak容器

错误原因

Docker容器拥有独立的网络命名空间,Nginx容器内的localhost指向容器自身,而非宿主机或Keycloak容器,因此无法通过localhost访问其他容器。

修复步骤

  1. 使用Docker自定义网络(推荐)

    • 创建自定义网络:
      docker network create app-network
      
    • 启动Nginx、Keycloak、Postgres容器时,加入该网络:
      docker run --network app-network ... # 其他启动参数
      
    • 修改Nginx配置中的proxy_pass,用Keycloak容器名称代替localhost(假设Keycloak容器名为keycloak):
      location /auth {
          proxy_pass http://keycloak:8080;
          # 其他proxy_set_header配置保持不变
      }
      

    Docker会自动在自定义网络中解析容器名称到对应IP,无需手动指定IP。

  2. 使用宿主机IP(临时方案)
    如果不想使用自定义网络,可以将localhost替换为宿主机的实际IP(比如192.168.1.100),但这种方式在宿主机IP变化时需要重新修改配置,可靠性较低。

修改后的完整Nginx配置示例

server {
    listen 80;
    listen [::]:80;
    server_name domain.com;
    root /home/admin/newprodle/frontend/build/;
    index index.html;
    return 301 https://$host$request_uri;
}

server{
    listen 443 ssl;
    server_name *.domain.com domain.com;
    ssl_certificate /etc/nginx/fullchain.pem;
    ssl_certificate_key  /etc/nginx/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:MD5;
    root /home/admin/newprodle/frontend/build;
    index index.html;
    client_max_body_size 10M;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /auth {
        proxy_pass http://keycloak:8080; # 替换为Keycloak容器名称
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
    }

    location /api {
        proxy_pass http://backend:5000; # 后端服务建议用容器名称
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
    }

    location ~* \.(jpg|png|jpeg|gif|pdf|xlsx|xls|doc|docx) { # 修正正则表达式符号错误
        add_header 'Access-Control-Allow-Origin' '*' always;
        root /home/admin/newprodle/backend/src/uploads;
    }

    location /socket.io {
        proxy_pass http://backend:5000; # 后端服务用容器名称
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
    }
}

注:额外修正了静态文件location中的正则表达式错误,把错误符号❘换成了正确的|,并添加*修饰符让匹配不区分大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:15:54