这篇文章主要简单的介绍下 Nginx 的相关知识,主要包括以下几部分内容:

  1. Nginx 适用于哪些场景?
  2. 为什么会出现 Nginx?
  3. Nginx 优点
  4. Nginx 的编译与配置

Nginx 适用于哪些场景?

如图所示,一个请求会先经过 Nginx 到达应用服务层,然后再去访问数据层(比如 Redis、MySQL 等),提供基本的数据功能。我们的应用服务因为要求开发效率是非常高的,所以它的运行效率是很低的,它的 qps、tps或者并发都是受限的,所以我们需要把很多这样的应用服务组成集群,向用户提供高可用服务。而一旦很多服务构成集群的时候,我们需要 Nginx 具备反向代理功能,可以把动态请求传递给应用服务。

而当应用服务构成集群,一定会带来两个需求:

  1. 需要动态的扩容
  2. 有些服务出现问题的时候我们需要做容灾

这样反向代理必须具备负载均衡功能。

其次在这样的一个链路中, Nginx 是处在企业内网的一个边缘节点,随着网络链路的增长,用户体验到的时延会增加,所以需要把用户看起来不变的或者在一段时间内看起来不变的动态内容缓存在 Nginx 部分,由 Nginx 直接向用户提供访问,这样用户时延就会减少很多。所以反向代理延伸出另外一个功能就是缓存,来减少用户访问的时延。

像很多 css、js、img 静态资源,是没有必要通过应用服务来访问的,只需要本地文件系统上放置的静态资源,直接由 Nginx 提供访问就可以了。这是 Nginx 的静态资源服务。

应用服务本身的性能存在很多问题,像数据库服务比应用服务好的多,因为业务场景比较简单,并发性能和tps都要远高于应用服务,所以延伸出第三个应用场景:由 Nginx 直接去访问数据库、Redis,利用 Nginx 强大的并发性能实现如 web防火墙 复杂的一些业务功能。这就需要api服务有很强的业务处理功能,所以像 OpenResty、 Nginx 集成的 JavaScript,应用 JavaScript、lua 这样的语言功能和它们语言自带的一些工具库来提供完整的 API服务。

为什么会出现 Nginx?

伴随着互联网的快速普及、以及全球化和物联网的快速发展,导致互联网的数据量快速增长。

CPU 核数从当初的单核发展到 16 核,甚至 32 核,但是由于操作系统和大量的软件没有做好服务于多核架构的准备,致使服务的性能通常不会有成倍的提升。

Apache 的架构模型一个进程同一时间只会处理一个链接一个请求,处理完以后才会处理下一个请求。它实际上在使用操作系统的进程间切换的特性,因为操作系统微观上只有有限的 CPU,但是操作系统被设计为同时服务数百甚至上千的进程,而 Apache 一个进程只能服务于一个链接,这样的模式会导致当 Apache 需要面对几十万、几百万链接的时候,它没有办法去开几十万、几百万的进程;而进程间切换的代价成本又太高了,当并发的连接数越多,这种无谓的进程间切换引发的性能消耗也就越大,而 Nginx 是专门为了这样的应用场景而生的,Nginx 可以处理数百万甚至上千万的并发链接。

Nginx 优点

一、高并发,高性能

只要我们对每个链接使用的内存足够少就能实现高并发;既要达到高并发又要达到高性能,往往需要很好的设计。

比如现在的主流云服务器,nginx 在 32 核 64G 的配置中可以轻松达到数千万的并发链接;如果是处理简单的静态资源请求,nginx 可以达到 100w 的 RPS 。

RPS(Requests Per Second)为每秒能处理的请求数目,等效于 QPS(Queries Per Second),也就是每秒能处理查询数目。是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

二、可扩展性好

可扩展性主要体现在模块化设计;模块化设计非常稳定,使得 Nginx 的生态圈、第三方模块非常丰富。甚至于有 Tengine、OpenResty 这样的第三方插件在他的基础之上又生成了新的生态圈。丰富的生态圈和第三方模块为 Nginx 的丰富功能提供了保证。

三、高可靠性

高可靠性指的是 Nginx 可以服务器上持续不间断的运行数年,而很多web服务器往往运行几周or几个月,就需要进行一次重启。对于 Nginx 这样一个高并发、高性能的反向代理服务器而言,往往运行在企业内网的边缘节点上,这个时候如果我们企业想提供4个9、5个9、甚至更高的高可用性时,对于 Nginx 持续运行能够宕机的时间一年可能只能以秒来计,所以在这样一个角色中,Nginx 的高可靠性给我们提供了非常好的保证。

四、热部署

热部署是指在不停止服务的情况下升级Nginx。这个功能对于 Nginx 来说非常重要,因为在服务器上跑了数百万的并发链接,如果是普通的服务器,我们只能 kill 掉进程再重启的方式进行升级操作。但是对于 Nginx 而言,因为直接 kill 掉 nginx 进程会给所有的已经建立链接的客户端一个很不好的体验。

