文档章节

Nginx 的简单了解 (一)

Alex_Pan
 Alex_Pan
发布于 2015/08/26 12:41
字数 2846
阅读 95
收藏 0
点赞 0
评论 0

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了 !

    © 著作权归作者所有

    共有 人打赏支持
    Alex_Pan
    粉丝 1
    博文 1
    码字总数 2846
    作品 0
    海淀
    程序员
    PHP水平自测评定

    这些天看了下php等级水平的评定,又看到了前进的方向。 分享下,这样和我曾经一样迷茫的phper不用迷茫了。 0级:(没有计算机编程基础,在培训学校里培训了三个月会php或者以前搭建过网站,又...

    熊猫88
    2016/01/31
    207
    0
    FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块

    转载请注明来自“诗商·柳惊鸿 Poechant 的CSDN博客”。 原文地址:FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块 1、Nginx的FastDFS模块什么作用? 我们在使用FastDFS部署一个分...

    晨曦之光
    2012/04/24
    1K
    0
    PHP开发程序员的学习路线

    兄弟连PHP培训,简单为大家梳理了每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标。 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操...

    xdl刘涛
    2016/08/11
    20
    0
    PHP 程序员的技术成长规划

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做...

    oschina
    2016/05/16
    4.3K
    34
    Mac OSX 10.9搭建nginx+mysql+php-fpm环境

    安装homebrew homebrew是mac下非常好用的包管理器,会自动安装相关的依赖包,将你从繁琐的软件依赖安装中解放出来。安装homebrew也非常简单,只要在终端中输入: homebrew的常用命令: 想了解更...

    abing_hu
    2014/01/04
    0
    7
    Nginx学习指南之循序渐进(一)

    Nginx学习指南之循序渐进(一) 一、简介 Nginx(‘engine x’)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx 是由俄罗斯的程序设计师lgor sysoev所开发,将...

    晨风微凉
    06/28
    0
    0
    Nginx动静分离实现负载均衡(在Debian环境)

    前期准备 使用Debian环境。安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等。 Nginx.conf配置 基本配置这个文件,就可以实现负载均衡了。但是里面的各种关系要了解就比较麻烦了。...

    寰宇01
    06/28
    0
    0
    Nginx从上路到翻车(一)Nginx初识

    趁着闲赋在家,整理一下自己的思路,首先是Nginx方面,非常感谢Nginx高性能服务这本书给我提供的帮助,以下的内容呢相当于自己的读书笔记。 一 Nginx ("engine x") 初识 1.官方网站:http://...

    pheraoh
    2017/05/23
    0
    0
    haproxy实现的web反向代理,动静分离,以及基于keepalived实现的haproxy的高可用

    haproxy于Nginx一样都是做反向代理,但是与其相比,haproxy更专注于web代理。HAProxy是单进程多请求,也支持多进程,HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。 haproxy功...

    chinahaike
    2014/05/02
    0
    0
    如何用Systemd和Nginx部署Node.js应用程序

    如何用Systemd和Nginx部署Node.js应用程序 介绍 当部署一个网络应用程序到一个Droplet时,使用开发过程中用到的相同的设置是很有诱惑的,比如开启服务器时通过在终端运行 “ruby app.rb” 或...

    samday
    2014/04/24
    0
    0

    没有更多内容

    加载失败,请刷新页面

    加载更多

    下一页

    Python PIPEs

    https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm

    zungyiu
    4分钟前
    0
    0
    gRPC学习笔记

    gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

    OSC_fly
    23分钟前
    0
    0
    Docker Mac (三) Dockerfile 及命令

    Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

    ___大侠
    50分钟前
    0
    0
    Android Studio+NDK+Cmake 移植FFmpeg-4.0.2命令行工具

    一、编译 参考大神的帖子,亲测一次编译成功:https://blog.csdn.net/bobcat_kay/article/details/80889398 鉴于以前查文档的经验,这里附上编写例子的时间:2018年7月22日 我用的是ubantu,...

    她叫我小渝
    51分钟前
    0
    0
    mysql创建数据库

    登录MYSQL mysql -u root -p 脚本创建数据库WeChat,并制定默认的字符集是utf8mb4。 CREATE DATABASE Wechat DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all......

    niithub
    今天
    0
    0
    svn: Unable to connect to a repository URL 的解决方案

    错误图示: 解决办法:清除本地保存的授权信息; 1:右键点击本地文件夹,选择设置; TortoiseSVN -> Settings 2:在弹出的对话框中选择 Saved Data, 右侧选择:授权地方清理所有。 然后点确...

    宁哥实战课堂
    今天
    1
    0
    sleep与wait的区别

    Thread.sleep(XXX)方法消耗CPU吗? 这个知识点是我之前认识一直有错误的一个知识点,在我以前的认识里面,我一直认为Thread.sleep(1000)的这一秒钟的时间内,线程的休眠是一直占用着CPU的时间...

    码代码的小司机
    今天
    1
    0
    20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

    本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

    海博1600
    今天
    1
    0
    Mybatis收集配置

    一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

    星痕2018
    今天
    1
    0
    centos7设置以多用户模式启动

    1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

    haha360
    今天
    1
    0

    没有更多内容

    加载失败,请刷新页面

    加载更多

    下一页

    返回顶部
    顶部