Nginx 了解一下?
这篇文章主要简单的介绍下 Nginx 的相关知识,主要包括以下几部分内容:
- Nginx 适用于哪些场景?
- 为什么会出现 Nginx?
- Nginx 优点
- Nginx 的编译与配置
Nginx 适用于哪些场景?
如图所示,一个请求会先经过 Nginx 到达应用服务层,然后再去访问数据层(比如 Redis、MySQL 等),提供基本的数据功能。我们的应用服务因为要求开发效率是非常高的,所以它的运行效率是很低的,它的 qps、tps或者并发都是受限的,所以我们需要把很多这样的应用服务组成集群,向用户提供高可用服务。而一旦很多服务构成集群的时候,我们需要 Nginx 具备反向代理功能,可以把动态请求传递给应用服务。
而当应用服务构成集群,一定会带来两个需求:
- 需要动态的扩容
- 有些服务出现问题的时候我们需要做容灾
这样反向代理必须具备负载均衡功能。
其次在这样的一个链路中, 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 了解一下?的更多相关文章
- accept_mutex与性能的关系 (nginx)
注:运行环境CentOS 6+ 背景 在对启动了20个worker的nginx进行压力测试的时候发现:如果把配置文件中event配置块中的accept_mutex开关打开(1.11.3版 ...
- nginx配置反向代理或跳转出现400问题处理记录
午休完上班后,同事说测试站点访问接口出现400 Bad Request Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...
- 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器
一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- nginx+php的使用
原文来自:windows下配置nginx+php环境 按照他的步骤走,亲测可用! 但是这里他后面说的根目录可能有些人有点懵. 其实在设置的时候就设置了: 网站根目录就是www这个目录,如果没创建请自行 ...
- nginx的使用
1.nginx的下载 解压后文件目录: 2.nginx的常用命令 nginx -s stop 强制关闭 nginx -s quit 安全关闭 nginx -s reload 改变配置文件的时候,重 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
- nginx源码分析之模块初始化
在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...
- Nginx如何处理一个请求
看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...
随机推荐
- 搭建第一个node服务器
1.在项目文件夹根目录创建app.js: (1)先引入模块 const http = require('http');//http是安装好node就有的一个模块,是用来创建http服务器的 (2)创建 ...
- SpringBoot系列——ElasticSearch
前言 本文记录安装配置ES环境,在SpringBoot项目中使用SpringData-ElasticSearch对ES进行增删改查通用操作 ElasticSearch官网:https://www.el ...
- python语言程序设计基础 习题 天天向上的力量(math.pow)
实例1: 一年365天,,以第一天的能力值为基数1.0,当好好学习时能力值相比前一天提高1%,没有学习时能力值相比前天要降低1%,每天努力和每天放任,一年下来的能力值相差多少? 解析: 如果每天都好好 ...
- windows下虚拟环境virtualenv的简单操作
使用豆瓣源安装(推荐) [推荐] python3.X安装和pip安装方法 pip install -i https://pypi.douban.com/simple XXX 1.安装virtualen ...
- Maven 梳理 -聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- Spring Boot 监听 Activemq 中的特定 topic ,并将数据通过 RabbitMq 发布出去
1.Spring Boot 和 ActiveMQ .RabbitMQ 简介 最近因为公司的项目需要用到 Spring Boot , 所以自学了一下, 发现它与 Spring 相比,最大的优点就是减少了 ...
- 有了 CompletableFuture,使得异步编程没有那么难了!
本文导读: 业务需求场景介绍 技术设计方案思考 Future 设计模式实战 CompletableFuture 模式实战 CompletableFuture 生产建议 CompletableFutur ...
- PSSH工具
目录 PSSH工具 参考 PSSH工具的介绍 PSSH工具的使用 PSSH工具
- SpringBoot 连接kafka ssl 报 CertificateException: No subject alternative names present 异常解决
当使用较新版本SpringBoot时,对应的 kafka-client 版本也比较新,如果使用了 2.x 以上的 kafka-client ,并且配置了 kafka ssl 连接方式时,可能会报如下异 ...
- JS的加减乘除高精度
//除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(arg1,arg2) ...