0°

Nginx原理特性详解及编译部署Nginx

Nginx简介

传统上基于进程或者线程模型架构的Web服务通过进程或者线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要实现备好其运行环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作需都要占用CPU,而且过多的进程/线程还会带来线程抖动或者频繁上下文切换,系统性能也会由此进一步下降。

另一种高性能Web服务器/Web反向代理服务器/邮件服务器——Nginx,Nginx的主要特点就是其高性能以及对物理计算资源的高密度利用,因此采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,Nginx采用模块化、事件驱动、异步、单线程及阻塞的架构,并大量采用了多路复用及时间通知机制。在Nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环(run-loop)机制处理,而每个worker可以并行处理数千个并发连接以及请求。

Nginx是工作在七层协议上应用层的应用。

Nginx架构


图解:

  1. Nginx主进程Master来管理子进程,每个子进程Worker通过HTTP/HTTPS协议来处理多个客户端请求。为什么每个子进程可以处理多个客户端请求的原因是因为在网络IO中使用了kevent/epoll/select模型实现了网络的多路管理和使用;三种机制模型,不过主要是使用epoll机制来实现的。更多kevent/epoll/select模型知识点击“传送门”

  2. 如果Nginx为代理服务器,子进程Worker接收到客户端的请求后会转发给后端应用,如通过HTTP协议传给Web server;通过FastCGI协议发送给后端Application server(如php等);通过memcache协议来把请求转发给Memcached server;众多server都可以称为后端服务器,可以统一被称为Backend。

  3. 如果Nginx反代服务器启用了缓存功能,则Nginx直接去调用内核空间去本地磁盘进行读取缓存信息,拿到缓存数据后直接返回给客户端,从而少了一层转发,也加快了数据返回速度。Nginx缓存功能需要两个进程来管理,两个进程来管理Cache loader(缓存项)、Cache manager(缓存管理器)。

  4. 整个Nginx大概利用了这几种特性:
    1)Event-driven(事件驱动)
    2)Asynchronous(异步)
    3)Non-blocking(非阻塞模型)

  5. 对于磁盘来讲,它可以支持以下模型:
    1)Advanced I/O(高级IO)
    2)sendfile
    3)AIO(AIO为五种I/O模型中的异步IO) 五种模型知识讲解“传送门”
    4)mmap etc(内存映射)

Nginx工作原理

Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行,其特权用户身份可以在Nginx主配置文件内定义"user nginx nginx;"字段,第一个nginx代表nginx的worker进程的运行用户,第二个代表用户组。

Nginx进程功能

Nginx进程分为Master主进程和Worker子进程组成
主进程Master主要完成以下工作:

  1. 读取并验证配置文件信息
  2. 创建、绑定及关闭套接字
  3. 启动、终止及维护worker进程的个数
  4. 无须终止服务而重新配置工作特性
  5. 可以不关闭进程进行版本升级,俗称“平滑升级”
  6. 重新打开日志文件
  7. 编译嵌入式perl脚本

子进程Worker主要完成以下工作

  1. 接收、传入、处理来自客户端的连接及请求
  2. 提供反向代理以及过滤功能
  3. Nginx任何能完成的其他任务

注:worker进程数量设置
worker可在nginx主配置文件中"worker_processes auto;" 字段配置,auto代表自动分配进程数量,一般自动分配进程数量是与nginx的cpu个数一致。我们在生产环境中一般设置Nginx进程数只有两个选择。
1)Nginx的worker进程数等于CPU核心数
2)Nginx的worker进程数小于CPU核心数
因为进程数大于了CPU的核心数之后就没有多余的CPU核心来承担worker进程的工作了

Nginx组成

Nginx的代码有一个核心和一系列模块组成,核心主要用于提供Web Server的基本功能,以及Web和Mail的反向代理功能;还用于启用网络协议,创建必要的运行环境以及确保不同模块之间平滑地进行交互。不过大多数协议相关的功能和某应用特有的用能都是由Nginx的模块而实现。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了Nginx和HTTP功能。
事件模块主要用于提供OS独立的事件通知机制(如kqueue或者epoll模型)。协议模块则负责实现Nginx通过HTTP(超文本传输协议)、SSL(安全套接层)、TLS(安全传输层)、SMTP(简单邮件传输协议)、IMAP(邮件访问协议)、POP3(邮局协议版本3)与对应的客户端建立回话。在Nginx内部,进程间的通信时通过模块的pipeline或chain而实现;换句话说,每个功能或者操作都有一个模块来实现。

