nginx 初了解

随着现代web开发的发展,restful,前后端分离,前端js框架的应用越来越普遍。很多web应用请求的接口可能根本就存在于不同的服务器,类似于微信,支付宝等等。这其中就会存在跨域的问题。简单来说,跨域就是浏览器为了防止黑客能够随意改变表单的请求地址的一种安全防护。如果黑客可以随意将一个表单的请求地址改成其控制的服务器地址,在返回一个可以获取用户填写信息的页面,就会造成用户信息泄露。这种浏览器跨域防护跟现在的开发模式又有相悖的地方。笔者最初使用nginx 就是为了解决前后端分离带来的跨域问题。

nginx是一个高性能的http/反向代理服务器,也可以用于邮件服务。具有反向代理/负载均衡的功能。起源于俄罗斯的一个大型网站,现在国内新浪、163、腾讯、Discuz、豆瓣都有使用。

笔者会记录学习nginx的过程,毕竟很多东西的学习光靠百度百科远远不够。

一.  nginx为什么具有高性能

nginx在启动后,服务器会出现至少两个进程(具体看配置),也可以看成是两类进程,一个是master,一个是workers,二者是管理与被管理的关系。 master进程能够将接收到的http请求合理的分配到works进程中去。所以一般的http请求其实是跟master进程通信,master进程保证每个请求只被一个works执行,至于master分配请求与worker处理请求的机制这里不做表述。

那么,nginx采用这种进程模型有什么好处呢?当然,好处肯定会很多了。首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带 来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中 断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的 所有请求失败,不过不会影响到所有请求,所以降低了风险。当然,好处还有很多,大家可以慢慢体会。 

nginx提供一种异步非阻塞的机制。当一个请求通过master到达worker时,nginx提供select/poll/epoll/kqueue这样的系统调用,当请求发现对应的接口尚未准备好(这里的未准备好有多种原因,可能没有响应,正在初始化,正在建立连接等),这个时候请求放到内核中,不占用CPU的内存,同时 select/poll/epoll/kqueue这样的系统调用 监听该请求的目标是否准备好,这个时候该worker进程可以接收另外的请求来处理,如果前面的请求目标被监听到准备好时,worker在调用回,这样使得CPU处于一种高效的使用状态而不用开辟对于的线程占用内存空间。

当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一个了,只是在请求间进行不断地切换而已,切换也是因为异步事件 未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事件,事实上就是这样的。与多线程相比,这种事件处理方式是有很大 的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换,事件处理非常的轻量级。并发数再多也不会导致无谓的资源浪费(上下文切换)。更多 的并发数,只是会占用更多的内存而已。 我之前有对连接数进行过测试,在24G内存的机器上,处理的并发请求数达到过200万。现在的网络服务器基本都采用这种方式,这也是nginx性能高效的 主要原因。

nginx在实现时,是通过一个连接池来管理的,每个worker进程都有一个独立的连接池,连接池的大小是 worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个 ngx_connection_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲 ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。

在这里,很多人会误解worker_connections这个参数的意思,认为这个值就是nginx所能建立连接的最大值。其实不然,这个值是表 示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是 worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

(未完待续)

时间: 2024-11-05 16:35:50

nginx 初了解的相关文章

Nginx初体验(一):nginx介绍

今天我们来介绍一下Nginx. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器 特点: 反向代理,负载均衡,动静分离 首先我们来介绍一下正向代理服务器以及反向代理服务器 正向代理服务器: 正向代理需要我们的用户,手动的设置代理服务器的ip和端口号 (图片:正向代理服务器.png) 例如我们的用户A要访问服务器B,一般来说,我们用户A需要经过交换机A,以及交换机B, 然后才能到服务器B,但是如果交换机A或者是交换机B有一台出现了错误,那么我们就 不

Nginx - Windows下Nginx初入门

公司刚使用nginx,预先学习下.鉴于机器没有Linux环境,在Windows熟悉下. 下载 1)下载地址: http://nginx.org 目前(2017-05-30),nginx的稳定版本是,在官网下载先,12.0 2017-04-25 nginx-1.13.0 mainline version has been released. 2017-04-12 nginx-1.12.0 stable version has been released, incorporating new fea

