nginx 简介篇

Nginx(发音为“engine x)是一款由俄罗斯软件工程师Igor Sysoev写的开源的web服务器。自从2004年发布以来nginx一直关注于高性能、高并发、低内存的使用,另外还有一些特色的Web服务器功能,如负载均衡、缓存、访问和带宽控制以及能够有效的与各种应用集成这些特点使得nginx成为现代网站架构中一个不错的选择。目前,nginx在互联网最受欢迎web服务器软件排行榜上排名第二。

1. 为什么高并发如此重要?

目前互联网是如此普及和无处不在,而我们知道,这在10年前是很难想象的。而且,由于从基于NCAS(译者注:国家超级计算机应用中心)的简单的HTML产生可点击文本到基于Apache web服务的重大演变,使得互联网成为全球2亿网民的常用沟通媒介。随着电脑、移动设备和最近的平板电脑的永久扩散连接,导致互谅网领域变化非常迅速以及整个经济的有线数字化。线上服务也随着生活和娱乐资讯的实时有效而变得更加细致。而且线上业务的安全方面也发生了重大变化。因此网站也变得比以前更加复杂,也就需要更多工程方面的工作使互联网更加健壮以及具有更好的扩展性。

对一个网站架构来说最大的挑战就是并发问题。从网络服务一开始,并发级别就在持续不断的增长。而一个网站同时为成百上千甚至是几百万用户同时服务的情况也并不少见。十年以前,导致并发的原因是客户端慢-当时用户使用ADSL或者拨号上网来连接;如今,并发是由移动客户端和一些需要通过持久连接来更新新闻、推特、朋友消息等的更新应用程序体系结构的组合。另外还一个造成并发增加的因素是现代浏览器同时为一个网站打开46个连接来加载网页以提高页面加载速度。

为了说明客户端慢时存在的问题,假设有一个简单的基于apacheweb服务可以产生一个100k大小的响应文本或者图片,那么这个服务只用花几分之一秒就能生成或者查询出这个页面,但是在一个有80kbps(10kB/s)带宽的客户端中却需要10秒钟来发送这个请求;本来这个web服务可以很快拉到100k的内容,但是却要在花费10秒钟传送完这100k的内容后才能释放这个连接。现在我们假设有1000个同时连接上的客户端来请求相似的内容,如果一个客户端被分配到1M的额外内存,那么为了满足这1000客户端100K的请求则需要1000M(大约1G)的额外内存。实际上,一个基于apache的标准web服务通常要为每个连接分配大于1M的内存,而且可悲的是移动通信的有效速率却仅为数十kpbs。虽然可能通过操作系统内核的socket缓冲在一定程度上可以缓解向比较慢的客户端发送内容的问题,但是总归不是通用的解决办法而且可能有不可预期的负面效果。

在对于持久连接的处理上使得并发问题变得更加突出,这是因为要避免重新创建http连接带来的延迟,客户端要一直保持与web服务器连接而且web服务还要为每个连接分配额外的内存空间。

因此,为了能够并且能够持续性处理随着日益增加的用户量而导致的不断增加的负载以及获得更高的并发性,一个网站必须基于一系列非常高性能的模块来构建。但是,其他部分如硬件(CPU,内存,硬盘)、网络容量、应用程序和数据存储架构显然也是同样重要的,它决定了web服务器可接受和处理的客户端连接数。所以web服务器需要能够通过非线性扩展来满足每秒钟不断增长的并发连接和请求数。

Apache是否合适?

Apache,起源于二十世纪九十年代初,目前仍是互联网上占主导地位的web服务器软件。从2000年开始,很明显的单机web服务很难通过简单的复制来满足不断增长的网络服务。尽管apache为未来开发提供了一个坚实的基础,但它为每个新连接来做一次自我复制的架构并不能满足一个网站非线性扩展的要求。最终,apache成了一个功能齐全、有一系列第三方插件而且几乎普遍普遍适用于任何类型二次开发的网站的web服务器。但是这样重并没有任何好处,而且这样做的缺点是将如此多的功能和工具组合到一个软件中也会增加每个连接的 cpu和内存占用率从而降低软件的可扩展性。

因此,既然服务器硬件、操作系统、网络资源不再是限制网站成长的主要因素,世界各地的开发者们也开始寻求更加有效的方法来运行web服务器。大概在十年前,一位著名软件工程师Daniel Kegel声称“现在对于web服务器来说是时候只是上万并发请求了”而且还预测了我们现在称之为互联网云服务的东西。Kegel的C10K清单里也进行了一些对web服务器最佳状态下并发连接数问题的尝试解决,最终证明nginx是最有效的解决途径。

为了解决C10K清单上同时10000连接数的问题,nginx考虑采用的不同架构方式-一个在并发连接数和每秒请求数都更适合非线性扩展的架构。由于 nginx基于事件模型,所以它并不遵循apache复制每个新的进程或者为每个页面创建单独线程的规则。结果,即使负载的增加,内存和CPU使用率仍然可控,这也使得nginx在一台服务器上通过普通硬件就可以处理数万并发请求。

