本文仅为随笔和记录
背景
有一个后端服务,对外有两个域名,分别是web.com和service.com.需要配置nginx使两种流量转发到同一个后端
思路
利用nginx的多server特性,什么是多server呢?
- 如果每台linux服务器只运行了一个小网站,那么人气低,流量小的草根站长需要承担高额的服务器租赁费,也造成了硬件资源浪费;
- 虚拟主机就是将一台服务器分割成多个虚拟服务器,每个站点使用各自的硬盘空间,由于省资源,省钱,众多网站都使用虚拟主机来部署网站;
- 虚拟主机的概念就是在web服务里的一个独立的网站站点,这个站点对应独立的域名(IP),具有独立的程序和资源目录,可以独立的对外提供服务;
- 这个独立的站点配置是在nginx.conf中使用server{}代码块标签来表示一个虚拟主机。
- Nginx支持多个server{}标签,即支持多个虚拟主机站点,这些server也可以监听同一个端口;
- 虚拟主机定义了网站的端口,域名,网页内容存放路径;
以下是一个例子, 两个server都监听80端口,nginx会分别转发web.com和service.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匹配优先级如下:
- 完全匹配
- 通配符在前的,如*.test.com
- 在后的,如www.test.*
- 正则匹配,如~^.www.test.com$ 如果都不匹配
- 优先选择listen配置项后有default或default_server的
- 找到匹配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