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

Kubernetes如何配置Ingress实现不同域名指向Nginx服务的不同根目录

问题根因分析

方案1失败原因

你修改root为/var/www/projectA后,Ingress的path设为/public_html时,请求路径会被Nginx拼接为/var/www/projectA/public_html/请求路径,实际相当于多了一层public_html前缀,自然返回404。

方案2失败原因

核心存在两个配置错误:

  • Service配置中,80和81端口的targetPort都指向了http(默认对应容器80端口),所以即使Ingress转发到服务的81端口,最终还是会打到容器的80端口,对应public_html目录
  • 两个Nginx server块的server_name都是localhost,无明确Host头匹配时会优先走第一个定义的server块,也会导致路由错误
可行解决方案(推荐方案一,配置更简洁)

方案一:单端口通过Host头路由(无需额外开放容器端口)

1. 修改Nginx配置,用server_name区分不同站点

server {
  server_name projectA.com;
  listen 80;
  root /var/www/projectA/public_html;
}
server {
  server_name medias.projectA.com;
  listen 80;
  root /var/www/projectA/medias;
}

2. 新增medias的Ingress配置,直接转发到80端口即可

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: medias-ingress
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
spec:
  rules:
    - host: medias.projectA.com
      http:
        paths:
          - path: /
            backend:
              serviceName: main-service
              servicePort: 80

原有的main-ingress无需修改,Ingress会默认携带请求的Host头转发到后端Nginx,Nginx会自动匹配对应的server块返回对应目录的资源。

方案二:双端口方案的修正配置

如果你坚持使用双端口方案,只需要修正Service的端口映射即可:

spec:
  ports:
    - port: 80
      targetPort: 80
      name: http
      protocol: TCP
    - port: 81
      targetPort: 81
      name: medias-http
      protocol: TCP

你原来的Nginx双端口配置无需修改,配置更新后重启对应资源即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:06:05