1.基本概念
与Apache软件类似,Nginx(“engine x”)是一个开源的、支持高性能、高并发的WWW服务和代理服务软件。
1.1 基本特性
重要特性
·可针对静态资源高速高并发访问及缓存。
·可使用反向代理加速,并且可进行数据缓存。
·具有较完善的负载均衡、节点健康检查和容错功能。
·支持远程FastCGI服务的缓存加速。
·支持FastCGI、Uwsgi、SCGI、and Memcached Servers的加速和缓存。
·支持SSL、TLS、SNI。
·具有模块化的架构:过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI及图像缩放等功能。在SSI过滤器中,一个包含多 个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。
其他WWW服务特性
支持基于名字、端口以及IP的多虚拟主机站点。
·支持Keep-alive和pipelined连接。
·可进行简单、方便、灵活的配置和管理。
·支持修改Nginx配置,并且在代码上线时,可平滑重启,不中断业务访问。
·可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志。
·可利用信号控制Nginx进程。
·支持3xx-5xx HTTP状态码重定向。
·支持rewrite模块,支持URI重写及正则表达式匹配。
·支持基于客户端IP地址和HTTP基本认证的访问控制。
·支持PUT、DELETE、MKCOL、COPY以及MOVE等较特殊的HTTP请求方法。
·支持FLV […]
特色及优点
支持高并发:能支持几万并发连接(特别是静态小文件业务环境下)。
资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS功能。
具备Squid等专业缓存软件等的缓存功能。
支持异步网络IO事件模型epoll(Linux 2.6+)。
最新版同时支持HTTP、TCP、UDP、邮件服务等多种协议服务代理能力。
1.2 基本功能
1.2.1 Nginx Web服务介绍
主要应用场景
·使用Nginx运行HTML、JS、CSS、小图片等静态数据(此功能类似Lighttpd软件)。
·使用Nginx运行MP4、FLV等视频流媒体服务。
·Nginx结合FastCGI运行PHP等动态程序(常用fastcgi_pass方式)。
·Nginx结合Tomcat/Resin等支持Java动态程序(常用proxy_pass方式)。
·Nginx结合Uwsgi等支持Python动态程序(常用uwsgi_pass方式)。
同类综合对比
Apache
·2.2版本非常稳定强大,据官方说,其2.4版本性能更强。
·Prefork模式取消了进程创建开销,性能很高。
·处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在于Apache本身上。
·高并发时消耗系统资源相对多一些。
·基于传统的select模型,高并发能力有限。
·支持扩展库,可通过DSO、apxs方法编译安装额外的插件功能,不需要重新编译Apache。
·功能多,更稳定,更安全,插件也多。
·市场份额在逐年递减,截至2019年4月已经降到43%。
Nginx
·基于异步网络I/O模型(epoll、kqueue)。
·具备支持高性能,高并发的特性,并发连接可达数万。
·对小文件(小于1MB的静态文件)高并发支持很好,性能很高。
·不支持类似Apache的DSO模式,扩展库必须编译进主程序(缺点)。
·进程占用系统资源比较低。
·支持动静Web、反向代理、缓存三大重点功能,并且都很优秀。
·市场份额在逐年快速增加,截至2019年4月已经升到42%。
Lighttpd
·基于异步网络I/O模型,性能、并发都和Nginx相近。
·扩展库是SO模式,比Nginx灵活。
·目前国内的使用率比较低,安全性没有Apache和Nginx好。
·通过插件(mod_secdownload)可实现文件URL地址加密(优点)。
·社区不活跃,市场份额较低,截至2019年4月已经降到0.1%。
同类性能对比
静态小文件:Nginx≈Lighttpd > Apache
动态数据:三者相差不大
1.2.2 Nginx总体性能比Apache高的原因
Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached软件都采用的是epoll模型。
第一个比喻
假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。“select版”宿管人员会带着你的朋友挨个房间去找,直到找到你为止。而“epoll“select版”宿管人员会带着你的朋友挨个房间去找,直到找到你为止。而“epoll版”宿管人员会先记下每位入住同学的房间号,当你的朋友来找你时,她只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满宿舍楼找人。如果同时来了100个人,都要找自己住在这栋楼的同学,select版和epoll版宿管人员,谁的效率更高,就很明显了。
第二个比喻
select的调用复杂度是线性的,即O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要上厕所比作网络I/O事件,select的作用就好比这个保姆挨个询问每个孩子:你要上厕所吗?如果孩子回答是,保姆把孩子领出来放到另外一个地方。当询问完所有的孩子之后,保姆领着这些要上厕所的孩子去厕所(处理网络I/O事件)。
还是以保姆照看一群孩子为例,在epoll机制下,保姆不再需要挨个询问每个孩子是否需要上厕所。取而代之的是,每个孩子如果需要上厕所,自己主动去事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去厕所(网络事件处理)。因此,epoll的这种机制,能够高效地处理成千上万的并发连接,而且性能不会随着连接数的增加而下降太多。
select的处理流程类似于全部遍历后再返回。
epoll的处理流程类似于以索引引导再返回。
Apache select和Nginx epoll的区别
指标 select epoll
性能 随着连接数增加,性能急剧下降。处理成
千上万并发连接数时,性能很差。 随着连接数增加,性能没有下降。处理成
千上万并发连接时,性能很好。
连接数 连接数有限制,能处理的最大连接数不超过1024。如果要处理超过1024个连接,则需要修改FD_ _SETSIZE宏,并重新编译。 链接数无限制
内在处理机制 线性轮询 回调
开发复杂性 低 中
1.3 相关功能
1.4 组织结构
web请求处理机制:
1、 多进程方式:服务器每接收到一一个客户端请求就有服务器的主进程生成一个子进程响应客
户端,直到用户关闭连接,这样的优势是处理速度快,各子进程之间相互独立,但是如果访问过大会导致服务器资
源耗尽而无法提供请求。
2、 多线程方式:与多进程方式类似,但是每收到一一个客户端请求会有服务进程派生出一
个线程来个客户方进行交互,- 个线程的开销远远小于一 个进程,因此多线程方式在很大程度减轻 了web服务 器对
系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一一个进程内工作的时候,可以相互访问同样的
内存地址空间,所以他们相互影响,另外一-旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方
式,需要间隔一-段时间就重启一 次才能稳定。
1.4 .1 组织模型
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
主进程(Master process)的功能:
读取Nginx配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程(woker process)的功能:
接受处理客户的请求
将请求以此送入各个功能模块进行处理
I0调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
1.4 .2 进程间通信
工作进程是有主进程生成的,主进程使用fork()函数,在Nginx服 务器启动过程中主进程根据配置文件决定启动工作
进程的数量,然后建立一-张全局的工作表用于存放当前未退 出的所有的工作进程,主进程生成工作进程后会将新生
成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进程,该管道与普通的管道不同,它
是由主进程指向工作进程的单项通道,包含了主进程向工作进程发出的指令、工作进程ID、工作进程在工作进程表
中的索引和必要的文件描述符等信息。主进程 与外界通过信号机制进行通信,当接收到需要处理的信号时,它通
过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的
时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交
互。
工作进程之间的通信原理基本上和主进程与工作进程之间的通信是一样的, 只要工作进程之间能够取得彼此的信
息,建立管道即可通信,但是由于工作进程之间是完全隔离的,因此一 个进程想要直到另外-一个进程的状态信息就只
能通过主进程来设置了。
为了实现工作进程之间的交互,主进程在生成工作进程只之后,在工作进程表中进行遍历,将该新进程的ID以
及针对该进程建立的管道句柄传递给工作进程中的其他进程,为工作进程之间的通信做准备,当工作进程1向工作进
程2发送指令的时候,首先在主进程给它的其他工作进程工作信息中找到2的进程ID,然后将正确的指令写入指向进程
2的管道,工作进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了工作进程之间的通信。
1.5 模块功能
nginx高度模块化,但其模块早期不支持DSO机制; 1.9.11版本支 持动态装载和卸载模块分类:
1.5.1 核心模块
核心模块:是Nginx服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进
程管理等核心功能
1.5.2 标准HTTP模块
标准HTTP模块:提供HTTP协议解析相关的功能,比如:端口配置、网页编码设置、HTTP响应头设置等等
1.5.3 可选HTTP模块
可选HTTP模块:主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,比如:Flash多媒体传输、解析GeolP请求、网络传输压缩、安全协议SSL支持等
1.5.4 邮件服务模块
邮件服务模块:主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持
1.5.5 第三方模块
第三方模块:是为了扩展Nginx 服务器应用,完成开发者自定义功能,比如: Json支持、 Lua 支持等
1.6 部署模式
版本划分:
Mainline version(主要开发版本,其实就是还处于开发版)
Stable version(当前最新稳定版)
Legacy versions(旧的稳定版)
安装方式
Nginx安装可以使用yum或源码安装(推荐源码)
一是yum的版本比较旧,二是编译安装可以更方便自定义相关路径,三是使用源码编译可以自定义相关功能
更方便业务的上的使用,源码安装需要提前准备标准的GCC编译器
GCC的全称是( GNU Compiler collection),其有GNU开发,并以GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++, Fortran, pascal, objective-C, java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一 些模块需要依赖第三方库,比如pcre (支持rewrite) ,zlib (支持gzip模块) 和openssI (支持ssl模块) 等
1.6.1 yum部署
安装epel依赖
yum install epel-release -y
安装服务
yum install -y nginx
检查安装
rpm -qi nginx
检查路径
which nginx
查看帮助
nginx -h
验证安装
nginx -t
查看脚本
cat /usr/lib/systemd/system/nginx.service
配置文件
grep -v “#” /etc/nginx/nginx.conf | grep -v “^$”
启动服务
systemctl start ngixn
检查状态
systemctl status ngixn
访问服务
curl 127.0.0.1:80
1.6.2 二进制部署
安装依赖
yum install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel
依赖解释
gcc为GNU Compiler Collection的缩写,可以编译c和C+ +源代码等,它是GNU开发的C和C+ +以及其他很多种语言的编译器(最早的时候只能编译C,后来很快进化成一个编译多种语 言的集合,如Fortran、Pascal、objective-C、Java、 Ada. Go等。 )
gcc在编译C++源代码的阶段,只能编译C++ 源文件,而不能自动和C++程序使用的库链接(编译过程分为编译、链接两个阶段,注意不要和可执行文件这个概念搞混,相对可执行文件来说有三个重要的概念:编译(compile)、链接(1ink) 、加载(1oad) 。源程序文件被编译成目标文件,多个目标文件连同库被链接成一个最终的可执行文件,可执行文件被加载到内存中运行)。因此,通常使用g++ 命令来完成C++ 程序的编译和连接,该程序会自动调用gcc 实现编译。
gcc-c++也能编译C源代码,只不过把会把它当成C+ +源代码,后缀为.c的,gcc把它当作是C程序,而g++当作是C++程序;后缀为. cpp的,两者都会认为是C+ +程序,注意,虽然C++是c的超集,但是两者对语法的要求是有区别的。
automake是一个从Makefile . am文件自动生成Makefile. in的工具。为了生成Makefile.in, automake还需用到per1,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要per1。1ibtoo1是一 款方便生成各种程序库的工具。
pcre pcre-devel:在Nginx编译需要 PCRE(Perl Compatible Regular Expression),因为Nginx 的 Rewrite模块和HTTP 核⼼模块会使⽤到PCRE正则表达式语法。
zlip zlib-devel:nginx启⽤压缩功能的时候,需要此模块的⽀持。
openssl openssl-devel:开启SSL的时候需要此模块的⽀持。
官⽅源码包下载地址:
https://nginx.org/en/download.html
下载源码
cd /usr/local/src/
wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
开始编译(编译是为了检查系统环境是否符合编译安装的要求,⽐如是否有gcc编译⼯具,是否⽀持编译参数当中的模块,并根据
开启的参数等⽣成Makefile)
./configure --prefix=/apps/nginx \ #指定编译的目录
make #编译步骤,根据Makefile⽂件⽣成相应的模块
make install #创建⽬录,并将⽣成的模块和⽂件复制到相应的⽬录:
useradd nginx -s /sbin/nologin -u 2000 #以普通⽤⼾启动nginx
chown nginx.nginx -R /apps/nginx/ #将目录授权给nginx
备注:nginx完成安装以后,有四个主要的⽬录:
conf:该⽬录中保存了nginx所有的配置⽂件,其中nginx.conf是nginx服务器的最核⼼最主要的配置⽂件,其他
的.conf则是⽤来配置nginx相关的功能的,例如fastcgi功能使⽤的是fastcgi.conf和fastcgi_params两个⽂
件,配置⽂件⼀般都有个样板配置⽂件,是⽂件名.default结尾,使⽤的使⽤将其复制为并将default去掉即可。
html:该⽬录中保存了nginx服务器的web⽂件,但是可以更改为其他⽬录保存web⽂件,另外还有⼀个50x的web⽂件是
默认的错误⻚⾯提⽰⻚⾯。
logs:该⽬录⽤来保存nginx服务器的访问⽇志错误⽇志等⽇志,logs⽬录可以放在其他路径,⽐
如/var/logs/nginx⾥⾯。
sbin:该⽬录⽤来保存nginx
验证参数
/apps/nginx/sbin/nginx -V
访问页面
curl 127.0.0.1:80
创建脚本
cat /usr/lib/systemd/system/nginx.service
脚本内容
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
nginx -t
from the cmdline.ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/apps/nginx/sbin/nginx -t
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
验证脚本
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
systemctl status nginx
配置Nginx
Nginx的配置⽂件的组成部分: 主配置⽂件:nginx.conf,⼦配置⽂件 include conf.d/*.conf
fastcgi, uwsgi,scgi等协议相关的配置⽂件
mime.types:⽀持的mime类型,MIME(Multipurpose Internet Mail Extensions)多⽤途互联⽹邮件扩展类
型,MIME消息能包含⽂本、图像、⾳频、视频以及其他应⽤程序专⽤的数据,是设定某种扩展名的⽂件⽤⼀种应⽤程序来
打开的⽅式类型,当该扩展名⽂件被访问的时候,浏览器会⾃动使⽤指定应⽤程序来打开。多⽤于指定⼀些客⼾端⾃定义
的⽂件名,以及⼀些媒体⽂件打开⽅式。
Nginx主配置⽂件的配置指令⽅式:
directive value [value2 …];
注意:
(1) 指令必须以分号结尾
(2) ⽀持使⽤配置变量
内建变量:由Nginx模块引⼊,可直接引⽤
⾃定义变量:由⽤⼾使⽤set命令定义
set variable_name value;
引⽤变量:
MIME参考⽂档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
默认配置
grep -v “#” /apps/nginx/conf/nginx.conf | grep -v "^$”
#全局配置端,对全局⽣效,主要设置nginx的启动⽤⼾/组,启动的⼯作进程数量,⼯作模式,Nginx的PID路径,⽇
志路径等。
user nginx nginx;
worker_processes 1; #启动⼯作进程数数量
events { #events设置快,主要影响nginx服务器与⽤⼾的⽹络连接,⽐如是否允许同时接受多个⽹络连接,使⽤哪
种事件驱动模型处理请求,每个⼯作进程可以同时⽀持的最⼤连接数,是否开启对多⼯作进程下的⽹络连接进⾏序列化
等。
worker_connections 1024; #设置单个nginx⼯作进程可以接受的最⼤并发,作为web服务器的时候最⼤并发数为worker_connections * worker_processes,作为反向代理的时候为(worker_connections * worker_processes)/2
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和⽇志格式定义等绝⼤多数功能和第三⽅模块都可以在这设置,http块可以包含多个server块,⽽⼀个server块中⼜可以包含多个location块,server块可以配置⽂件引⼊、MIME-Type定义、⽇志⾃定义、是否启⽤sendfile、连接超时时间和单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; #作为web服务器的时候打开sendfile加快静态⽂件传输,指定是否使⽤sendfile系统调⽤来传输⽂件,sendfile系统调⽤在两个⽂件描述符之间直接传递数据(完全在内核中操作),从⽽避免了数据在内核缓冲区和⽤⼾缓冲区之间的拷⻉,操作效率很⾼,被称之为零拷⻉,硬盘 >> kernel buffer (快速拷⻉到 kernelsocket buffer) >>协议栈。
keepalive_timeout 65; #⻓连接超时时间,单位是秒
server { #设置⼀个虚拟机主机,可以包含⾃⼰的全局快,同时也可以包含多个location模块。⽐如本虚拟机监听的端⼝、本虚拟机的名称和IP配置,多个server 可以使⽤⼀个端⼝,⽐如都使⽤80端⼝提供web服务
listen 80; #配置server监听的端⼝
server_name localhost; 本server的名称,当访问此名称的时候nginx会调⽤当前serevr内部的配置进程匹配。
location / { #location其实是server的⼀个指令,为nginx服务器提供⽐较多⽽且灵活的指令,都是在location中体现的,主要是基于nginx接受到的请求字符串,对⽤⼾请求的UIL进⾏匹配,并对特定的指令进⾏处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三⽅模块的配置也是在location模块中配置。
root html; #相当于默认⻚⾯的⽬录名称,默认是相对路径,可以使⽤绝对路径配置。
index index.html index.htm; #默认的⻚⾯⽂件名称
}
error_page 500 502 503 504 /50x.html; #错误⻚⾯的⽂件名称
location = /50x.html { #location处理对应的不同错误码的⻚⾯定义到/50x.html,这个跟对应其server中定义的⽬录下。
root html; #定义默认⻚⾯所在的⽬录
}
#和邮件相关的配置
#mail {
#tcp代理配置,1.9版本以上⽀持
#stream {
#导⼊其他路径的配置⽂件
#include /apps/nginx/conf.d/*.conf
}