Nginx功能

Nginx基础功能

  1. 处理静态文件、索引文件以及自动索引
  2. 反向代理加速(无缓存)
  3. FastCGI、简单负载均衡及容错
  4. 模块化结构。过滤器包括gzipping、byte、ranges、chunked responses、SSI-fitter,在SSI过滤器中,到同一个proxy或者FastCGI的多个字请求并发处理
  5. SSL和TLS和SNI认证的支持

Nginx IMAP/POP3代理服务功能

  • 使用外部HTTP认证服务器重定向用户到IMAP/POP3后端
  • 使用外部HTTP认证服务器认证用户后连接重定向到内部的SMTP后端
  • 认证方法:
  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5
  • IMAP: IMAP LOGIN
  • SMTP: AUTH LOGIN PLAIN CRAM-MD5
  • SSL 支持
  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持

Nginx的特性

  • 基于IP和名称的虚拟主机服务
  • Memcached的GET接口
  • 支持keep-alive和管道连接
  • 灵活简单的配置
  • 重新配置和在线平滑升级
  • 可定制的访问日志,日志写入缓存,以及快捷的日志回卷
  • 4xx-5xx状态码重定向
  • 基于PCRE的rewrite重写模块
  • 基于客户端IP地址和HTTP基本认证和访问控制
  • PUT、DELETE、MKCOL方法
  • 支持FLV(Flash视频)
  • 带宽限制
  • 工作在OSI参考模型7层的应用层,可针对http应用做分流策略
  • Nginx对网络依赖较小,端口能通就能进行负载均衡功能
  • 对后端服务器简单的健康检测
  • 可以通过ip_hash来进行Session保持
  • 支持高并发,最好的并发为3万,测试4.5万的时候,失败连接数达到了1.5w左右
  • 支持异步网络I/O事件模型epoll(Linux内核2.6以上才支持)

Nginx与其它软件对比

Apache的特点

  • Apache2.2版本非常稳定强大,据官方说,Apache2.4版本性能更强
  • Prefork模式取消了进程创建开销,性能很高
  • 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上
  • 高并发时消耗系统资源相对多一些
  • 基于传统的select模型,高并发能力有限
  • 支持扩展库,可通过DSO、apxs方法编译安装额外的插件功能,不需要重新编译Apache
  • 功能多,更稳定,更安全,插件也多
  • 市场份额在逐年递减

Nginx的特点

  • 基于异步网结I/O模 型(epollk kqueue)
  • 具备支持高性能,高并发的特性,并发连接可达数万
  • 对小文件(小于1 MB的静态文件)高并发支持很好,性能很高
  • 不支持类似 Apache的DSO模式、扩展库必须编译进主程序(缺点)
  • 进程占用系统资源比较低
  • 支持Web、反向Proxy、Mail三大重点功能,幷且都很优秀
  • 市场份额在逐年快速增加

为什么选择Nginx

  • 在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型。
  • Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.
  • Nginx 是一个安装非常的简单 , 配置文件 非常简洁(还能够支持perl语法),Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够 不间断服务的情况下进行软件版本的升级 。
  • Nginx 的诞生主要解决C10K问题。

安装依赖开发组件

  • pcre-devel: 扩展的正则表达式引擎,为了使Nginx处理更复杂的正则表达式机制
  • openssl-devel:–with-http_ssl_module使用该模块必需装openssl库,来实现http支持https协议
  • zlib-devel:zlib库是网络通信压缩库,ngx_http_gzip_module(gzip压缩模块)所必需的
yum install gcc-c++ libtool -y
yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel -y

创建nginx用户组

Nginx的Master主进程以root用户身份运行,而worker子进程我们指定它为nginx用户运行

groupadd nginx 
useradd -d /home/nginx -g nginx -s /sbin/nginx nginx

下载并编译安装

1.下载Nginx

wget http://nginx.org/download/nginx-1.16.1.tar.gz

