对Nginx的理解 --相对于Apache

概要:nginx的源码安装,参数配置,make,nginx与Apache的区别,四层均衡负载均衡,七层负载均衡。线程与进程

首先,我们还是通过实验对Nginx的配置进行剖析,了解Nginx都可以实现什么功能。

第一部分:实验

##获得nginx包,并解压:

README文件是自述文件。也就是服务该如何配置的文件,相当于使用指南:

他说要到网上查看如何安装和配置:

首先指导我们进行源代码安装:

解压后文件是6.2M:

用帮助查看怎么用源代码安装:

帮助里会告诉我们怎么安装我们需要的服务,比如ssl,和http

还可以指定nginx的用户和组:

还有安装路径的前缀:

然后就可以开始安装:

安装完成后会显示需要依赖软件,所以,我们要安装依赖软件,并且结尾应该是devel:

再安装,再查看依赖性,解决依赖:

直到解决所有依赖性,然后就完成了第一步,接下来是

Make  make install

当然 这三步也可以一次完成:

在第一步完成后会生成makefiel文件,指导make的运行:

我们现在安装的nginx是5.5M,是因为debug(排除程序故障,是及其重要的编译操作)的原因。

开启nginx,查看端口:

用命令和浏览器可以查看现在nginx开启:

关闭并且删除nginx:

Make  clean  相当于删除makefiel然后把解压包也删了,从头开始做,

解压,进入解压包:

之前我们做的安装完成后,会有nginx的版本号,这样很不安全,下面是在安装时去除版本号:

在下面的文件中编辑GCC,在安装过程中不进行Debug,这样nginx将会很小。

然后就是源码安装:

进入安装位置,查看端口:

检查,可以访问,并且包很小:

安装好之后,我们必须在nginx下的sbin下执行./nginx才能开启nginx,为了不麻烦,我们可以将要执行的目录链接到环境变量下,这样就可以在任何位置执行并开启nginx了

当你再查询nginx的位置时显示的是链接的位置:

这样我们就可以在任何位置进行nginx的开启,关闭看,重新加载。

###下面来配置nginx的动态模块,这样在你安装nginx的时候,如果是动态模块,那么你就可以在需要的时候打开,不需要的时候关闭。然而它支持的动态模块有限,这里我们以mail为例,相对于这一点,Apache的配置文件中是已经内置了动态模块:

一个安装包可以安装多次但每次都必须make clean,目的是刷新删除makefile这个文件(这个文件是每次在第一步后在安装包中生成的,用来指导make,而不是在安装位置)

Nginx  --help可以查看怎么设置安装:

动态模块是在静态模块后面加上dynamic:

这里我们安装两个动态库,并解决依赖性:

Make  && make install

这样在安装的目录下就会有modules的目录,并且在modules中有刚刚我们增加的动态模块,当我们需要启动服务时,就可以在nginx的主配置文件中加入:

并且只能增加在第一行,否则 ./nginx  -t 会有语法错误。

这样检测语法,重新加载就可以使用mail服务了。

##修改nginx的用户:

默认是nobody

在配置文件第一行修改:

###限制用户访问资源数:

如果不限制用户访问资源数,会把内存消耗完,这样系统就会崩溃。

把内存资源消耗完的命令:

意思是一个请求接着一个请求。

Ulimit:限制用户的最大进程数,

Ulimit  -a显示当前的所有用户的进程限制。

现在一个进程打开的文件个数是默认的1024个。

我们新增一个用户,查看他的进程限制,还是 默认一个进程可以打开1024个文件。

##wxh可以打开最大的进程相互为100,当然,我们也可以设置最大的文件数:

查看:

再用shell炸弹去测,发现他是一个循环,最多占用100个进程,然后就退出,然后再进行炸弹。

##统计访问次数:

##手写网页跳转:

生成证书:

###网页重定向:

修改发布目录

在主机上增加解析:

有时会不停闪烁,加上<noscript >就行了

###网页重写

还要把之前做的重定向注释掉:

###虚拟主机

##负载均衡:

对westos.org做负载均衡

在server3中开启http,将昨天vanish做的虚拟主机删除,修改发布目录:

Server2也要修改发布目录:

重启两个http,检测发布目录没错:

这是在虚拟主机的基础上加了负载均衡,两者不牵扯:

检测:

负载均衡可以加权重,

加完权重后的效果:

Backup表示此台主机并不是负载均衡主机,而是当所有其他主机都挂掉后,显示这台主机的发布目录,我们可以在这一页写上“系统正在维护”等

Nginx的发布目录是在nginx下的html下的index.html:

还可以使用IP hash 和将某一台负载均衡器关了。

增加sticky模块,把之前做的nginx删了,重新安装:

