前言
本篇文章会Nginx得相关概念、安装使用、官网文档解析、基于反向代理的负载均衡策略 这几个点去解析Nginx,保证对Nginx有个大的认识。
简介
高并发分流
单台服务器无法满足当前业务场景下,既然无法满足,则使用多个服务器进行解决,就是集群产生;怎么样去分配来的业务请求,这就是如何进行解决高并发分流的问题,出现的负载均衡的框架;
分流限流
、多读写少用缓存,写多读少用缓冲。
分流的技巧、分而治之的思想。因为这个思想才出现了nginx框架的出现。
概述
一个俄国人用 语言编写的,开源的高性能的HTTP和反向代理服务软件,同时也提供
了IMAP/POP3/SMTP服务。Nginx是一款 轻量级的 Web 服务器/ 反向代理服务器及 电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少, 并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
Nginx主要应用于静态资源服务,反向代理服务、API服务
- 静态资源主要借助于服务器本地文件系统来完成
- 反向代理可以做到 Nginx强大的性能、缓存、负载均衡
- API服务通过集成niginx_lua模块来实现,比如OpenResty就是用niginx和lua集成特性,整合了大量常用的第三方模块 ,以及js脚本
正向代理 反向代理
正向代理,代表客户端进行网络或服务访问,客户端也就是正常访问服务器的,但网络是隔绝的,需要一台服务器作为网关进行代理服务器 ,这里还是需要指定目标访问服务器
位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
反向代理,代表服务端接收客户端的请求,服务端的所有信息都在反向代理服务器中的;反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
选择Nginx作为分流负载均衡选择器
在高并发的互联网行业,硬件负载均衡器、软件负载均衡器的选择
开源 BSD
协议
安装Nginx
windows安装
nginx: download进入Nginx下载页面;
选择
nginx/Windows-xxx.zip
的安装包下载,
xxx
表示最新的版本
解压
zip
到你的程序安装目录
进入
nginx-xxx
目录,双击
nginx.exe
启动
Nginx
服务
linux安装
linux
下面有两种安装方式,二进制安装、通过源码编译安装。
二进制安装
# 检查更新yum依赖
sudo yum install yum-utils
sudo yum install nginx
通过源码编译安装
通过源码编译安装,能够集成一些默认没有安装的模块以及第三方插件。下面我们来编译一个携带
ssl
和 echo模块的
Nginx
。
yum install -y gcc # GCC编译器,用来编译C语言程序
yum install -y gcc-c++ # C++编译器,用来编译C++语言程序
yum install -y pcre pcre-devel # Perl库兼容正则表达式,Nginx的HTTP模块要靠它来解 析正则表达式
yum install -y zlib zlib-devel # zlib库,用于对HTTP包的内容做gzip格式的压缩
yum install -y openssl openssl-devel # OpenSSL开发库,用于Http的SSL协议,需要源码 编译# 统一执行前面的命令
sudo yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl- devel
Nginx
需要通过
openssl
源码库来进行安装
ssl
协议,下载
openssl
源码,并解压
wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2k.tar.gz # 下载 openssl
tar -xzvf OpenSSL_1_0_2k.tar.gz # 解压openssl
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
tar -xzvf v0.61.tar.gz
配置编译选项
编译安装,通过
confifigure
文件来操作,用于一些特殊需求、特殊依赖的安装方式,操作也不是那么难。可以
参考官网
,也可以参考
confifigure
的帮助文档。
先了解目录内容,进入
Nginx
目录,输入
ls
查看文件内容如下图,里面有一个
confifigure
可执行文件
在当前默认输入下面命令,就可以看到对应的帮助文档
./configure --help
--without/--with
命令,它好比我们的
maven
资源管理,在父项目的
pom
中定义好了依赖的资源,子项 目如果需要使用通过引用即可。
confifigure
命令做了大量的
“
幕后
”
工作,包括检测操作系统内核和已经安装的软件,参数的解析,中间目 录的生成以及根据各种参数生成一些C
源码文件、
Makefifile
文件等。
执行编译
sudo make
make
命令根据
confifigure
命令生成的
Makefifile
文件编译
Nginx
工程,并生成目标文件、最终的二进制文件
安装
sudo make install
make install
命令根据
confifigure
执行时的参数将
Nginx
部署到指定的安装目录,包括相关目录的建立和 二进制文件、配置文件的复制。
nginx核心
Nginx常规操作
使用 sudo ./nginx -h 查看 配置文件 配置文件等等。
包括sudo ./nginx -s reload 热更新配置文件等等。
其他命令。sudo ./nginx -v 查看版本信息等等。
Nginx的配置文件
Nginx有一个非常强大的配置文件,可以配置应用对应的模块指令,类似Perl 语法风格。配置文件指令主 要分为两大块:简单指令、块指令..
简单的指令由名称和参数组成,用空格分隔,以分号 结尾。
块指令,以大括号'{}'
包围的一组附加指令,块指令在大括号内可以有其他指令,则称为上下文。
在任意上下文之外的指令称为主上下文, http、 events指令放在主上下文,
server在http中, location在server中.
动静分离 静态资源服务
动静分离术
也是分离的技术,Web服务中,html、js、图片、css等静态资源
态资源放在 webapp目录下。当静态资源越 来越大时,一个网页获取大量静态资源时,
影响到web服务的整体性能
通过 nginx将静态资源独立部署,减轻web服务的压力。
动态计算的数据则通过 web服务来获取。
niginx 通过利用分层、切割 、 动静进行分离 包括静态资源进行分离、前后端分离。
通过实现一个静态资源服务,来学习配置文件指令的使用
启动 niginx,浏览器访问http://hostname:8080
将某些文件 不用放到服务器上去,降低服务器压力
Nginx的配置热更新
nginx如何做到配置文件热更新?
nginx中有 worker、 master两种进程。
master进程负责加载配置、接收命令、监控子进程
worker进程负责处理网络请求
master process 和worker process 两种进程。 分别做不同的工作,这里自动启动。全部请求已经都返回后, 关闭相关 worker进程,如果不保证关闭则会出现服务异常的。
官方文档
nginx documentation
文档主要有:首页、关于、下载页面、安全、使用文档、 fap、博客等部分;blog商业信息。
作为开发人员,主要关注,下载页面、使用文档、博客这几个部分。其中使用
文档和博客是最为重要的内容。
博客
中涉及一些高级的特性和商业支持。
使用文档
包含, Nginx常规操作介绍、
功能场景操作、贡献提交源代码、 Nginx模块参考。
常规操作
包含如何编译安装 Nginx、初学者指南、管理员指南、 Nginx操作、 Nginx的连接处理事件类型、等信息。
功能场景配置
一般只有在对应的功能场景下使用配置,例如负载均衡反向代理、 Https服务
在文档中模块介绍,包括所有的处理。
Nginx模块
Nginx
整体设计采用:微核心模块 插件形式
很多优秀的开源组件都在采用这样的设计思想,为第三方扩展提供了强大的支撑。
也是
Nginx
受欢迎的原因之一。
核心模块常用指令
核心功能指令
微核心,包含 user use events,这些核心部分。都比较重要的部分,在官方文档中存在着。都是块指令。
http核心指令 要在 其中选择 对应的核心模块进行了解。
Location
最常用又最容易弄错的 Location指令,它可以由
前缀字符串
或
正则表达式
定义
这样进行匹配起来,字符类型的。
Location匹配规则
当一个请求过来时候, location怎么进行匹配?
首先 nginx检查使用了前缀字符串定义的 location指令块 选中并记住具有最长匹配前缀的
location指令块 如有 ^~匹配,则不查找正则表达式,使用该location
然后 按照它们在配置文件中的出现顺序检查正则表达式
正则表达式的搜索在第一次匹配时终止,并使用相应的配置
如果未找到与正则表达式的匹配,则使用先前记住的最长匹配前缀位置的配置
最后 还没有找到? 接盘侠/
实现高并发分流
单台服务器qps是有限的,提升请求速率;解决办法采用集群的方式。而分布式集群则需要使用到负载均衡。
Nginx负载均衡
负载均衡涉及的模块
upstream
http_upstream 模块定义一组服务,能被proxy_pass指令引用。 upstream name{......} 在http指令块中,定义一组可以进行负载均衡的上游服务器,并给取个 组名。服务可以是不同的端口、 TCP、UNIX域名套接字。 类似socket套接字
通过 upstream,就能为成千上百台的后端服务集群提供强有力的支撑,反向代理负载均衡功能。
proxy_pass
表示将请求传递到另外一个服务,类似正向代理,代理到某个服务上。
nginx负载均衡策略