一、了解一些简单的概念
HTTP服务器程序:
httpd(apache)
nginx
lighttpd(功能和nginx差不多,活跃度不如ng)
应用程序服务器:
IIS
Tomcat(开源jsp容器),jetty(开源轻量级jsp容器),jboss(2次封装tomcat-jsp),resin(教学)、webshpere(重量级)、weblogic(bea公司大量市场份额),oc4j(oracle的,已经把bea公司买了,oc4j已经没有市场)
二、HTTPD(Apache)
httpd:apache(a patchy server)
ASF(软件基金会):apache software foundation
1、httpd特性
①、高度模块化:core + modules,
运行再编译或运行时,选择哪些模块将会加载到服务器,来确定服务器特性
②、DSO:Dynamic Shared Object 动态共享对象
③、MPM:Multipath Processing Modules 多路处理模块
能够更好的为有特殊要求的站点定制,例如,要求高伸缩性的站点可以选择线程的MPM,(worker,event);需要可靠性或者与旧软件兼容站点可以使用prefork。
httpd-2.4支持,MPM支持运行DSO机制;以模块形式按需加载;
1)prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲经常,随时等待请求到达;最大不会超过1024个;
主进程:管理子进程,创建套接字,接受用户请求,并派发某个子进程
子进程:处理请求和响应请求
2)worker:多线程模型,每个现成响应一个请求;(比prefork不相上写,每天15万)
一个主进程:生成多个子进程,每个子进程负责多个线程,每个线程响应一个请求;m进程,n线程;m*n
主进程:管理子进程,创建套接字,接受用户请求,并派发给某个子进程处理
子进程:负责管理线程
线程:处理请求和响应请求;
3)event:事件驱动模型,每个线程响应N个请求;,和worker很像,多个进程+多个线程的混合模式,但是event模型下每个进程会有一个单独的线程来管理这些keep-alive类型的线程,当新的请求过来的时候,管理线程会把请求交给其他空闲线程处理,这样旧避免了每个线程都被keep-alive阻塞。但是event模型并不是所有情况都通用,再https协议下会退化成worker模型。
一个主进程:生成M个子进程,每个进程直接n个请求,m*n
主进程:管理子进程,创建套接字,接受用户请求,并派发给某个子进程
子进程:处理请求和响应请求
httpd-2.2,event为测试使用,不支持DSO机制的MPM
httpd-2.4,event为生产使用,production ready,支持DSO机制的MPM。
2、HTTPD的功能特性:
虚拟主机:能够标识虚拟主机的方式:IP + PORT + HOSTNAME(IP、Port、FQDN)
CGI:common gateway interface ,通用网关接口;
反向代理 :reverse proxy
负责均衡 :基于流量(bytraffic),基于业务(bybusiness),基于请求(byrequest)
路径别名
丰富的用于认证机制:basic、digest
支持第三方模块
三、Nginx
1、简介
nginx2004年正式发布,Apache是1995年
Apache以稳定著称但是随着互联网的日渐壮大,网站的并发变大,Apache就出现了一个C10K的问题,即一个物理服务器达到并发量1w的时候apache就会承受不了,后来2004年nginx很好的解决了c10k的问题。
淘宝用的Tengine nginx,简称tng
2、特性
模块化设计、较好扩展性(不支持动态装卸载,tng支持)
高可靠性
master--->worker
nginx服务器使用的异步机制是异步非阻塞方式,也就是master-->worker,每个工作进程使用异步非阻塞方式,可以处理多个客户端请求,当某个工作进程接收到客户端的请求,调用IO进行处理,如果不能立即获得结果,就去处理其他的请求,而客户端再此期间也无需等待响应,可以去处理其他事情,当IO返回时,就会通知此工作进程,该进程得到通知,暂时挂起当前处理的失误区响应客户端请求。
nginx采用异步非阻塞方式处理请求,处理请求具体到系统底层就是读写事件(所谓阻塞调用方式即请求事件还没准备好,线程只能一直等待,等事件准备好了再处理;而非阻塞即事件没准备好,马上返回ENGAIN,告诉你事件还没准备好,而再这期间可以先去做其他事,再回头看看事件准备好了吗,时不时的看,需要的开销也是不小的)
异步可以理解为循环处理多个准备好的事件,不会导致无畏的资源浪费,当有更多的并发数只会占用更多的内存而已
低内存消耗
10000个keep-alive连接再ningx仅消耗2.5MB
支持热部署
不停机而更新配置文件、更好日志文件、更新服务器程序版本
支持事件驱动、AIO(异步io,epoll等)、mmap(内存映射)
3、基本功能
处理静态资源的web服务器,能缓存打开的文件描述符,索引文件以及自动索引;
http,smtp,pop3协议的反向代理服务器加速,缓存、负载均衡;
支持FastCGI(fpm,LNMP),uWSGI(python),memcached server等;
模块化,非DSO机制,过滤器包括zip,图形大小调整、byte ranges,chunked responses以及SI-filter,在SSI过滤器中,到同一个proxy或FastCGI的多个子请求并发处理;
支持SSL,TLS SNI;
4、nginx结构与扩展
一个master进程,生成一个或多个worker;
事件驱动:epoll(边缘触发,支持linux2.6+),kqueue(BSD 4.1+),/dev/poll(event prots,solaris 7 11/99+);
消息通知(复用器):select,poll,rt signals(实施信号);
支持sendfile(linux2.2+),sendfile64(linux2.4.21+),sendfilev(solaris 8 7/01+);
支持输入过滤(freeBSD 4.1+)及TCP_DEFER_ACCEPT(linux2.4+);
最小化的数据库拷贝操作;
5、扩展功能
基于名称和IP 的多虚拟主机站点
支持keepalive和pipelined(管道)连接
支持平滑升级,不中断业务
定制访问日志,支持使用日志缓冲区提高日志存储性能
4xx-5xx错误代码重定向;
支持URL, 基于PCRE的rewrite重写模块,及正则表达式
支持路径别名
支持基于IP 及用户的访问控制
支持速率限制,支持并发数限制
支持 PUT,DELETE,MKCOL,COPY及MOVE等较特殊的HTTP请求
可以做HTTP反向代理及加速缓存,即负载均衡功能,内置都RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS功能
具备Squid等专业缓存软件等缓存功能
支持FLV(flash视频);
6、nginx的工作模式
非阻塞、事件驱动、一个master生成一个或多个worker,每个worker响应n个请求;
worker*n 国人单机最高并发达到52000个
nginx是一个高性能得web服务器,能够同时处理大量得并发请求,它结合多进程机制和异步机制,异步机制使用得异步非阻塞方式,接下来就给大家
7、五大模块
核心模块、标准HTTP模块、可选HTTP模块、邮件服务模块和第三方模块。
1)、核心模块:nginx最基本的核心服务,进程管理、权限控制、错误日志记录等;
2)、标准HTTP模块:标准HTTP模块支持标准的HTTP功能;
3)、可选HTTP模块:主要用于扩展标准HTTP功能,让Nginx能处理一些特殊服务;
4)、邮件服务模块:主要用于支持Nginx的邮件服务;
5)、第三方模块:扩展Nginx服务器应用,完成开发者想要的功能;
模块图如下:
8、nginx,master-worker模型架构图
9、nginx整体架构图
主进程
nginx启动时,会生成两种类型的进程,一个是主进程master,一个或多个工作进程worker,主进程并不处理网络请求,主要负责调度工作进程,加载配置、启动工作进程及非停升级。所以nginx启动后查看系统进程,就能看到至少两个nginx进程
工作进程
服务器实际处理网络请求及响应的是工作进程worker,在类unix系统上,nginx可以配置多个worker,每个worker进程都可以同时处理数以千计的网络请求。
模块化设计
包括核心和功能性模块,核心模块负责维持要给运行循环run-loop,执行网络请求处理的不同阶段的模块功能,比如:网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等,而其代码模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器
事件驱动模型
基于异步及非阻塞的事件模型,可以说是nginx得以获得高并发、高性能得关键因素,同时也得益于对linux、solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能得采用,如kqueue、epoll及event ports。
代理设计
代理设计,可以说是nginx深入骨髓得设计无论是对于HTTP,还是FastCGI、Memcache、Redis等得网络请求或响应,本质上都采用了代理机制,所以,Nginx天生就是高性能得代理服务器。