这篇文章首先尽量详细地介绍了使用Nginx作反向代理服务器和负载均衡,接着简单介绍了Etcd,最后介绍如何使用Confd建立基于Nginx和Etcd的服务发现和负载均衡。
1. Nginx概述
NGINX有一个主进程和一个或多个工作进程
- 主进程的主要目的是读取和检查配置文件,以及维护工作进程
- 工作进程执行请求的实际处理。工作进程的数量由Nginx中的“worker_processes”指令定义,可以设置为固定的数量,也可以配置为自动调整到可用的CPU内核的数量。
Nginx使用基于文本的配置文件,这些配置文件必须以Nginx识别的格式编辑
- 配置文件由指令及其参数组成
- 简单(单行)指令以分号结尾
user root; error_log /var/log/nginx/error.log notice; worker_processes auto;
- 其他指令充当“容器”,将相关指令分组在一起,用花括号({})将它们括起来,这些通常被称为块(Block)。
- 简单(单行)指令以分号结尾
一些顶级指令(称为Context)将应用于不同流量类型的指令组合在一起,这些Context包括:events、http、mail和srteam。在它们之外的指令称为“主上下文(main context)”。
1.1 虚拟服务器(Server)
在每个处理流量的Context中,都包含一个或多个server块来定义控制请求处理的虚拟服务器,它描述了一组根据“server_name”指令逻辑分割的资源。
为了响应Http请求,可以在http context中定义多个server块。一个虚拟服务器
由“listen”和“server_name”指令组合定义:
- listen指令定义了一个IP地址/端口组合或者UNIX域套接字路径,它唯一地标识了在Nginx下的套接字绑定:
listen address[:port]; listen port; listen unix:path;
- server_name指令用来匹配请求中的Host头字段
- 它的默认值是"",即server部分没有server_name指令,对于没有设置Host头字段的请求将会匹配该server,如下Http非标准码444将会是的Nginx立即关闭一个连接:
server { listen 80; return 444; }
- nginx允许一个虚拟主机有一个或多个名字,多个域名之间以空格分隔
- Nginx也接受通配符作为server_name的参数:
- 通配符可以替代部分子域名:*.example.com
- 通配符可以替代顶级域名部分:www.example.*
- 一种特殊形式将匹配子域或域本身:.example.com
- Nginx支持server_name使用正则表达式,为了使用正则表达式,域名必须以波浪线“~”开头,否则该名字会被认为是个确切的名字:
server_name ~^www\.example\.com$ server_name ~^www(\d+).example\.(com)$
- 它的默认值是"",即server部分没有server_name指令,对于没有设置Host头字段的请求将会匹配该server,如下Http非标准码444将会是的Nginx立即关闭一个连接:
- 对于一个特定的请求,匹配虚拟服务器的顺序应遵循:
- 完全匹配,即没有通配符、没有正则表达式
- 匹配通配符在前的,如上面的“*.example.com”
- 匹配通配符在后面的,如“www.example.*”
- 匹配正则表达式
- 如果上述都不匹配,则
- 优先选择listen指令后有default或default_server的
- 找到匹配listen端口的第一个server块
1.2 配置Locations
Nginx可以将流量发送到不同的代理或者根据不同的请求URIs提供不同的文件。这些块通过指令“location”定义,该指令放在“server”指令内。例如可以定义三个位置块:指示虚拟服务器将一些请求发送到一个代理服务器,将其他请求发送到另一个代理服务器,并通过从本地文件系统交付文件来服务剩余其它请求。
location指令有两种类型的参数:前缀表达式(路径名) 和 正则表达式。对于匹配前缀字符串的请求URI,它必须从前缀字符串开始,如:/some/path/document.html匹配/some/path/,而/some/my-path/document.html无法匹配。
为了找到最匹配URI的位置,NGINX首先将URI与带有前缀字符串的位置进行比较。然后用正则表达式搜索位置。
和server_name的正则表达式类似,location的正则表达式同样必须以“~”(区分大小写)或“~*”(不区分大小写)开头。如下正则表达式匹配在任何位置包含.html或.htm的URIs。
location ~\.html? {
...
}
1.2.1 Location匹配规则
location [ = | ~ | ~* | ^~ ] uri { ... }
=
表示精确匹配,只有请求的URI与后面的字符串完全相等时,才会命中~
表示该规则是使用正则定义的,区分大小写~*
表示该规则是使用正则定义的,不区分大小写^~
表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找
Location匹配过程如下:
- 先检查使用前缀字符定义的location,选择最长匹配的项并记录下来
- 如果找到了精确匹配的location(即使用了=修饰符的location),使用该配置并结束查找,否则继续
- 按顺序查找使用正则定义的l