Nginx初探索之安装、启动、关闭和重启

(本文中,Centos的系统命令用黑体斜杠表示出来,并且加上#提示符,以便阅读) Nginx.Apache.Tomcat都是时下比较优秀的服务器软件,这哥三也是运维工程师需要掌握的服务器软件,至少三者会其二,这哥三搭配服务器硬件和服务器操作系统组成了一个完整的服务器.这三款服务器软件各有特点,Tomcat是一个基于JAVA的硬性软件,而后两者是软性的,Apache现在是应用面最广的,但是他在高并发的特性上明显不如Nginx,不过它胜在模块比Nginx丰富. Nginx可以在Windows下使用也

Nginx初探索之基本配置

Nginx是干啥的?为什么他这么受重视? 对于这个问题用最简单的话来说,Nginx类似是一个阀门软件,他来控制流量去那一边,来实现负载均衡.比如登陆一个很火的网站,网站虽然用的是一个域名,但是肯定机房里不会是只有一台服务器,而是好几十台乃至成百上千台服务器在一起发功,当用户接入的时候,Nginx就会根据情况分配用户去不同的子服务器访问,这样不会让局部的服务器压力过大,这样的"负载均衡"对服务器的稳定是很有帮助的. 当然负载均衡仅仅是nginx能力的一部分. 而虽然规定了子服务器,而且每

Nginx初阶——认识Nginx

Nginx的应用场景 Nginx常见的应用场景如下图所示: 静态资源服务 曾经的Web开发并不是完全的前后端分离,最明显的例子就是JSP,基本是前后端不分离,直到后来Spring生态体系和前端框架的发展,Web应用程序成了单纯的提供应用接口服务的程序,因此静态资源就没必要交给应用服务器去处理,而是交给Nginx 反响代理服务 Nginx的缓存加速和负载均衡,极大提高了整体系统的并发能力,Nginx的并发相对于应用服务器要强大太多 API服务 Nginx里面提供了数据库服务.缓存.应用服务相关AP

Nginx(一)-- 初体验

1.概念 Nginx是一个高性能的反向代理器,同时也是一个邮件代理服务器. 2.Nginx的优势 1.采用多进程模型   Master.worker/worker...,一个Master进程管理多个Worker子进程 2.异步非阻塞(NIO)   一个Ngin可以处理成千上万的请求,仅取决于 服务器的内存 3.优点 实现高并发的访问 部署简单 内存消耗少 成本低,开源免费 4.安装步骤 1.下载nginx的安装包,放到/usr/java/ 文件夹中,下载地址:http://nginx.org/e

初实nginx服务器配置之文件目录

下载nginx服务器:http://nginx.org   中下载所需要的nginx版本. 将下载好的nginx解压到目录中.他的目录结构如下图 nginx目录结构: 1.nginx.exe:(★★★重要)这个是启动nginx服务器文件.nginx默认占用80端口.注意:你双击这个图标,nginx服务器就会启动,然后黑色的框框就会消失,这是正常情况. 2.logs:这个是nginx的日志文件.(★★★重要).用于记录nginx的情况,如果nginx出错了.可以看这个文件的内容.从而解决nginx

通过nginx源码包制作rpm包

目录 目录... 1 版权声明:... 2 文档信息:... 2 一.通过nginx源码包制作rpm包... 2 1.制作前环境准备:... 3 2.创建普通用户... 3 二.编写spec规则... 3 1.在模板里添加规则... 3 2.关于保存*.spec报错的解决... 4 2.1解决办法:... 5 2.2使用rpmbuild命令生成 rpm包... 5 三.在其他主机测试rpm包... 5 1. 需要按照依赖包... 5 2. 上传并安装nginxRPM包... 5 3. 查看端口开

【转】浅谈Nginx负载均衡与F5的区别

前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问本地门户,动态数据则通过反向代理指向内网服务. 其实Nginx和F5这两者均可用作网站负载均衡,那二者有什么区别呢?笔者在此浅谈下Nginx与F5的一些区别. 目前很多网站或应用在设计之初都会为高并发的数据请求做负载均衡,不差钱的土豪用户一般会直接买F5硬件设备作为其负载均衡器,原因不用多