Nginx相关
一、Nginx用途
Nginx是一个高性能的HTTP和反向代理服务器,及电子邮件(IMAP/POP3)代理服务器,同时也是一个非常高效的反向代理、负载平衡。
二、Nginx的优点
1、跨平台、配置简单
2、非阻塞、高并发连接。处理2~3万并发连接数
3、内存消耗小。Nginx采取了分阶段资源分配技术
4、内置健康检查功能。如果有一个服务器宕机,会做一个健康检查,再发送请求就请求提交到其他结点上
5、稳定性高。宕机概率小
6、接受用户请求是异步的。浏览器将请求发送到Nginx服务器,服务器先将用户全部请求接收下来,再一次性发送给后端web服务器,减轻web服务器压力
7、网络依赖性比较低。只要ping通就可以负载均衡
8、事件驱动。通信机制采用epoll模型
Nginx性能高的原因:
异步非阻塞事件处理机制。运用了epoll模型,提供了一个队列,排队解决
三、Nginx与Apache
Nginx:
1、轻量级。采用C编写,同样的web服务,占用更少的内存和资源
2、抗并发。Nginx处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能
3、nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
4、nginx 的设计高度模块化,编写模块相对简单
5、nginx 配置简洁,正则配置让很多事情变得简单
6、启动特别容易, 并且几乎可以做到 7*24 不间断运行
Apache:
1、apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
2、apache 更为成熟,nginx 的 bug 相对较多
3、apache 在处理动态请求有优势。一般动态请求要 apache 去做,nginx 适合静态和反向。
4、apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
两者最核心的区别在于 apache 是同步多进程模型,一个连接对应一个进程;而 nginx 是异步的,多个连接(万级别)可以对应一个进程
Apache创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存,并发过大会榨干服务器资源。
Nginx采用单线程来异步非阻塞处理请求,不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。
四、负载均衡算法
负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中。负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力。
1、轮询。依次将请求分配到各个后台服务器中,默认的负载均衡方式。 适用于后台机器性能一致的情况。 挂掉的机器可以自动从服务列表中剔除。
2、weight。根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3、IP_hash。根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
4、url_hash(第三方)。根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。
5、fair(第三方)。根据后台响应时间来分发请求,响应时间短的分发的请求多。
五、如何解决惊群现象
惊群是多个子进程在同一时刻监听同一个端口引起的。
Nginx解决方法:同一个时刻只能有唯一一个worker子进程监听web端口,此时新连接事件只能唤醒唯一正在监听端口的worker子进程。
六、正向代理与反向代理
正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
反向代理:对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
七、动态资源与静态资源分离
动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件)。后台处理忽略静态文件会导致请求次数明显增多。在对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。