这样就增加了一个sticky模块。

第二部分:相关知识的补充

##GUN的相关知识:

GUN计划,又叫做革奴计划,目标是创建一套完全自由的操作系统,为保证GUN软件可以自由的使用,复制修改传播,就有了GUN通用公共许可证。

GUN计划首先完成的是开发出了许多软件包,包括强大的文字编辑器emacs,GCC(GUN编译器集合,是一套由GUN开发的编程语言编译器),以及大部分UNIX系统的程序库和工具。唯一没有完成的就是操作系统与内核。

然后李纳斯托沃兹开发出来linux操作系统内核,并与其它GUN软件结合,尽管如此,GUN计划还是开发出自己内核。

##Make理解:

在我们用源码安装nginx时只需三步就可以,这里就用到了GUN的make工具,我们在shell提示符下只需要输入make命令就可以完成自动编译,极大的提高了效率,这是因为有makefile文件,makefile文件指出了整个工程所有文件的编译顺序,编译规则(哪些文件先编译,哪些文件后编译哪些需要重新编译),makefile有自己的书写格式,关键字,函数。

只有linux中才有makefile,window中IDE(集成开发环境)已经将makefile这个工作给做了。在UNIX下的软件编译,就需要自己写makefile。

Makefile就像shell脚本一样,其中也可以执行操作系统的命令。

关于程序的编译(compile)连接(link):

编译时,编译器只检测程序的语法,和函数,变量是否被声明,如果函数未被声明,会警告,但是,仍然会生成object file(-o在window中是obj)而在连接程序时,连接器会在所有的object file中找寻函数的实现,如果找不到,就会报错。

我们在命令行输入make,他会在当前目录下找makefiel文件或Makefile。

下面是makefiel的详细讲解:

http://sc.qq.com/fx/u?r=PPKILEA

##一线互联网公司所使用的web服务器:

网易(163,com),新浪(sina),360用的就是nginx

百度用的是Apache

基本筛选引擎(BFE)是一种管理防火墙internet协议安全(IPsec)策略以及实施用户模式筛选的服务。停止或禁用BFE服务将大大降低系统的安全。

腾讯用的是squid:

淘宝用的是自己阿里的tengine

##Nginx的master和worker的浅析:

Nginx开启后会在后台运行,包括一个master进程和多个worker进程。可以让他前台运行也可以关掉master进程,让其以单进程方式运行。

Nginx有single和master两种进程模块,single模型是单进程的,容错能力差,不适合生产场景,生产场景用的master模型,即一个master进程加上N个worker进程。Master进程负责管理worker进程是master进程fork出来的,用来处理请求。

Worker数最多只能和CPU 数相等,查看系统CPU个数用licpu.

Nginx之所以快是因为master-worker模块和七层负载均衡。

七层负载均衡是vanish和nginx常用的。

###DNS四层负载均衡与nginx七层负载均衡的异同:

四层负载均衡是用户将数据包发到四层服务器,然后到后端服务器,后端服务器直接将数据包返回给用户,并且更改了IP数据包的地址,实现分流。四层均衡器只是起到一个转发的作用,以TCP为例,三次握手但是建立在client和server上的, 七层是后端机器要将数据包先返回给七层服务器,在返回给用户,这样效率会差一点。Client和七层服务器之间,七层服务器和server指间都会有三次握手,七层服务器相当于一个代理。

当有攻击时,四层会直接发送给后端,而七层会过滤掉,这样七层就比较安全。

七层可以实现对流量的统计,能够将访问不同内容(文字or图片)的包分发给不同的服务器。

下面是对四层和七层的详细讲解:

http://shikezhi.com/html/2016/nginx_0407/1099813.html

##同步阻塞与异步非阻塞:

Apache 本身采用同步阻塞,也有异步非阻塞,但是与自身冲突,所以不常用。

Nginx采用异步非阻塞:一个线程注册多个IO事件,IO事件准备完就处理,如果如果没有准备完,则阻塞一段时间,在这段是间内,如果准备问就直接处理。提升了CPU利用率和高并发的处理能力。

总得来说就是:

同步阻塞:是CPU处理一个进程完后才能进行下一请求。

非阻塞:是开多个线程,但是这样会在内存占用和线程切换之间浪费开销。

异步非阻塞:一个线程上注册多个IO,一完就处理,如果没完就阻塞一段时间,再处理。不是在线程之间切换而是在请求之间切换,就不存在线程之间切换的开销。

