岁月如歌 2019-12-08
Nginx是一个高性能的HTTP和反向代理服务器,及电子邮件代理服务器,同时也可以作为反向代理服务器来实现负载均衡。
因为Nginx具有跨平台、配置简单、非阻塞、高并发连接等特点!
Nginx的优势:
- 内存消耗小:开启10个Nginx才占150M内存,Nginx处理静态文件好,耗费内存小;
- 内置的健康检查功能:如果有一个服务器宕机,Nginx会将这台宕机的服务器移出集群;
- 节省带宽:支持Gzip压缩,可以添加到浏览器本地进行缓存;
- 稳定性高:宕机的概率非常小;
- 接收用户请求是异步的(采用epoll模型):浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力,一边接收web服务器的返回数据,一边发送给浏览器客户端, 网络依赖性比较低,只要ping通就可以负载均衡,可以有多台nginx服务器 使用dns做负载均衡,事件驱动;
主要功能:
- 可以作为Web服务器(代替Apache,对PHP需要fastcgi处理器支持);
- 可以作为反向代理服务器;
- 可以实现负载均衡;
- 可以配置虚拟主机;
- fastcgi:Nginx本身不支持PHP等语言,但是它可以通过fastcgi来将请求转交到某些语言或框架处理;
Nginx服务主要由一个master进程和多个work进程,而work进程就是用来处理客户端请求。
当一个客户端请求到达Nginx服务器时,这时Nginx服务会调用work进程来处理客户端的请求,但不是全程处理,处理可能发生阻塞的地方,比如向后端服务器转发客户端请求,并不会等待请求返回。那么此时这个处理的work进程会继续处理其他的请求,一旦后端服务器返回结果后,就会触发这个事件,work进程才会接收并将返回结果转交到客户端。
惊群简单来说就是多个进程或线程都在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上降低了系统性能。
Nginx处理惊群的大致思路:不让多个进程在同一时间监听接受连接的socket,而是让每个进程轮流监听,这样当有连接到达时,就只有一个进程在监听那肯定就不会存在惊群的问题。
具体的做法:利用一把进程间锁,每个进程中都尝试获得这把锁,如果获取成功监听socket加入wait集合中,并设置超时时间等待连接到来,没有获得锁的进程则将监听socket从wait集合中去除。
主要是因为它的事件处理机制:异步非阻塞事件处理机制:应用了epoll模型,提供了一个队列,排列解决。
首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面先初始化好这个监控的socket,再进行listen,然后再fork出多个子进程出来, 子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体,接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就处理完成了!
nginx的upstream目前支持四种方式的分配:
Nginx与Apache相比有以下优势:
一般来说,需要性能的 web 服务,使用 nginx ;如果不需要性能只求稳定,更考虑 apache !
cgi:
web服务器会根据请求的内容,然后会fork一个新进程来运行外部c程序(或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。
fastcgi:
web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
- 配置nginx的proxy缓存;
- 对静态页面开启压缩功能,如br压缩或者gzip压缩;
- 调整nginx运行工作进程个数,最多开启8个,8个以上话性能就不会再提升了,而且稳定性变得更低,所以8个足够用了;
- 调整nginx运行CPU的亲和力;
- 修改nginx最多可打开的文件数,若超过系统限制的最多打开文件数(ulimit -n命令查看系统的最多打开文件数),还需要修改系统默认的文件数;
- 修改单个worker的最大连接数;
- 开启高效传输;
- 设置连接超时时间,以便保护服务器资源,因为建立连接也是需要消耗资源的;
- 优化fastCGI的一个超时时间,也可以根据实际情况对其配置缓存动态页面;
- expires缓存调优,主要针对图片、css、js等元素更改较少的情况下使用。
- 配置防盗链;
- 优化内核参数,如进程可以同时打开的最大句柄数;
具体内容可以参考nginx面试题
———————— 本文至此结束,感谢阅读 ————————