1.什么是nginx?
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师lgor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx相较于Apache\lighttpd具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于Epoll的高效事件模型kqueue.
2.Nginx VS Apache
(1)相同点:
1、都是HTTP服务器软件
2、功能上都采用模块化结构设计
3、都支持通用的语言接口,如PHP、Perl、Python等
4、支持正向、反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输
(2)不同点:
1、Apache处理速度很慢,占用很多内存资源
2、功能上,Apache所有模块支持动静态编译,Nginx模块都是静态编译的
3、对Fcgi的支持:Apache支持的很不好,Nginx支持非常好
4、处理连接方式:Nginx支持epoll,Apache不支持
5、空间使用上:Nginx安装包仅几百K
3.Nginx优势
1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高
2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度
3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源
5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的
6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行
Nginx具有很高的稳定性;支持热部署;代码质量非常高,代码很规范,手法成熟,模块扩展也很容易;采用了一些os提供的最新特性如对sendfile(Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT(Linux 2.4+)的支持,从而大大提高了性能。
4.Nginx多进程模式
nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。
5.Nginx的事件处理机制
nginx采用异步非阻塞事件处理机制。
同步和异步、阻塞与非阻塞:
1、同步与异步:主要是针对应用程序与内核的交互方式而言的:
同步:进程发出数据后,等内核返回响应以后才继续下一个请求,即如果内核一直不返回数据,那么进程就一直等,直到天荒地老,死机error。
异步:进程发出数据后,不等内核返回响应,接着处理下一个请求,Nginx是异步的
2.阻塞与非阻塞
可以理解为内核与IO设备的交互方式,当内核收到进程请求IO数据时候的处理方式
也可以简单理解为内核需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,否则就可以理解为非阻塞
阻塞:IO调用不能立即返回结果,即一个进程发起的IO请求不能得到立即满足时,进程就要一直等到内核响应,内核要把数据从IO设备复制到内核空间,再返回给进程,这是阻塞。
非阻塞:IO调用可以立即返回结果,一个进程发起的IO进程不能立即满足时,不在等待,而是一遍一遍的轮训查看IO是否完成
6.Nginx源码编译
本次实验使用7.5镜像封装的虚拟机作为nginx服务器,ip:172.25.33.1,hostname:server1
(1)官网下载安装包并解压
[root@server1 ~]# tar zxf nginx-1.17.1.tar.gz
[root@server1 ~]# cd nginx-1.17.1/
[root@server1 nginx-1.17.1]# ll
total 748
drwxr-xr-x 6 1001 1001 326 Jul 24 17:31 auto #该目录下的cc是用来编译的
-rw-r--r-- 1 1001 1001 297374 Jun 25 20:19 CHANGES #各版本的差异性
-rw-r--r-- 1 1001 1001 453548 Jun 25 20:19 CHANGES.ru #俄罗斯版上一文件
drwxr-xr-x 2 1001 1001 168 Jul 24 17:31 conf #配置目录,nginx.conf为主配置文件,conf目录下的在编译好之后会到编译指定的目录中
-rwxr-xr-x 1 1001 1001 2502 Jun 25 20:19 configure
drwxr-xr-x 4 1001 1001 72 Jul 24 17:31 contrib
drwxr-xr-x 2 1001 1001 40 Jul 24 17:31 html #默认发布目录
-rw-r--r-- 1 1001 1001 1397 Jun 25 20:19 LICENSE
drwxr-xr-x 2 1001 1001 21 Jul 24 17:31 man
-rw-r--r-- 1 1001 1001 49 Jun 25 20:19 README
drwxr-xr-x 9 1001 1001 91 Jul 24 17:31 src #源码目录
(2)解压目录下修改两个文件
[root@server1 nginx-1.17.1]# vim auto/cc/gcc #在该文件下关闭debug模式,否则会生成debug文件,导致nginx很大
[root@server1 nginx-1.17.1]# vim src/core/nginx.h #在该文件下删掉显示版本号代码,否则在客户端请求时会看到版本号,不安全
(3)解压目录下进行编译
[root@server1 nginx-1.17.1]# ./configure --prefix=/usr/local/nginx --with-file-aio
./configure --prefix=/usr/local/nginx --with-file-aio
[root@server1 nginx-1.17.1]# make && make install
备注:(1)生成了两个文件 在解压目录下 makefile 是告诉怎么编译 怎么运行
objs中间文件 ngx_modulrs.c 编译生成了哪些模块
(2)make clean 清除编译的目录。第一次安装的时候才执行make install ,替换版本的时候不执行,因为会覆盖掉以前的nginx
切换到安装目录下,可以看到生成了四个目录
[root@server1 objs]# cd /usr/local/nginx
[root@server1 nginx]# ll
total 0
drwxr-xr-x 2 root root 333 Jul 24 17:52 conf #conf为配置文件
drwxr-xr-x 2 root root 40 Jul 24 17:52 html #html发布目录
drwxr-xr-x 2 root root 6 Jul 24 17:52 logs #日志目录(access error pid 进程的pid)
drwxr-xr-x 2 root root 19 Jul 24 17:52 sbin #主程序
##nginx启动的时候 会生成的错误日志error.log和连接(access.log,具体信息)日志
[root@server1 nginx]# ./sbin/nginx -v #查看版本号,因为修改了配置所以看不到版本号
nginx version: nginx/
[root@server1 nginx]# ./sbin/nginx -V #看到编译的具体信息
nginx version: nginx/
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
configure arguments: --prefix=/usr/local/nginx --with-file-aio
[root@server1 nginx]#
(4)添加nginx用户,修改主配置文件
[root@server1 sbin]# useradd -s /sbin/nologin nginx
[root@server1 sbin]# id nginx
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)
[root@server1 sbin]# cd ..
[root@server1 nginx]# cd conf
[root@server1 conf]# vim nginx.conf
(5)为使配置文件通过字体颜色可以判断语法错误,进行字体的设置
[root@server1 nginx-1.17.1]# ls
auto CHANGES.ru configure html Makefile objs src
CHANGES conf contrib LICENSE man README
[root@server1 nginx-1.17.1]# cd contrib/
[root@server1 contrib]# ls
geo2nginx.pl README unicode2nginx vim
[root@server1 contrib]# mkdir ~/.vim
[root@server1 contrib]# cp -r vim/* ~/.vim
[root@server1 contrib]# cd /usr/local/nginx/conf
[root@server1 conf]# vim nginx.conf
此时打开配置文件nginx.conf后,字体颜色就改变了
可以根据字体颜色来判断配置的对错
(6)启动nginx
[root@server1 nginx]# ls
conf html logs sbin
[root@server1 nginx]# cd sbin/
[root@server1 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
[root@server1 sbin]# ./nginx #启动Nginx
备注:通过-t检查Nginx服务器配置文件是否有语法错误,可以与-c联用,使输出内容更详细,这对查找配置文件中的语法错误很有帮助,如果检查通过,将显示类似下面的信息: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
使用server2测试nginx主机是否正常访问,可以看到能够访问到其默认发布页面