2.编译安装Nginx

tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/run/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--with-pcre \
--user=nginx \
--group=nginx \
--with-stream \
--with-threads \
--with-file-aio \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module 
make && make install

Nginx文件组成

tree /usr/local/nginx/ | grep -v 'default'
tree /usr/local/nginx/
/usr/local/nginx/
├── conf
│   ├── fastcgi.conf
│   ├── fastcgi.conf.default
│   ├── fastcgi_params
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── mime.types.default
│   ├── nginx.conf
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── html
│   ├── 50x.html
│   └── index.html
├── logs
├── run
└── sbin
    └── nginx

5 directories, 18 files

一级目录

  1. conf:配置文件目录
  2. html:网页文件目录
  3. logs:日志存储目录
  4. run:编译时指定的nginx pid目录
  5. sbin:程序脚本目录

二级目录

  1. conf/nginx.conf:主配置文件
  2. conf/{fastcgi scgi uwsgi}:这四个文件是相关协议配置文件
  3. conf/mime.types:支持的mime类型
  4. conf/win-utf:设置nginx的字符编码

Nginx主程序管理命令

Nginx启动文件目录:/usr/local/nginx/sbin/nginx,通过-h来查看帮助

 /usr/local/nginx/sbin/nginx -h
nginx version: nginx/1.16.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/local/nginx/)
  -c filename   : set configuration file (default: /usr/local/nginx/conf/nginx.conf)
  -g directives : set global directives out of configuration file

-v显示Nginx版本号,不过-h和-V也都能显示

/usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.16.1

-V显示Nginx配置选项,即是我们在编译Nginx时添加的参数

/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/run/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --with-pcre --user=nginx --group=nginx --with-stream --with-threads --with-file-aio --with-http_v2_module --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module

-t检测Nginx配置文件是否有语法错误

正确示范
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

错误示范
/usr/local/nginx/sbin/nginx -t
nginx: [emerg] unexpected end of file, expecting ";" or "}" in /usr/local/nginx/conf/nginx.conf:120
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

-T检测Nginx配置文件语法,然后进行输出配置文件信息并关闭

/usr/local/nginx/sbin/nginx -T

-s向主进程发送信号,分别为:stop(停止), quit(退出), reopen(重新打开日志文件), reload(重载)

/usr/local/nginx/sbin/nginx 
/usr/local/nginx/sbin/nginx -s reload
/usr/local/nginx/sbin/nginx -s reopen
/usr/local/nginx/sbin/nginx -s quit
/usr/local/nginx/sbin/nginx -s stop

-p指定Nginx安装路径

/usr/local/nginx/sbin/nginx -p /usr/local/nginx 

-c指定Nginx配置文件

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

-g命令指定Nginx全局配置文件指令启动nginx

/usr/local/nginx/sbin/nginx -g "user nginx;"
ps -ef|grep nginx
root      9840     1  0 13:29 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -g user nginx;
nginx     9841  9840  0 13:29 ?        00:00:00 nginx: worker process
root      9843  6673  0 13:29 pts/0    00:00:00 grep --color=auto nginx

Nginx加入环境变量

cat > /etc/profile.d/nginx.sh <<EOF
export PATH=\$PATH:/usr/local/nginx/sbin
EOF
source /etc/profile

Nginx默认配置文件

以下内容过滤了以空行和注释为首的行

[root@CentOS7-node1 /]# cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

nginx.conf主配置文件结构:

main block:主配置段,也即全局配置段;
    event {
        ...
    }:事件驱动相关的配置;
http {
    ...
}:http/https 协议相关的配置段;
mail {
    ...
}
stream {
    ...    四层代理相关配置段
}

main block:主配置文件段,又称全局配置段,在该段的配置会应用到整个Nginx服务器内
http:http字段内的配置会应用到所有主机上
mail:邮件功能段
stream:四层代理功能段

启动测试Nginx站点

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx
curl http://127.0.0.1 -I
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Fri, 20 Mar 2020 05:45:18 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Fri, 20 Mar 2020 05:22:06 GMT
Connection: keep-alive
ETag: "5e7452fe-264"
Accept-Ranges: bytes

nginx默认监听80端口

客户端测试访问







「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Nginx
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论