Nginx的个人理解

  • nginx的练习
    • nginx的特点
    • nginx的事件处理机制
    • nginx的内部模型
    • nginx是如何处理一个请求
    • nginx常见配置说明
    • 个人搭建的nginx的服务器

nginx的练习

因为项目需要的,需要一些负载均衡的东西,我个人也比较好奇,所以在自己空闲的时候,看了一些资料,并且整理一下的。
做这篇博客的主要目的是想替换掉项目的heartbeat的方案,虽然heartbeat更简单一点,但是不能做到负载均衡。

nginx主要的目的是代理。代理位于web客户端和web服务器之间,扮演“中间人”的角色。Http的代理服务器即是web服务器又是wen客户端。
谈到nginx服务器,不得不谈到正向代理和反向代理:

正向 是一个位于客户端和原始服务器之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个请求并制定目标,然后代理向原始服务器转交请求并将获得的内容返回客户端。客户端必须要进行一些特别的设置才能使用正向代理。
反向代理服务器 在服务器接受客户端的请求,然后将请求分发给具体的服务器进行处理,然后在将服务器的响应结果反馈给客户端。

Nginx的个人理解_第1张图片

nginx的特点

  1. 跨平台
  2. 配置异常简单
  3. 支持更大的并发连接

nginx的事件处理机制

首先看一个请求的基本过程:建立连接-接受数据-发送数据。

  1. 非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很多大。
  2. 因此才有了异步非阻塞的事件处理机制。监控多个事件,调用他们是阻塞的。{通过异步非阻塞的事件处理机制,nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。master/worker结构:一个master进程,生产一个或多个worker进程 内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个nginx进程才消耗150m内存}

nginx的内部模型

Nginx的个人理解_第2张图片

  1. nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程。
  2. master接受到信号以后怎么处理?首先master进程在接到信号后,会先重新加载配置文件,然后在启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接受新的请求,而老的进程在收到来自master的信号后,就不再接受新的请求,并且在当前进程中所有未处理完的请求处理完成后,再退出。
  3. worker进程优势如何处理请求的呢?我们前面有提到,worker进程之间是平等,每个进程,处理请求的机会。首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket。 一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会受到通知,而只有一个进程可以accept这个连接,其它的则accept失败,这是所谓的惊群现象。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生请求,产生数据后,在返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
  4. nginx采用这种进程模型有什么好处?采用独立的进程,可以让相互之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的异常退出。
  5. 为什么nginx可以处理千万个请求?nginx采用了一步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理千万个请求的,对于iss服务器每个请求会独占一个工作现场,当并发数上到几千是,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的电子,线程带来的内存占用非常大,线程的上下文切换带来的cput开销很大,自然性能就上不去了,而这些开销完全是没有意义的。

nginx是如何处理一个请求

nginx在启动时,会解析配置文件,得到需要监听的端口和ip地址,然后在nginx的master进程里面,先初始化这个监控的socket,然后再fork出多个子进程出来,然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立一个一个连接后,此时,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建好的连接的socket,然后创建nginx对连接的封装。

nginx常见配置说明

worker_processes 8;

nginx进程数,建议设置为等于CPU总核心数

worker_connections 65535;

单个进程最大连接数(最大连接数=连接数*进程数)

client_header_buffer_size 32k; #上传文件大小限制

large_client_header_buffers 4 64k; #设定请求缓

client_max_body_size 8m; #设定请求缓

autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

keepalive_timeout 120; #长连接超时时间,单位是秒

gzip on; #开启gzip压缩输出

gzip_min_length 1k; #最小压缩文件大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_comp_level 2; #压缩等级

upstream blog.ha97.com {

upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。

server 192.168.80.121:80 weight=3;

server 192.168.80.122:80 weight=2;

server 192.168.80.123:80 weight=3;

}
虚拟主机的配置

server

{

监听端口

listen 80;

域名可以有多个,用空格隔开

server_name www.ha97.com ha97.com;

index index.html index.htm index.PHP;

root /data/www/ha97;

location ~ .*.(php|php5)?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

个人搭建的nginx的服务器

Nginx的个人理解_第3张图片

Nginx的个人理解_第4张图片

通过以上的图片可以,看出来已经完成了简单的负载均衡。

你可能感兴趣的:(Nginx的个人理解)