Nginx(engine x)是一个具有高性能的【HTTP】和【反向代理】的【Web服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】。
-
HTTP:是超文本传输协议的缩写,是用于从Web服务器传输超文本到本地浏览器的传输协议,也是互联网上应用最为广泛的一种网络协议。HTTP是一个客户端和服务端请求和应答的标准,客户端是终端用户,服务端是网站,通过使用Web浏览器、网络爬虫或其他工具,客户端发起一个到服务端上指定端口的HTTP请求。
-
正向代理:替真正的client向server申请服务的是正向代理;正向代理是client的行为,目的是为了伪造出client身份,常用在代理ip的使用。
-
反向代理:替真正的server给client提供服务的是反向代理;反向代理是server方的行为,目标是伪造出server身份,反向代理常用于前台nginx转发后台主服务器的架构。
-
Web服务器:也叫做网页服务器,主要功能是为用户提供网上信息浏览服务。
-
POP3/SMTP/IMAP代理服务器:POP3(Post Offic Protocol 3)邮局协议的第三个版本;SMTP(Simple Mail Transfer Protocol)简单邮件传输协议;IMAP(Internet Mail Access Protocol)交互式邮件存取协议。Nginx也可以作为电子邮件代理服务器。
- 速度更快、并发更高
单次请求或者高并发请求的环境下,Nginx都会比其它Web服务器响应的速度更快。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。 - 配置简单、扩展性强
Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块。如果需要完全可以开发服务于自己业务特性的定制模块。 - 高可靠性
Nginx采用的是多进程模式运行,其中有一个master主进程和多个worker进程,worker进程的数量可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去“拉起”新的worker进程提供服务。 - 热部署
互联网项目需要以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。 - 开源
Nginx是开源的项目,因此可以免费的将其应用在商业领域,而且还可以在项目中直接修改Nginx的源码来定制自己的特殊要求。
通过Nginx官网获取相应的版本下载。
- 确认centos的内核
准备一个内核为2.6及以上版本的操作系统,因为Linux2.6及以上内核才支持epoll,而Nginx需要解决高并发压力问题时需要用到epoll。
- 确认关闭防火墙
建议关闭防火墙,可以省掉后续诸多问题。 - 确认停用selinux
建议关闭selinux,可以省掉后续诸多问题。
如果不是disabled状态,可以通过修改配置文件vim /etc/selinux/config
来进行设置,修改SELINUX=disabled,然后重启下系统即可生效。
源码安装方式需要提前执行yum install -y gcc pcre pcre-devel zlib zlib-devdl openssl openssl-devel
这条命令,yum安装不需要执行。
-
方案一:Nginx的源码简单安装
-
方案二:Nginx的源码复杂安装
这种安装方式和简单安装的区别在于通过./configure
来对编译参数进行设置./configure --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --modules-path=/usr/local/nginx/modules \ --conf-path=/usr/local/nginx/conf/nginx.conf \ --error-log-path=/usr/local/nginx/logs/error.log \ --http-log-path=/usr/local/nginx/logs/access.log \ --pid-path=/usr/local/nginx/logs/nginx.pid \ --lock-path=/usr/local/nginx/logs/nginx.lock
命令 解释 --prefix=PATH 指向Nginx的安装目录,默认值为/usr/local/nginx --sbin-path=PATH 指向(执行)程序文件(nginx)的路径,默认值为prefix+/sbin/nginx --modules-path=PATH 指向Nginx动态模块安装目录,默认值为prefix+/modules --conf-path=PATH 指向配置文件(nginx.conf)的路径,默认值为prefix+/conf/nginx.conf --error-log-path=PATH 指向错误日志文件的路径,默认值为prefix+/logs/error.log --http-log-path=PATH 指向访问日志文件的路径,默认值为prefix+/logs/access.log --pid-path=PATH 指向Nginx启动后进程ID的文件路径,默认值prefix+/logs/nginx.pid --lock-path=PATH 指向Nginx锁文件的存放路径,默认值为prefix+/logs/nginx.lock -
方案三:yum安装
nginx.repo
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
- 将nginx进程关闭:
./nginx -s stop
- 将安装的nginx进行删除:
rm -rf /usr/local/nginx
- 如果设置了Nginx开机自启的话,需要执行下面命令:
chkconfig nginx off
和rm -rf /etc/init.d/nginx
- yum清理:
yum remove nginx
- 解压Nginx的源码文件后可以看到下面的结构:
目录/文件 解释 auto 存放的是编译相关的脚本 CHANGES 版本变更记录 CHANGES.ru 俄罗斯文的版本变更记录 conf Nginx默认的配置文件 configure Nginx软件的自动脚本程序,作用为:检测环境及根据环境检测结果生成C代码;生成编译代码需要的 Makefile文件 contrib 存放的是几个特殊的脚本文件,其中README中对脚本有着详细的说明 html 存放的是Nginx自带的两个html页面,访问Nginx的首页和错误页面 LICENSE 许可证的相关描述文件 man Nginx的man手册 README Nginx的阅读指南 src Nginx的源代码
-
Nginx的目录结构如下
主要目录/文件 解释 conf Nginx所有配置文件目录 mine.types 记录的是HTTP协议中的Content-Type的值和文件后缀名的对应关系 nginx.conf Nginx的核心配置文件 html 存放Nginx自带的两个html页面 50x.html 访问失败后的失败页面 index.html 访问成功后的默认首页 logs 日志文件存放地,当Nginx启动后,这里会有acess.log、error.log和nginx.pid文件 sbin 存放执行程序文件nginx nginx 用来控制Nginx的启动和停止等相关的命令
在学习Nginx启停命令之前先简单了解一下Nginx是如何工作的。
- Nginx的高性能和其架构模式有关,Nginx默认采用的是多进程的方式来工作的,当在配置文件中进行配置后Nginx即可以一个master进程和多个worker进程的方式来工作。
- master进程主要用来管理worker进程,包含接收外界的信息并将接收到的信息发送给各个worker进程,监控worker进程的状态,当worker进程出现异常退出后,会自动重新启动新的worker进程。
- worker进程是专门用来处理用户请求的,各个worker进程之间是平等的且相互独立,处理请求的机会也是一样的。
通过上面的Nginx的进程模型可以看出,我们作为管理员,只需要通过给master进程发送信号就可以来控制Nginx,这个时候我们需要有两个前提条件,一个是要操作的master进程,一个是信号。
- 要想操作Nginx的master进程,就需要获取到master进程的ID。可以通过以下两种方式来获取:
方式一:通过ps -ef|grep nginx
命令获取;
方式二:在上述关于Nginx的./configure的配置参数时,有一个参数是--pid-path=PATH
默认是/usr/local/nginx/logs/nginx.pid
,可以通过查看该文件来获取Nginx的master进程ID。 - 调用命令为
kill -single PID
信号 作用 TERM/INT 立即关闭整个服务 QUIT master进程会控制所有的worker进程不再接收新的请求,等所有请求处理完后,再把进程都关闭掉 HUP master进程会控制旧的worker不再接收新的请求,等处理完请求后将旧的worker进程关闭掉,然后根据Nginx的配置文件重新启动新的worker进程 USR1 重新打开日志文件,可以用来进行日志切割 USR2 告诉master要平滑升级,这时会重新开启对应的master进程和worker进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在/usr/local/nginx/logs/nginx.pid
,而之前旧的master进程PID会被记录在/usr/local/nginx/logs/nginx.pid.oldbin
文件中,接着再次发送QUIT给旧的master进程,让其处理完请求后进行关闭 WINCH 所有worker不再接收处理新连接,相当于给worker进程发送QUIT指令,注意master进程不会被关闭
此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行Nginx状态的控制,可以通过 ./nginx -h
查看帮助。
把Nginx应用服务配置设置成系统服务,方便对Nginx服务的启动和停止等相关操作,具体实现步骤为:
- 在/usr/lib/systemd/system目录下添加nginx.service,内容如下:
nginx.service
[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=default.target
- 添加完成后如果权限有问题需要进行权限设置
chmod 755 /usr/lib/systemd/system/nginx.service
- 使用系统命令来操作Nginx服务
启动:systemctl start nginx
停止:systemctl stop nginx
重启:systemctl restart nginx
重新加载配置文件:systemctl reload nginx
查看nginx状态:systemctl status nginx
开机启动:systemctl enable nginx
在之前执行Nginx的相关命令时都需要进入到sbin目录下去执行,很是麻烦,在此处可以通过将Nginx命令配置到系统环境中的方式来使得执行Nginx命令可以在任何目录下进行。
- 修改/etc/profile文件,在最后一行添加
export PATH=$PATH:/usr/local/nginx/sbin
- 使之立即生效
source /etc/profile
如果想对Nginx的版本进行更新或者应用新的模块,最简单的做法就是停止当前Nginx服务,然后开启新的Nginx服务,但是这样会导致在一段时间内用户无法访问服务器。为了解决这个问题就需要借助Nginx提供的平滑升级功能,这里有两种方案可以完成不中断Nginx服务的情况下进行升级。
- 环境准备
(1)先准备两个版本的Nginx分别是1.14.2和1.16.1
(2)使用Nginx源码安装的方式将1.14.2版本安装成功并能正确访问到Nginx页面
(3)将Nginx1.16.1进行参数配置和编译,不需要进行安装(不需要执行make install) - 方案一:使用Nginx服务信号进行升级
(1)将1.14.2版本的sbin目录下的nginx进行备份
(2)将Nginx1.16.1安装目录编译后的objs目录下的nginx文件,copy到原来/usr/local/nginx/sbin
目录下
(3)发送信号USR2给nginx的1.14.2版本对应的master进程
(4)发送信号QUIT给nginx的1.14.2版本对应的master进程
(5)查看是否更新成功并在Nginx启动情况下是否能正常访问 - 方案二:使用Nginx安装目录的make命令完成升级
(1)将1.14.2版本的sbin目录下的nginx进行备份
(2)将1.16.1安装目录编译后的objs目录下的nginx文件copy到原来/usr/local/nginx/sbin
目录下
(3)进入安装目录,执行make upgrade
(4)查看是否更新成功并在Nginx启动情况下是否能正常访问