在传统的同步阻塞IO模型下,七层服务器每次向后端服务器发送请求需要等待响应结果,这样CPU大部分时间都在等待IO完成,效率非常低。为了解决这个问题可以采用非阻塞的方式,七层服务器开多个工作线程,每个工作线程通过轮询的方式去检查IO事件是否完成,如果没有完成则让出CPU让其他工作线程处理。这种方式比同步阻塞的方式要好,但是只有在工作线程很多的情况下效率才比较高,而工作线程一多带来的内存开销以及线程切换的开销也非常大,阻碍了进一步提升并发处理能力。这时可以采用异步非阻塞IO模型,也就是说不再开很多个工作线程,而是由一个工作线程注册很多个IO事件,如果有IO事件准备完毕,则可以直接处理。如果没有准备完毕,则阻塞一个固定超时时间,在这个时间之内如果有多个IO事件都准备完毕了,则可以依次处理这些IO事件。从整体上来看节省了上下文切换的开销,提升了CPU的利用率,因此也提升了并发处理能力。这也是当前select/poll/epoll/kqueue这些机制的基本原理。

在传统的同步阻塞IO模型下,七层服务器每次向后端服务器发送请求需要等待响应结果,这样CPU大部分时间都在等待IO完成,效率非常低。为了解决这个问题可以采用非阻塞的方式,七层服务器开多个工作线程,每个工作线程通过轮询的方式去检查IO事件是否完成,如果没有完成则让出CPU让其他工作线程处理。这种方式比同步阻塞的方式要好,但是只有在工作线程很多的情况下效率才比较高,而工作线程一多带来的内存开销以及线程切换的开销也非常大,阻碍了进一步提升并发处理能力。这时可以采用异步非阻塞IO模型,也就是说不再开很多个工作线程,而是由一个工作线程注册很多个IO事件,如果有IO事件准备完毕,则可以直接处理。如果没有准备完毕,则阻塞一个固定超时时间,在这个时间之内如果有多个IO事件都准备完毕了,则可以依次处理这些IO事件。从整体上来看节省了上下文切换的开销,提升了CPU的利用率,因此也提升了并发处理能力。这也是当前select/poll/epoll/kqueue这些机制的基本原理。

Nginx与七层负载均衡参考:

http://blog.csdn.net/xiaoao89757/article/details/450582

21

四七层代理区别:

http://hi.baidu.com/aking_roc/item/3f62cb0f57b49736a3332a9e

Nginx平台初探:

http://tengine.taobao.org/book/chapter_02.html

第三部分:原理讲解

Nginx与Apache的区别:

最大的区别是nginx占用资源少,可处理高并发,epoll的IO模型使nginx性能更高,是异步非阻塞处理请求,还是高度模块化的,配置简洁,静态性能好,本身就是就是一个反向代理器,七层负载均衡。

而Apache能够更加稳定,少BUG模块超级多,select的IO模型使他吃力请求相对较慢,配置相对麻烦,处理动态好,rewrite功能强。

最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 。

好的模型是前端nginx抗高并发,后端Apache是Apache集群。

下面是两者区别的详细介绍:

1、nginx相对于apache的优点:

轻量级,同样起web 服务,比apache 占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

高度模块化的设计,编写模块相对简单

社区活跃,各种高性能模块出品迅速啊

apache 相对于nginx 的优点:

rewrite ,比nginx 的rewrite 强大

模块超多,基本想到的都可以找到

少bug ,nginx 的bug 相对较多

超稳定

存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。这里要注意一点,epoll(freebsd 上是 kqueue )网络IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。

2、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型.

Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.

Nginx 是一个安装非常的简单 , 配置文件非常简洁(还能够支持perl语法), Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 .

3、Nginx 配置简洁, Apache 复杂

Nginx 静态处理性能比 Apache 高 3倍以上

Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用

Apache 的组件比 Nginx 多

现在 Nginx 才是 Web 服务器的首选

4、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

5、nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式.

6、从个人过往的使用情况来看,nginx的负载能力比apache高很多。最新的服务器也改用nginx了。而且nginx改完配置能-t测试一下配置有没有问题,apache重启的时候发现配置出错了,会很崩溃,改的时候都会非常小心翼翼现在看有好多集群站,前端nginx抗并发,后端apache集群,配合的也不错。

7、nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。

8、从我个人的经验来看,nginx是很不错的前端服务器,负载性能很好,在老奔上开nginx,用webbench模拟10000个静态文件请求毫不吃力。apache对php等语言的支持很好,此外apache有强大的支持网路,发展时间相对nginx更久,bug少但是apache有先天不支持多核心处理负载鸡肋的缺点,建议使用nginx做前端,後端用apache。大型网站建议用nginx自代的集群功能

9、Nginx优于apache的主要两点:1.Nginx本身就是一个反向代理服务器 2.Nginx支持7层负载均衡;其他的当然,Nginx可能会比apache支持更高的并发,但是根据NetCraft的统计,2011年4月的统计数据,Apache依然占有62.71%,而Nginx是7.35%,因此总得来说,Aapche依然是大部分公司的首先,因为其成熟的技术和开发社区已经也是非常不错的性能。