nginx 第一个版本的发布是为了对基于apache的应用服务器中部署在apache下的静态内容,比如html,css,javascript脚本以及图片可以通过nginx来卸载并发和超时处理。在其发展过程中,nginx通过使用FastCGI、uswgi 或者SCGI协议实现了与第三方应用的集成,而且具有像memcache这样的分布式对象缓存系统。同时还增加了一些有用的功能,例如含有负载均衡机制的反向代理以及缓存等。这些额外的特色功能使nginx成为构建一个基于可伸缩web基础设施的有效工具的组合。

使用nginx时候还有更多优势?

通常高效、高性能的处理大并发请求是nginx最主要的优势,同时,使用nginx还有一些其他好处。

在过去的几年里,网络架构师们已经接受了松耦合的思想并开始从web服务中将应用的基础组件分离出来。然而,之前已经存在的基于 LAMP(Linux,Apache,MYSQL,PHP,Python或者Perl)的网站,现在可能包括不仅仅基于LEMP(E发音为“engine x”)的网站却在实际中越来越经常的需要将web服务器推到基础设施的边缘地带或者需要通过不同的方式将相同的或者一些新的应用以及数据工具整合起来。

对于以上情况来说nginx非常适合,这是因为nginx从应用层到更高效的边缘服务器(译者注:不熟悉的读者可查询边缘服务器)层提供了一些主要功能例如卸载并发、超时处理、SSL(安全套接层)、内容静态化、压缩和缓存、连接数和请求的节流甚至是HTTP流媒体。同时nginx还可以直接和 memcached、Redis以及其他的NoSQL解决方案来提高大并发用户下的性能。

随着最新的开放工具组件和编程语言的流行,越来越多的公司开始改变他们开发和部署应用的习惯。而nginx也已经成为这类改变的典范,发展为最重要的组件之一,同时它也已经帮助许多公司在预算范围内来实现web服务持续快速的发展。

nginx的第一行代码写于2002年,到2004年nginx通过2-two-clause BSD许可协议发布。自从nginx发布以来,它的用户群一直持续增长,并且贡献各种想法以及提交bug、提出各种意见和建议为整个社区提供了非常大的帮助。

nginx 的代码库是原创的,而且完全通过C语言来实现。它也已经被移植到多种架构下的操作系统中,比如Linux, FreeBSD, Solaris, Mac OS X, AIX 和Windows系统。nginx也有自己的库,而且这些库并没有使用系统中不存在的C库,因此,除了zlib、PCRE和OpenSSL这几个库之外,用户可以去掉自己不需要或者可能有许可冲突的库。

这里稍微说一下windows版本的nginx。运行在windows下的nginx更像是一个概念验证而不是一个功能齐全的端口。在windows下 nginx也是有限制的,那就是nginx不能很好的和windows内核兼容,已经知道的低版本的nginx在windows的问题有支持并发数少、性能低、缓存失效以及带宽策略失效。今后,windows版本nginx将更加匹配主流功能。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQl Got a packet bigger than ' max_allowed_packet' bytes

在my.ini中最后增加一行max_allowed_packet16M即可(根据实际情况设置)。

防止缓存爆炸的快速提示

在很多情况下,您都可以从应用程序中的常用对象缓存中受益,特别是在面向Web和微服务的环境中。 您可以在Java中执行的最简单的缓存类型可能是引入一个私有HashMap,在计算对象之前先对其进行查询,以确保您不会重复执行此操作。 这是…

