nginx的host

289 阅读2分钟

本文仅为随笔和记录

背景

有一个后端服务,对外有两个域名,分别是web.comservice.com.需要配置nginx使两种流量转发到同一个后端

思路

利用nginx的多server特性,什么是多server呢?

  • 如果每台linux服务器只运行了一个小网站,那么人气低,流量小的草根站长需要承担高额的服务器租赁费,也造成了硬件资源浪费;
  • 虚拟主机就是将一台服务器分割成多个虚拟服务器,每个站点使用各自的硬盘空间,由于省资源,省钱,众多网站都使用虚拟主机来部署网站;
  • 虚拟主机的概念就是在web服务里的一个独立的网站站点,这个站点对应独立的域名(IP),具有独立的程序和资源目录,可以独立的对外提供服务;
  • 这个独立的站点配置是在nginx.conf中使用server{}代码块标签来表示一个虚拟主机。
  • Nginx支持多个server{}标签,即支持多个虚拟主机站点,这些server也可以监听同一个端口;
  • 虚拟主机定义了网站的端口,域名,网页内容存放路径;

以下是一个例子, 两个server都监听80端口,nginx会分别转发web.comservice.com到对应的server

server {
        listen       80;
        server_name  web.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
	
server {
        listen       80;
        server_name  service.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

server_name匹配规则

server_name匹配优先级如下:

  1. 完全匹配
  2. 通配符在前的,如*.test.com
  3. 在后的,如www.test.*
  4. 正则匹配,如~^.www.test.com$ 如果都不匹配
  5. 优先选择listen配置项后有default或default_server的
  6. 找到匹配listen端口的第一个server块

k8s中的ingress

k8s官方维护的ingress实现是nginx,也有server_name相关配置,配置项名为host 下面是一个例子, 请求k8s.test.com只能转发到tomcat-http

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-web
  annotations:
    # 指定 Ingress Controller 的类型
    kubernetes.io/ingress.class: "nginx"
    # 指定我们的 rules 的 path 可以使用正则表达式
    nginx.ingress.kubernetes.io/use-regex: "true"
    # 连接超时时间,默认为 5s
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    # 后端服务器回转数据超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    # 后端服务器响应超时时间,默认为 60s
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    # 客户端上传文件,最大大小,默认为 20m
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
    # URL 重写
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  # 路由规则
  rules:
  # 主机名,只能是域名,修改为你自己的
  - host: k8s.test.com
    http:
      paths:
      - path:
        backend:
          # 后台部署的 Service Name,与上面部署的 Tomcat 对应
          serviceName: tomcat-http
          # 后台部署的 Service Port,与上面部署的 Tomcat 对应
          servicePort: 8080