10、你对web server的需求决定你的选择。大部分情况下nginx都优于APACHE,比如说静态文件处理、PHP-CGI的支持、反向代理功能、前端Cache、维持连接等等。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。

11、可以看一下nginx lua模块:https://github.com/chaoslaw...apache比nginx多的模块,可直接用lua实现apache是最流行的,why?大多数人懒得更新到nginx或者学新事物

12、对于nginx,我喜欢它配置文件写的很简洁,正则配置让很多事情变得简单运行效率高,占用资源少,代理功能强大,很适合做前端响应服务器

13、Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧

Ulimit的讲解:

http://www.linuxidc.com/Linux/2012-10/72782.htm

线程与进程的区别:

链接:

来源:luoweifu

链接:blog.csdn.net/luoweifu/article/details/46595285

时间: 2024-10-25 15:36:31

对Nginx的理解 --相对于Apache的相关文章

nginx相对于apache的区别

1.nginx相对于apache的优点:轻量级,同样起web 服务,比apache占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊apache 相对于nginx 的优点: rewrite ,比nginx 的rewrite 强大动态页面模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多 超稳定 存在就是理由,一般来说,

为什么Nginx的性能要比Apache高很多

为什么Nginx的性能要比Apache高很多? 这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型. 目前Linux下能够承受高并发访问的Squid.Memcached都采用的是epoll网络I/O模型. 处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效. 下面用一个比喻来解析Apache采用的select模型和Nginx采用的epoll模型进行之间的区别:

nginx前端负载,后端apache获取真实IP设置

原文链接: nginx前端负载,后端apache获取真实IP设置 参考文献: 前端Nginx,后端Apache获取用户真实IP地址  按照第二种方法设置不成功! 网站最前端是nginx,做的PROXY来转发请求到后端的apache上,所以获取的IP 都是NGINX PROXY 机器的IP,这对于分析和记录apache日志等很多基于IP判断的PHP程序都会出现一系列的问题,经过以下两处理便可让apache获取 正式的访问地址:1.修改NGINX的配置文件NGINX.CONF 在里面加上 proxy

双节点(nginx+keepalived)为两台apache服务器提供负载均衡

说明:本实验为双节点nginx为两台apache服务器提供负载均衡,本文不是做lvs,所以realserver不是配置在keepalived.conf而是在nginx的配置文件中upstream.此架构需考虑的问题:1)Master没挂,则Master占有vip且nginx运行在Master上2)Master挂了,则backup抢占vip且在backup上运行nginx服务3)如果master服务器上的nginx服务挂了,则vip资源转移到backup服务器上4)检测后端服务器的健康状态Mast

企业级nginx服务优化(三 )Apache+防盗链

apache   worker/prefork  /application/apache/bin/apachectl -l | sed -n '/worker\|prefork/p'   worker.c Server MPM:     Worker ./configure    --with-mpm=worke  //编译时指定,,默认是prefork prefork  默认 使用多个子进程,每个子进程只有一个线程 效率高,稳定,安全,比worker消耗资源多 vim  /applicatio

通过Nginx反向代理,IIS和apache 共用80端口

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream;

nginx + php-fpm (也包括一部分apache/httpd)

php5-cgi (or php70-cgi) 似乎是不用装的. 挤压出Nginx的性能http://blog.csdn.net/xifeijian/article/details/20956605 改ulimitvi /etc/sysctl.conffs.file-max = 70000 (貌似没用)net.netfilter.nf_conntrack_max = 1000000 (这个?)http://blog.chedushi.com/archives/9508 (ubuntu专用?) f

linux下 nginx 转发内容至 本地 apache

流量从本地80端口的nginx进来之后在转发给本地apache的88端口,在什么环境下会用到这种配置还有待观察,这里先做个记录 先配置 nginx 的配置文件 xxx.conf  如图 接下来在配置 apache 再分别重启 apache 和 nginx  即可 如果服务器配置较低则不推荐这么做 原文地址:https://www.cnblogs.com/zyjfire/p/10136777.html

Nginx proxy_set_header 理解

场景: 用户认证接口:根据客户端IP和port,进行IP反查和端口范围确认,如符合则用户认证通过. 当前使用的是Nginx负载均衡,从客户端到Nginx端 ip和port都对,从Nginx到应有服务器上-port端口变成很奇怪的端口号. 疑问:Nginx往应有服务器上 是如何 传递 客户端IP和port 参数的呢? 请看 Nginx proxy_set_header: Nginx proxy_set_header 允许重新定义或添加字段传递给代理服务器的请求头.该值可以包含文本.变量和它们的组合