设置过mysql远程连接后仍然无法进行远程连接 (mysql mysql报错2003 can't connect)

1、在控制面板上-〉系统和安全-》 window是防火墙-》打开或关闭Windows防火墙-》关闭Windows防火墙(不推荐),这样mysql就可以进行远程连接但是有一个问题就是不安全。所以采取以下的方法。 2、 解决方法: (1.控制面板 打开防火墙,在进入规则中新建一个规则. (2. 选…

go 二进制程序守护_图解 Go 程序是怎样跑起来的

Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!刚开始写这篇文章的时候,目标非常大,想要探索 Go 程序的一生:编码、编译、汇编、链接、运行、退出。它的每一步具…

nginx 配置从零开始

作为一个 nginx 的初学者记录一下从零起步的点滴。 基本概念 Nginx 最常的用途是提供反向代理服务,那么什么反向代理呢?正向代理相信很多大陆同胞都在这片神奇的土地上用过了,原理大致如下图: 代理服务器作为客户端这边的中介接…

[MySQL]经常无故崩溃amd.dll , boot1.exe病毒

近段时间有大量客户反馈,mysql经常无故崩溃或者是在C盘根目录出现 amd.dll , boot1.exe文件此病毒为mysql数据库的漏洞所导致,目前所有版本均有此问题目前已经有大量的客户出现这个问题请收到此消息后立刻检查自己的C盘目录,是否有amd.dll , …

Spring启动和缓存抽象

缓存是大多数应用程序的主要组成部分,只要我们设法避免磁盘访问,缓存就会保持强劲。 Spring对各种配置的缓存提供了强大的支持 。 您可以根据需要简单地开始,然后进行更多可定制的操作。 这将是spring提供的最简单的缓存形式的示例。 Sprin…

关于python的if条件语句,whilefor循环等的简单说。

if 条件1:# 语句体# elif 条件2:# 语句体# elif 条件3:# 语句体# else:# 语句体 #从键盘输入一个值# num 8# num1 int(input("请输入一个整数&#xff1a;"))if num1 num: print("您猜对了")elif num1 < num:print("您猜小了")else:print(…

haproxy配置代理tomcat和nginx_你真的掌握LVS、Nginx及HAProxy工作原理吗?

当前大多数的互联网系统都使用了服务器集群技术&#xff0c;集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务。图片来自 Unsplash这些集群可以是 Web 应用服务器集群&#xff0c;也可以是数据库服务器集群&#xff0c;还可以是分布式缓存服务器集群等等。在实…

PostgreSQL新手入门

自从MySQL被Oracle收购以后&#xff0c;PostgreSQL逐渐成为开源关系型数据库的首选。 本文介绍PostgreSQL的安装和基本用法&#xff0c;供初次使用者上手。以下内容基于Debian操作系统&#xff0c;其他操作系统实在没有精力兼顾&#xff0c;但是大部分内容应该普遍适用。 一、安…

使用Junit和Easytest进行数据驱动的测试

在本文中&#xff0c;我们将看到如何使用Junit进行数据驱动的测试。 为此&#xff0c;我将使用一个名为EasyTest的库。 众所周知&#xff0c;对于TestNG&#xff0c;它已内置了数据提供程序。 通过简单的测试&#xff0c;我们可以使用Junit进行数据驱动的测试。 什么是数据驱…

Matlab代码的耗时分析、优化、加速

Profile(分析&#xff09; 在加速你的matlab程序之前&#xff0c;你需要知道你的代码哪一部分运行最慢。matlab提供个简单的机制&#xff0c;让你能够知道你 的代码的某一部分运行所占用CPU时间。通过在代码段开始添加tic&#xff0c;及在结束添加toc&#xff1b;matlab就能计算…

python整数逆序输出_利用Python实现倒序任意整数

这是很早以前学习C时候做过的一个练习题&#xff0c;题目的要求大概是把用户输入的三位数倒序输出&#xff0c;比如说用户输入123&#xff0c;然后程序应该输出的结果是321。如果遇到用户输入100&#xff0c;那么程序应该输出1。然后我给扩展一下&#xff0c;这个程序来适应于三…

谜题61:日期游戏

下面的程序演练了Date和Calendar类的某些基本特性&#xff0c;它会打印出什么呢&#xff1f; import java.util.*;public class DatingGame {public static void main(String[ ] args) { Calendar cal Calendar.getInstance(); cal.set(1999, 12, 31); // Year, Month, Day Sy…

Java 中Thread的sleep、join、yield方法解析

1.Thread中sleep方法作用是使当前线程等待&#xff0c;其他线程开始执行&#xff0c;如果有线程锁&#xff0c;sleep不会让出锁 没有加锁代码如下&#xff1a; public class SynchronizedSleepMethod {public static void main(String[] args) {MoneyMethod moneyMethod new M…

MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?

Naresh Kumar是一位软件工程师与热情的博主&#xff0c;对编程与新事物充满了激情和兴趣。近日&#xff0c;Naresh撰写了一篇博文&#xff0c;对开源世界最常见的两种数据库MySQL与PostgreSQL的特点进行了详尽的分析和比对。 如果打算为项目选择一款免费、开源的数据库&#x…

jquery select change事件_jQuery实现省市联动效果

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><select name"province"id"province"><option >请选择</option></select><selec…

MATLAB上的GPU加速计算——学习笔记

MATLAB目前只支持Nvidia的显卡。如果你的显卡是AMD的或者是Intel的&#xff0c;就得考虑另寻它路了。 MATLAB可谓工程计算中的神器&#xff0c;一方面它自带丰富的函数库&#xff0c;另一方面它所有的数据都是内建的矩阵类型&#xff0c;最后画图也方便&#xff0c;因此解决一…

java中代码块的概述_Java代码质量工具–概述

java中代码块的概述最近&#xff0c;我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示&#xff1a; Java代码质量工具 以及更有意义的思维导图&#xff1a; 但是&#xff0c;我认为我需要更深入地探讨这一主题。 此博客文章应该像是在此方向上进行进一步调查的起点。 …

js原型、原型链、作用链、闭包全解

https://www.2cto.com/kf/201711/698876.html 【对象、变量】 一个对象就是一个类&#xff0c;可以理解为一个物体的标准化定义。它不是一个具体的实物&#xff0c;只是一个标准。而通过对象实例化得到的变量就是一个独立的实物。比如通过一个对象定义了“人”&#xff0c;通过…