这篇文章主要简单的介绍下 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. 关闭vue的eslint代码检测和WebStorm的代码检测

    1. 在vue项目中 bulid > webpack.base.conf.js 中: 如图,在rules规则中有一条规则是校验代码的,也就是红框2那行,要取消可以直接注释掉这行,或者把红框1的函 ...

  2. java-ztest测试报告的搭建,python-BeautifulReport

    今天用testng的时候感觉测试报告贼丑又慢,以下图片是对比.了解到ztest,搭建的时候发现网上没有教程,对java真是太不友好了,所以步骤记录下吧.有疑问的可进群:231733032 使用ztes ...

  3. 2019 SD卡、U盘无法格式化怎么办的解决方法

    有天 闲的没事, 格式化一下U盘 ,结果突然断电了,我的天.我还在格式化的U盘 ,果然 ,我在此启动电脑后,的U盘直接 就不能用了.于是 我格式化. 然后,我的U盘就怎么也格式化不好了 ,找到了几种解 ...

  4. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value:

    问题:ERROR JDBCExceptionReporter:72 - Data truncation: Incorrect datetime value: '' for column 'create ...

  5. 命名对象继承1-验证Create*命名对象安全属性的传递

    windows核心编程 第5版 48页 下半部写道 进程B调用CreateMutex时,它会向函数传递安全属性信息和第二参数.如果已经存在一个指定名称的对象,这些对象就会被忽略 于是我通过代码来验证这 ...

  6. 序列标注(HMM/CRF)

    目录 简介 隐马尔可夫模型(HMM) 条件随机场(CRF) 马尔可夫随机场 条件随机场 条件随机场的特征函数 CRF与HMM的对比 维特比算法(Viterbi) 简介 序列标注(Sequence Ta ...

  7. Python基础(十八)

    今日主要内容 包 一.包 (一)什么是包 只要是含有__init__.py文件的文件夹就是一个包 包的本质其实就是一个文件夹,利用包将不同功能的模块组织起来,以此来提高程序的结构性和可维护性 包是用来 ...

  8. Spring入门之AOP实践:@Aspect + @Pointcut + @Before / @Around / @After

    零.准备知识 1)AOP相关概念:Aspect.Advice.Join point.Pointcut.Weaving.Target等. ref: https://www.cnblogs.com/zha ...

  9. Grafana 6.4 正式发布!

    原文链接:Grafana 6.4 正式发布! 2019 年 10 月 2 日,也就是国内小伙伴们的放假期间,Grafana 实验室正式发布了 Grafana 6.4 版本.这个版本主要围绕数据模型和指 ...

  10. java第3天:Scanner,Random,ArrayList

    第一章:Scanner从入门到放弃 1 API的概述和使用步骤 API简称应用程序编程接口,是JDK给我们提供好的可以直接使用的类和方法,是程序员随手使用的字典. *** 2 Scanner的概述 2 ...