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/localginx --sbin-path=/usr/localginx/sbinginx --modules-path=/usr/localginx/modules --conf-path=/usr/localginx/confginx.conf --error-log-path=/usr/localginx/logs/error.log --http-log-path=/usr/localginx/logs/access.log --pid-path=/usr/localginx/logsginx.pid --lock-path=/usr/localginx/logsginx.lock
命令 | 解释 |
---|---|
--prefix=PATH | 指向Nginx的安装目录,默认值为/usr/localginx |
--sbin-path=PATH | 指向(执行)程序文件(nginx)的路径,默认值为prefix+/sbinginx |
--modules-path=PATH | 指向Nginx动态模块安装目录,默认值为prefix+/modules |
--conf-path=PATH | 指向配置文件(nginx.conf)的路径,默认值为prefix+/confginx.conf |
--error-log-path=PATH | 指向错误日志文件的路径,默认值为prefix+/logs/error.log |
--http-log-path=PATH | 指向访问日志文件的路径,默认值为prefix+/logs/access.log |
--pid-path=PATH | 指向Nginx启动后进程ID的文件路径,默认值prefix+/logsginx.pid |
--lock-path=PATH | 指向Nginx锁文件的存放路径,默认值为prefix+/logsginx.lock |
方案三:yum安装
[nginx-stable]name=nginx stable repobaseurl=http:/ginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https:/ginx.org/keysginx_signing.keymodule_hotfixes=true[nginx-mainline]name=nginx mainline repobaseurl=http:/ginx.org/packages/mainline/centos/$releasever/$basearch/gpgcheck=1enabled=0gpgkey=https:/ginx.org/keysginx_signing.keymodule_hotfixes=true
将nginx进程关闭:.ginx -s stop
将安装的nginx进行删除:rm -rf /usr/localginx
如果设置了Nginx开机自启的话,需要执行下面命令:chkconfig nginx off
和rm -rf /etc/init.dginx
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/localginx/logsginx.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/localginx/logsginx.pid ,而之前旧的master进程PID会被记录在/usr/localginx/logsginx.pid.oldbin 文件中,接着再次发送QUIT给旧的master进程,让其处理完请求后进行关闭 |
WINCH | 所有worker不再接收处理新连接,相当于给worker进程发送QUIT指令,注意master进程不会被关闭 |
此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行Nginx状态的控制,可以通过 .ginx -h
查看帮助。
把Nginx应用服务配置设置成系统服务,方便对Nginx服务的启动和停止等相关操作,具体实现步骤为:
在/usr/lib/systemd/system目录下添加nginx.service,内容如下:
[Unit]Description=nginx web serviceDocumentation=http:/ginx.org/en/docs/After=network.target[Service]Type=forkingPIDFile=/usr/localginx/logsginx.pidExecStartPre=/usr/localginx/sbinginx -t -c /usr/localginx/confginx.confExecStart=/usr/localginx/sbinginxExecReload=/usr/localginx/sbinginx -s reloadExecStop=/usr/localginx/sbinginx -s stopPrivateTmp=true[Install]WantedBy=default.target
添加完成后如果权限有问题需要进行权限设置chmod 755 /usr/lib/systemd/systemginx.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/localginx/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/localginx/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/localginx/sbin
目录下
(3)进入安装目录,执行make upgrade
(4)查看是否更新成功并在Nginx启动情况下是否能正常访问
原文出处:Nginx-基础篇