Nginx 的简单了解 (一)
博客专区 > Alex_Pan 的博客 > 博客详情
Nginx 的简单了解 (一)
Alex_Pan 发表于2年前
Nginx 的简单了解 (一)
  • 发表于 2年前
  • 阅读 83
  • 收藏 0
  • 点赞 0
  • 评论 0

华为云·免费上云实践>>>   

摘要: ngnix 简单工作原理,以及安装。

NGINX: 
 

概述

Nginx(发音同engine x)是一款由俄罗斯程序员Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。  – 维基百科


Nginx的模块与工作原理

Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相 应的工作。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

  • 核心模块:HTTP模块、EVENT模块和MAIL模块

  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,

  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的模块从功能上分为如下三类:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。

  • Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。

  • Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

  
                     +                    ^
        Http Request |                    |  Http Response
                     |                    |
    +---------+------v-----+         +----+----+
    |  Conf   | Nginx Core |         | FilterN |
    +---------+------+-----+         +----^----+
                     |                    |
                     |               +----+----+
                     |               | Filter2 |
choose a handler     |               +----^----+
based conf           |                    |
                     |               +----+----+
                     |               | Filter1 |
                     |               +----^----+
                     |                    | Generate content
               +-----v--------------------+----+
               |           Handler             |
               +-------------------------------+

Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个 location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负 责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。


Nginx架构及工作流程

根据上图所示,nginx在启动后,会以daemaon的方式起个master进程,而mater进程会派生fork出来多个子进程(或者叫woker进程),nginx要起多少woker进程取决于nginx.conf中worker_processes的参数设置,我们可以将 worker_processes 设置 N个(这里的`N`可以根据,当前nginx运行在服务器的CPU的核心数来做依据,对数会设置成于CPU 核数相等的数值,网上也有人建议将其设置为CPU核数的2倍),master的进程主要起到的是管理作用,它监管着work进程,比如一个work进程在运行的途中coredump,master会立即fork 一个进程或是我们常说的拉起一个新的work进程来弥补coredump的work进程,这样可以保证nginx的正常运行。再说说work进程,这些work进程都没有同步锁,相互独立,自己完成自己请求处理,woker之间没有相互通信,它们只于服从于master进程。


nginx 是怎样处理一个连接请求的呢? 一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?

        首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。
所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,
而且只在一个worker进程中处理。这样就有人想了,这样去竞争`接受锁`会不会产生有的进程一大段的时间内是属于无链接状态,而有的进程会比较繁忙一直在处理请求链接,可以我们无需担心这样的情况发生,在nginx中有个参数
变量可以帮到我们 它就是`ngx_accept_disabled`这样就不产生恶心竞争了。
    ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n
    #如果当前worker进程的空闲连接数小于配置中worker_connection数量的1/8,nginx还可以不间断地accept请求,否则nginx会直接进入等待。这个等待时间最长是ngx_accept_disabled * 500ms)


这样的进程模型优点?
        在于其一对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,其二由于是对立的进程,其中一个进程退出,其他还在继续工作,master会启动新的work,从而不影响服务。

    

nginx采用什么设计模式

        采用的异步非阻塞模式,这个后续 会着重的介绍的,当然可以看下epoll 模型



