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
相关产品推荐
相关产品推荐

