一、Nginx简介
Nginx,原名engine X(后简称为Nginx)。是俄罗斯一名程序员为提高公司网站性能而研发出来的,于2004年10月份发布第一个公开版本。由于当时互联网技术已经日新月异,Nginx采用epoll事件模型,能够支持异步IO处理机制,所以Nginx处理并发访问的效率相当高。由于其高效的性能,灵活的配置,丰富的模块与第三方库文件,Nginx已经成为当前主流的web服务器之一,同时在反向代理,负载均衡上也很受企业青睐。
1、Nginx特性
高可靠性
Nginx由一个主控进程(master),以及众多的工作进程组成(worker)master主控进程工作内容:
1、读取并验证配置文件
2、创建绑定或关闭套接字
3、启动终止维护worker进程的个数
4、无须重启进程让配置文件的新配置加载
5、完成平滑版本升级
worker子进程工作内容:
1、有的子进程实现缓存加载(在反向代理中实现)
2、响应用户请求
3、实现缓存管理低内存消耗
由于是一个线程响应多个请求,所以对内存的消耗特别低。10000个keep-alive模式下的connection,仅需要消耗2.5M的内存支持热部署
Nginx的配置文件更新、日志文件滚动,或者版本升级不用重启进程支持事件驱动、异步IO(AIO)、mmap(内存映射)
- 支持sendfile,sendfile64
什么是sendfile?
想要理解什么是sendfile那么首先就要理解,数据从磁盘到内存空间的调用过程。
1、将数据从磁盘中读取出来
操作系统要想调用磁盘中的数据,首先要通过进程向内核发起调用请求,系统通过调用read()函数,产生上下文切换,从user mode(用户模式)切换为kernel mode(内核模式),通过DMA(直接内存访问)将数据从磁盘空间拷贝到内核空间。通过read()函数的返回,再次产生上下文切换,将数据从内核空间拷贝到用户空间。这是一次I/O。
2、将数据封装发送出去
进程将数据封装通过调用write()函数产生上下文切换,将数据从用户空间拷贝到内核与socket相关的缓冲区,然后write()函数返回,再次产生上下文切换。DMA将缓冲区的数据拷贝到协议栈,也就是网卡队列中。这是一次网络I/O。
从上述过程中,我们看出,两次IO是很没有必要的,sendfile就是基于这种情况,让内核从磁盘加载完数据之后直接封装成响应报文发送到网卡队列中,这样就减少了一些不必要的IO操作。sendfile只能传输很小的数据量,sendfile64是增强版。
2、Nginx功能
- 静态资源的web服务器
http、pop3、smtp的反向代理服务器
什么是反向代理服务器?
http的工作模式就是所有的用户请求都是通过浏览器直接提交给服务器的。这就造成服务器直接面多众多的客户端,web服务器既要建立连接,维持连接,又要处理请求。这就会造成web服务器压力过大,有的客户端会对服务器端发起攻击的。所以基于这些问题,提出反向代理服务器的概念。
反向代理服务器声称自己是web服务器并且监听在80端口,所有的用户请求都提交给反向代理服务器,反省代理服务器收到用户的请求之后将请求接进用户空间并且解析该请求(代理服务器也有自己的进程,这个进程我们称之为代理进程)判断该用户是否有访问权限。如果没有,直接拒绝。如果有,反向代理服务器也不将用户请求直接转发给web服务器,而是重新封装IP报文之后发给web服务器,并将请求结果又进行重新封装之后发给客户端。在此过程中,客户端并不知道自己请求是一个反向代理服务器什么是正向代理服务器?
正向代理服务器就是客户端能够通过它请求任意网站并且隐藏客户端自身的。可以这样理解,反向代理服务器是保护服务器的,正向代理服务器是保护客户端的
缓存加速、负载均衡
Nginx作为反向代理服务器能够将客户端的请求资源缓存到缓存空间中,如果客户端再次请求该资源,Nginx就不用再次去后端请求web服务器了,而是直接将缓存中的资源取出直接响应客户端。所以,缓存机制在web中是一个非常重要的内容(甚至有专门的缓存服务器),能够快速的响应客户端,以及能够大大减轻后端web服务器的压力。所以有缓存为王的说法。
- 支持FastCGI(fpm, LNMP), uWSGI(Python)等
- 模块化(非DSO机制)、过滤器zip、SSI及图像的大小调整
- 支持SSL
4、Nginx的扩展功能
- 基于名称和IP的虚拟主机
- 支持keepalive
- 支持平滑升级
- 定制访问日志、支持使用日志缓冲区提供日志存储性能
- 支持url rewrite
- 支持路径别名
- 支持基于IP及用户的访问控制
- 支持速率限制,支持并发数限制
5、Nginx的工作模式
非阻塞、事件驱动,由一个master进程生成多个worker线程,每个worker响应n个请求
二、Nginx安装
1、Nginx的编译安装
下载地址:http://nginx.org/
解压文件:
[root@ling ~]# tar xf nginx-1.8.0.tar.gz
查看编译选项
[root@ling ~]# cd nginx-1.8.0
[root@ling nginx-1.8.0]# ./configure --help
--with:表示nginx在编译过程中没有将该选项编译进去,如果需要手动添加
--without: 表示nginx在编译过程中将该选项编译进去,如果不需要手动移除
进行编译与安装
安装之前,解决依赖关系
[root@ling nginx-1.8.0]# yum -y install pcre-devel
[root@ling nginx-1.8.0]# yum -y install openssl-devel
[root@ling nginx-1.8.0]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
--prefix=/usr/local/nginx 安装目录
--conf-path=/etc/nginx/nginx.conf 主配置文件安装目录
--user=nginx 运行Nginx的用户
--group=nginx 组
--error-log-path=/var/run/nginx/nginx.pid 错误日志放置位置
--http-log-path=/var/log/nginx/access.log 访问日志放置位置
--pid-path=/var/run/nginx/nginx.pid
CentOS一般放置在/var/run目录下
--lock-path=/var/lock/nginx.lock 互斥锁
--with-http_ssl_module 默认ssl模块是没有启动起来的
--with-http_stub_status_module nginx的状态页面
--with-http_gzip_static_module 压缩静态内容的压缩模块
--with-http_flv_module 支持流媒体,如果不需要可以不编译
--http-client-body-temp-path=/var/tmp/nginx/client
客户端body的临时存放路径,这个可以不用指定,如果指定了之后一定要手动添加包括这个目录在内的以下三个目录
如果没有指定body的临时存放路径的话,下面三个路径都不用指定
--http-proxy-temp-path=/var/tmp/nginx/proxy
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
安装
[root@ling nginx-1.8.0]# make && make install
2、运行Nginx
Nginx官网为我们提供了很多人性化的设计,可以使用命令进行运行,也可以使用服务脚本进行运行。
1、命令行方式进行运行:
将运行进程添加到PATH环境变量中
[root@ling ~]# vim /etc/profile
export PATH=/usr/local/nginx/sbin:$PATH
[root@ling ~]# . /etc/profile
[root@ling ~]# echo $PATH
/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@ling ~]# nginx -h 打印帮助信息,这里我就不一一解释了
nginx version: nginx/1.8.0
Usage: nginx [-?hvVtq] [-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
-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: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file
如果这里看不明白,在Nginx官网上面也有文档:
https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/
2、配置服务脚本
编译安装Nginx不会提供Nginx的服务配置脚本,但是官网为我们提供了Nginx的脚本模板,根据自己的实际情况自行修改即可。这里以刚才编译安装来举例。
https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/
在CentOS 6中,将文档中的脚本复制到/etc/rc.d/init.d/nginx.conf中,并修改文档中的两个参数:
[root@ling ~]# vim /etc/rc.d/init.d/nginx.conf
nginx="/usr/local/nginx/sbin/nginx"
这个是nginx的主进程所在目录
NGINX_CONF_FILE="/etc/nginx/nginx.con
这个是nginx的主配置文件所在的路径
[root@ling ~]# chkconfig --add nginx
[root@ling ~]# chkconfig --level 3 nginx on | grep nginx
nginx 0:off 1:off 2:off 3:on 4:off 5:off 6:off
[root@ling ~]# service nginx start
在CentOS 7中,服务脚本与CentOS 6有很大的区别。这里的文档不适用于CentOS 7。CentOS 7 请使用以下脚本:
[root@ling run]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/ngxin/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
在上述服务配置脚本中,[Unit]中的After表示在什么服务启动之后启动Nginx,其他的Description与Document随意。最主要的是[Service]中的配置
PDFile: PID所在的文件路径
ExecStart: 启动命令,这里的启动可以自己写一个启动脚本,也可以直接根据二进制程序进行启动,这里我是以二进制程序进行启动的
ExecReload: 重载
ExecStop: 停止
[Install]中的格式一般都是这样的,可以多用户运行
CentOS 7中要将服务配置脚本放置在/lib/systemd/system/目录下,同时修改完服务脚本之后要进行以下操作:
对脚本进行重载
[root@ling run]# systemctl daemon-reload
开启服务
[root@ling run]# systemctl enable nginx
查看服务
[root@ling run]# systemctl list-unit-files | grep nginx
nginx.service static
启动
[root@ling run]# systemctl start nginx