Nginx优点

  1. 更快:单次请求响应快,可以承载大量的并发请求。

  2. 扩展性:nginx是由多个模块组合而成,模块从结构上分为核心模块、基础模块和第三方模块。

  3. 可靠性:在nginx运行的时候master进程在一个woker进程(coredump)挂掉后,可以迅速拉起新的woker进程提供服务。

  4. 低内存:在高并发的情况下,nginx比其他的同类的webserver占用内存更低,而在高并发的时候提高连接数。

  5. 与Apache比较优点:

    • 轻量级,同样起web 服务,比apache 占用更少的内存及资源

    • 静态处理,Nginx 静态处理性能比 Apache 高 3倍以上

    • 抗并发,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数 飙升,从而拒绝服务的现象


    Nginx安装

    一、安装前的准备的工作:

    1. 系统:CentOS

    2. Gcc : yum install –y gcc-c++ (编译C/C++的编译器)

    3. PCRE : yum install –y prce pcre-devel  (正则使用的类库)

    4. zlib : yum install -y zlib zlib-devel (nginx.conf 配置 gzip on:将HTTP相应的信息进行gzip压缩)

    5. OpenSSL : yum install -y openssl openssl-devel

    6. 下载 nginx 源码包 :http://nginx.org/en/download.html

    7. 调整Linux相关参数

      1. fs.file-max = 999999

        #这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直接限制最大并发连接数,需根据实际情况配置。

      2. net.ipv4.tcp_tw_reuse = 1

        # 1:允许将TIME-WAIT状态的socket重新用于新的TCP连接,这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。

      3. net.ipv4.tcp_keepalive_time = 600

        #当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置得小一些,可以更快地清理无效的连接。

      4. net.ipv4.tcp_fin_timeout = 30

        #当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间。

      5. net.ipv4.tcp_max_tw_buckets = 5000

        #操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180 000,过多的TIME_WAIT套接字会使Web服务器变慢。

      6. net.ipv4.ip_local_port_range = 1024 61000

        #定义了在UDP和TCP连接中本地(不包括连接的远端)端口的取值范围。

      7. net.ipv4.tcp_rmem = 4096 32768 262142

        #定义了TCP接收缓存(用于TCP接收滑动窗口)的最小值、默认值、最大值。

      8. net.ipv4.tcp_wmem = 4096 32768 262142

        #定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。

      9. net.ipv4.tcp_syncookies = 1

        #用于解决TCP的SYN攻击。(对于nginx的性能方面没有太多的压力)

      10. net.ipv4.tcp_max_syn.backlog=1024

        #表示TCP三次握手建立阶段接收SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。

      11. net.core.netdev_max_backlog = 8096

        #当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。

      12. net.core.rmem_default = 262144

        #表示内核套接字接收缓存区默认的大小。

      13. net.core.wmem_default = 262144

        #表示内核套接字发送缓存区默认的大小。

      14. net.core.rmem_max = 2097152

        #表示内核套接字接收缓存区的最大大小。

      15. net.core.wmem_max = 2097152

        #表示内核套接字发送缓存区的最大大小。

      16. 需要注意:

        参数wmem_max的设置,需要平衡物理内存的总大小、Nginx并发处理的最大连接数量(由nginx.conf中的worker_processes和worker_connections参数决定)而确定。 当然,如果仅仅为了提高并发量使服务器不出现Out Of Memory问题而去降低滑动窗口大小,那么并不合适,因为滑动窗口过小会影响大数据量的传输速度。 rmem_default、wmem_default、rmem_max、wmem_max这4个参数的设置需要根据我们的业务特性以及实际的硬件成本来综合考虑。

    8. 使用./configure --help查看帮助

      ./configure --help 或者安装一个第三方软件包(bash-completion)手动编译时可以快速查看支持的参数

      1. --conf-path #设置nginx的配置文件所在的路径需要指明配置文件的文件名(默认为安装目录下的conf/nginx.conf)

      2. --error-log-path #设置nginx的错误日志文件所在的路径需要指明日志文件的文件名(默认为安装目录下的logs/error.log)

      3. --group #设置nginx运行时以什么组来运行worker进程(默认为nobody组)

      4. --user #设置nginx运行时以什么用户来运行worker进程(默认为nobody用户)

      5. --prefix #指明nginx的安装所在路径

      6. --sbin-path #指明nginx的sbin目录所在的目录(默认为安装目录下sbin/nginx)

      7. --pid-path #指明nginx的pid文件所在的路径需要指明pid文件名(默认为安装目录下的logs/nginx.pid)

      8. --lock-path #指明nginx的lock文件所在的路径

      9. --http-log-path # 指明nginx的访问文件所在路径(默认为安装目录下的log/access.log)

      10. --with-http_gzip_static_module #启用gzip压缩模块

      11. --with-http_ssl_mdule # 启用ssl模块

    9. configure下 ./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --http-log-path=/usr/local/nginx/logs/access.log --user=nginx --group=nginx --error-log-path=/usr/local/nginx/logs/error.log --pid-path=/usr/local/nginx/var/nginx.pid --lock-path=/usr/local/nginx/var/nginx.lock --with-http_gzip_static_module --with-http_ssl_module

    10. make && make install 哦呵呵 最不喜欢的事情这里有时会报错,然后就是头疼了!

    然后就OK了 !

    共有 人打赏支持
    粉丝 2
    博文 1
    码字总数 2846
    ×
    Alex_Pan
    如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
    * 金额(元)
    ¥1 ¥5 ¥10 ¥20 其他金额
    打赏人
    留言
    * 支付类型
    微信扫码支付
    打赏金额:
    已支付成功
    打赏金额: