使用confd和etcd建立基于Nginx的服务发现和负载均衡服务

这篇文章首先尽量详细地介绍了使用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)$
      
  • 对于一个特定的请求,匹配虚拟服务器的顺序应遵循:
    • 完全匹配,即没有通配符、没有正则表达式
    • 匹配通配符在前的,如上面的“*.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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值