五、BSD 许可证

BSD许可证是指 Nginx 不只是开源的、免费的,而且我们可以在有定制需求的场景下,去修改 Nginx 的源码,再运行在我们的商业场景下且属于合法的。

Nginx 组成

Nginx 主要由以下 4 部分组成:

  • Nginx 二进制可执行文件:由各模块源码编译出的一个文件
  • Nginx.conf 配置文件:控制 Nginx 行为
  • access.log 访问日志:记录每一条 http 请求信息
  • error.log 错误日志:定位问题

接下来,我们就要动手去编译 Nginx 了。

编译 Nginx

# 下载
wget http://nginx.org/download/nginx-1.14.0.tar.gz
# 解压
tar -xzvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
# 配置
./configure --prefix=/usr/local/nginx
# 编译
make
# 安装
make install

在 configure 过程中可能遇到的问题:

./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre= option.

./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using --without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using --with-zlib= option.

出错的原因是 Nginx 模块需要依赖一些 lib 库,解决办法如下:

安装 pcre-devel 和 zlib-devel 依赖库:yum -y install pcre-devel zlib-devel

Nginx 配置

Nginx 配置语法

Nginx 配置参数

配置参数:时间的单位

配置参数:空间的单位

http 配置的指令块

  • http:表示里面所有的指令都是由 http 模块去解析去执行的
  • server:解析对应的域名or一组域名
  • location:url 表达式
  • upstream:表示上游服务,需要与企业内网服务直连的时候,可以定义一个 upstream

示例

示例中的所有指令都是由 Nginx 中的 http 模块去执行的,其中 server 127.0.0.1:8000 为需要解析的域名,location 后面跟的为对应的匹配规则,expires 3m表示 3 分钟后 cache 刷新,zone=one:10m表示开辟了一个 10m 大小的共享内存空间,给不同的 worker 去使用。

总结

这篇文章主要介绍了 Nginx 出现的原因和使用场景,并分析 Nginx 的优点,最后动手去编译属于自己的 Nginx,并进行简单配置。

Nginx 了解一下?的更多相关文章

  1. accept_mutex与性能的关系 (nginx)

    注:运行环境CentOS 6+   背景      在对启动了20个worker的nginx进行压力测试的时候发现:如果把配置文件中event配置块中的accept_mutex开关打开(1.11.3版 ...

  2. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  3. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

    一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...

  4. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  5. nginx+php的使用

    原文来自:windows下配置nginx+php环境 按照他的步骤走,亲测可用! 但是这里他后面说的根目录可能有些人有点懵. 其实在设置的时候就设置了: 网站根目录就是www这个目录,如果没创建请自行 ...

  6. nginx的使用

    1.nginx的下载 解压后文件目录: 2.nginx的常用命令 nginx -s stop 强制关闭  nginx -s quit 安全关闭  nginx -s reload 改变配置文件的时候,重 ...

  7. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  8. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

  9. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  10. Nginx如何处理一个请求

    看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...

随机推荐

  1. supervisor配置kibana

    在/etc/supervisor/conf.d/目录下添加kibana.conf [program:kibana]command=/opt/kibana-6.8.1-linux-x86_64/bin/ ...

  2. NET Core 3.0 新姿势 将AutoFac替换内置DI

    .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServ ...

  3. 先森林后树木:Elasticsearch各版本升级核心内容必看

    在学习Elasticsearch 时候,因为各个版本的问题,搞不清,非常的头疼,官方也给出了各个版本更新的情况,不过是英文版本,版本更新信息又特别多,最近学习,看了很多资料,没有一个整理很清楚的,然后 ...

  4. 动态insert mybatis与ibatis

    mybatis: <insert id="insert" parameterType="hashMap"> INSERT INTO item < ...

  5. Kafka 学习笔记之 架构

    Kafka的概念: 1. AMQP协议 Advanced Message Queuing Protocol (高级消息队列协议) The Advanced Message Queuing Protoc ...

  6. k8s运维记 - 如何让部署到k8s的kong网关托管自定义静态资源?

    目的 使用kong作为目录/data/reports的静态资源服务器,为了测试,已于目录/data/reports下创建文件report.html,如下: <html> <head& ...

  7. 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目

    看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...

  8. Spring Cloud之Hystrix

    在微服务架构中,存在那么多的服务单元,若一个单元出现故障(由于网络原因或者自身原因),就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定.为了解决这样的问题, ...

  9. mac上git安装与github基本使用

    目录 安装git 创建ssh key.配置git 提交本地项目到GitHub 一.安装Git MAC安装Git 首先查看电脑是否安装Git,终端输入: git 1.通过homebrew安装Git 1. ...

  10. Map集合(双列集合)

    Map集合(双列集合)Map集合是键值对集合. 它的元素是由两个值组成的,元素的格式是:key=value. Map集合形式:{key1=value1 , key2=value2 , key3=val ...