一、Nginx简介
1.1 背景介绍
Nginx
(“engine x”)一个具有高性能的【
HTTP
】和【反向代理】的
【
WEB
服务器】,同时也是一个【
POP3/SMTP/IMAP
代理服务器】,是
由伊戈尔
·
赛索耶夫
(
俄罗斯人
)
使用
C
语言编写的,
Nginx
的第一个版本是
2004
年
10
月
4
号发布的
0.1.0
版本。另外值得一提的是伊戈尔
·
赛索耶夫将
Nginx
的源码进行了开源,这也为
Nginx
的发展提供了良好的保障。
名词解释
1. WEB
服务器:
WEB
服务器也叫网页服务器,英文名叫
Web Server
,主要功能是为用户
提供网上信息浏览服务。
2. HTTP:
HTTP
是超文本传输协议的缩写,是用于从
WEB
服务器传输超文本到本地
浏览器的传输协议,也是互联网上应用最为广泛的一种网络协议。
HTTP
是一个客户端和服务器端请求和应答的标准,客户端是终端用户,服务
端是网站,通过使用
Web
浏览器、网络爬虫或者其他工具,客户端发起
一个到服务器上指定端口的
HTTP
请求。
3. POP3/SMTP/IMAP
:
POP3(Post Offiffiffic Protocol 3)
邮局协议的第三个版本,
SMTP(Simple Mail Transfer Protocol)
简单邮件传输协议,
IMAP(Internet Mail Access Protocol)
交互式邮件存取协议,
通过上述名词的解释,我们可以了解到
Nginx
也可以作为电子邮件代理
服务器。
4.
反向代理
正向代理
反向代理
1.2常见服务器对比
我们先来认识一家公司叫Netcraft。
Netcraft
公司于
1994
年底在英国成立,多年来一直致力于互联网市场以
及在线安全方面的咨询服务,其中在国际上最具影响力的当属其针对网站
服务器、
SSL
市场所做的客观严谨的分析研究,公司官网每月公布的调研
数据(Web Server Survey)已成为当今人们了解全球网站数量以及服
务器市场分额情况的主要参考依据,时常被诸如华尔街杂志,英国
BBC
,
Slashdot
等媒体报道或引用。
我们先来看一组数据,我们先打开
Nginx
的官方网站
http://nginx.org/
,
找到
Netcraft
公司公布的数据,对当前主流服务器产品进行介绍。
上面这张图展示了
2019
年全球主流
Web
服务器的市场情况,其中有
Apache
、
Microsoft-IIS
、
google Servers
、
Nginx
、
Tomcat
等,而我们
在了解新事物的时候,往往习惯通过类比来帮助自己理解事物的概貌。
所以下面我们把几种常见的服务器来给大家简单介绍下:
IIS
全称
(Internet Information Services)
即互联网信息服务,是由微软公司
提供的基于
windows
系统的互联网基本服务。
windows
作为服务器在稳
定性与其他一些性能上都不如类
UNIX
操作系统,因此在需要高性能
Web
服务器的场合下,
IIS
可能就会被
"
冷落
".
Tomcat
Tomcat
是一个运行
Servlet
和
JSP
的
Web
应用软件,
Tomcat
技术先进、性
能稳定而且开放源代码,因此深受
Java
爱好者的喜爱并得到了部分软件
开发商的认可,成为目前比较流行的
Web
应用服务器。但是
Tomcat
天生
是一个重量级的
Web
服务器,对静态文件和高并发的处理比较弱。
Apache
Apache
的发展时期很长,同时也有过一段辉煌的业绩。从上图可以看出
大概在
2014
年以前都是市场份额第一的服务器。
Apache
有很多优点,
如稳定、开源、跨平台等。但是它出现的时间太久了,在它兴起的年
代,互联网的产业规模远远不如今天,所以它被设计成一个重量级的、
不支持高并发的
Web
服务器。在
Apache
服务器上,如果有数以万计的并
发
HTTP
请求同时访问,就会导致服务器上消耗大量能存,操作系统内核
对成百上千的
Apache
进程做进程间切换也会消耗大量的
CUP
资源,并导
致
HTTP
请求的平均响应速度降低,这些都决定了
Apache
不可能成为高
性能的
Web
服务器。这也促使了
Lighttpd
和
Nginx
的出现。
Lighttpd
Lighttpd
是德国的一个开源的
Web
服务器软件,它和
Nginx
一样,都是轻
量级、高性能的
Web
服务器,欧美的业界开发者比较钟爱
Lighttpd,
而国
内的公司更多的青睐
Nginx
,同时网上
Nginx
的资源要更丰富些。
其他的服务器
Google Servers
,
Weblogic, Webshpere(IBM)...
经过各个服务器的对比,种种迹象都表明,
Nginx
将以性能为王。这也
是我们为什么选择
Nginx
的理由。
Nginx
的优点
(1)
速度更快、并发更高
单次请求或者高并发请求的环境下,
Nginx
都会比其他
Web
服务器响应
的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一
方面,在高峰期
(
如有数以万计的并发请求
)
,
Nginx
比其他
Web
服务器更
快的响应请求。
Nginx
之所以有这么高的并发处理能力和这么好的性能
原因在于
Nginx
采用了多进程和
I/O
多路复用
(epoll)
的底层实现。
(2)
配置简单,扩展性强
Nginx
的设计极具扩展性,它本身就是由很多模块组成,这些模块的使
用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方
提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。
(3)
高可靠性
Nginx
采用的是多进程模式运行,其中有一个
master
主进程和
N
多个
worker
进程,
worker
进程的数量我们可以手动设置,每个
worker
进程
之间都是相互独立提供服务,并且
master
主进程可以在某一个
worker
进
程出错时,快速去
"
拉起
"
新的
worker
进程提供服务。
(4)
热部署
现在互联网项目都要求以
7*24
小时进行服务的提供,针对于这一要求,
Nginx
也提供了热部署功能,即可以在
Nginx
不停止的情况下,对
Nginx
进行文件升级、更新配置和更换日志文件等功能。
(5)
成本低、
BSD
许可证
BSD
是一个开源的许可证,世界上的开源许可证有很多,现在比较流行
的有六种分别是
GPL
、
BSD
、
MIT
、
Mozilla
、
Apache
、
LGPL
。这六种的
区别是什么,我们可以通过下面一张图来解释下:
Nginx
本身是开源的,我们不仅可以免费的将
Nginx
应用在商业领域,而
且还可以在项目中直接修改
Nginx
的源码来定制自己的特殊要求。这些
点也都是
Nginx
为什么能吸引无数开发者继续为
Nginx
来贡献自己的智慧
和青春。
OpenRestry [Nginx+Lua] Tengine[
淘宝
]
1.3Nginx的功能特性及常用功能
Nginx
提供的基本功能服务从大体上归纳为
"
基本
HTTP
服务
"
、
“
高级
HTTP
服务
”
和
"
邮件服务
"
等三大类。
基本
HTTP
服务
Nginx
可以提供基本
HTTP
服务,可以作为
HTTP
代理服务器和反向代理服
务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持
包过滤功能,支持
SSL
等。
- 处理静态文件、处理索引文件以及支持自动索引;
- 提供反向代理服务器,并可以使用缓存加上反向代理,同时完成负载 均衡和容错;
- 提供对FastCGI、memcached等服务的缓存机制,,同时完成负载均 衡和容错;
- 使用Nginx的模块化特性提供过滤器功能。Nginx基本过滤器包括 gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放 等。其中针对包含多个SSI的页面,经由FastCGI或反向代理,SSI过 滤器可以并行处理。
- 支持HTTP下的安全套接层安全协议SSL.
- 支持基于加权和依赖的优先权的HTTP/2
高级
HTTP
服务
- 支持基于名字和IP的虚拟主机设置
- 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接
- 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转。
- 提供3xx~5xx错误代码重定向功能
- 支持重写(Rewrite)模块扩展
- 支持重新加载配置以及在线升级时无需中断正在处理的请求
- 支持网络监控
- 支持FLV和MP4流媒体传输
邮件服务
Nginx
提供邮件代理服务也是其基本开发需求之一,主要包含以下特
性:
- 支持IMPA/POP3代理服务功能
- 支持内部SMTP代理服务功能
Nginx
常用的功能模块
静态资源部署
Rewrite
地址重写
正则表达式
反向代理
负载均衡
轮询、加权轮询、
ip_hash
、
url_hash
、
fair
Web
缓存
环境部署
高可用的环境
用户认证模块
...
Nginx
的核心组成
nginx
二进制可执行文件
nginx.conf
配置文件
error.log
错误的日志记录
access.log
访问日志记录
二、Nginx环境准备
2.1Nginx版本介绍
Nginx
的官方网站为
:
http://nginx.org
打开源码可以看到如下的页面内容
Nginx
的官方下载网站为
http://nginx.org/en/download.html
,当然你
也可以之间在首页选中右边的
download
进入版本下载网页。在下载页面
我们会看到如下内容:
2.2获取Nginx源码
http://nginx.org/download/
打开上述网站,就可以查看到
Nginx
的所有版本,选中自己需要的版本
进行下载。下载我们可以直接在
windows
上下载然后上传到服务器,也
可以直接从服务器上下载,这个时候就需要准备一台服务器。
2.3准备服务器系统
环境准备
VMwareWorkStation
Centos7
MobaXterm
xsheel,SecureCRT
网络
(1)
确认
centos
的内核
准备一个内核为
2.6
及以上版本的操作系统,因为
linux2.6
及以上内核才
支持
epoll,
而
Nginx
需要解决高并发压力问题是需要用到
epoll
,所以我们
需要有这样的版本要求。
我们可以使用
uname
-
a
命令来查询
linux
的内核版本。
(2)
确保
centos
能联网
ping www.baidu.com
(3)
确认关闭防火墙
这一项的要求仅针对于那些对
linux
系统的防火墙设置规则不太清楚的,
建议大家把防火墙都关闭掉,因为我们此次课程主要的内容是对
Nginx
的学习,把防火墙关闭掉,可以省掉后续
Nginx
学习过程中遇到的诸多
问题。
systemctl stop firewalld
关闭运行的防火墙,系统重新启
动后,防火墙将重新打开
systemctl disable firewalld
永久关闭防火墙,,系统重新启
动后,防火墙依然关闭
systemctl status firewalld
查看防火墙状态
(4)确认停用
selinux
selinux(security-enhanced linux),
美国安全局对于强制访问控制的实
现,在
linux2.6
内核以后的版本中,
selinux
已经成功内核中的一部分。
可以说
selinux
是
linux
史上最杰出的新安全子系统之一。虽然有了
selinux
,我们的系统会更安全,但是对于我们的学习
Nginx
的历程中,
会多很多设置,所以这块建议大家将
selinux
进行关闭。
sestatus
查看状态
如果查看不是
disabled
状态,我们可以通过修改配置文件来进行设置
,
修
改
SELINUX=disabled
,然后重启下系统即可生效。
vim /etc/selinux/config
2.4Nginx安装方式介绍
Nginx的安装方式有两种分别是:
通过
Nginx
源码
通过
Nginx
源码简单安装
(1)
通过
Nginx
源码复杂安装
(3)
通过
yum
安装
(2)
如果通过
Nginx
源码安装需要提前准备的内容:
GCC
编译器
Nginx
是使用
C
语言编写的程序,因此想要运行
Nginx
就需要安装一个编
译工具。
GCC
就是一个开源的编译器集合,用于处理各种各样的语言,
其中就包含了
C
语言。
使用命令
yum install
-
y gcc
来安装
安装成功后,可以通过
gcc
--
version
来查看
gcc
是否安装成功
PCRE
Nginx
在编译过程中需要使用到
PCRE
库(
perl Compatible Regular
Expressoin
兼容正则表达式库
)
,因为在
Nginx
的
Rewrite
模块和
http
核
心模块都会使用到
PCRE
正则表达式语法。
可以使用命令
yum install
-
y pcre pcre
-
devel
来进行安装
安装成功后,可以通过
rpm
-
qa pcre pcre
-
devel
来查看是否安装成功
zlib
zlib
库提供了开发人员的压缩算法,在
Nginx
的各个模块中需要使用
gzip
压缩,所以我们也需要提前安装其库及源代码
zlib
和
zlib-devel
可以使用命令
yum install
-
y zlib zlib
-
devel
来进行安装
安装成功后,可以通过
rpm
-
qa zlib zlib
-
devel
来查看是否安装成功
OpenSSL
OpenSSL
是一个开放源代码的软件库包,应用程序可以使用这个包进行
安全通信,并且避免被窃听。
SSL:Secure Sockets Layer
安全套接协议的缩写,可以在
Internet
上提供
秘密性传输,其目标是保证两个应用间通信的保密性和可靠性。在
Nginx
中,如果服务器需要提供安全网页时就需要用到
OpenSSL
库,所
以我们需要对
OpenSSL
的库文件及它的开发安装包进行一个安装。
可以使用命令
yum install
-
y openssl openssl
-
devel
来进行安装
安装成功后,可以通过
rpm
-
qa openssl openssl
-
devel
来查看是否安
装成功 上述命令,一个个来的话比较麻烦,我们也可以通过一条命令来进行安
装
yum install
-
y gcc pcre pcre
-
devel zlib zlib
-
devel openssl
openssl
-
devel
进行全部安装。
方案一:
Nginx
的源码简单安装
(1)
进入官网查找需要下载版本的链接地址,然后使用
wget
命令进行下载
wget http://nginx.org/download/nginx-1.16.1.tar.gz
(2)
建议大家将下载的资源进行包管理
mkdir -p nginx/core
mv nginx-1.16.1.tar.gz nginx/core
(3)
解压缩
tar -xzf nginx-1.16.1.tar.gz
(4)
进入资源文件中,发现
confifigure
./configure
(5)
编译
make
(6)
安装
make install
方案二:
yum
安装
使用源码进行简单安装,我们会发现安装的过程比较繁琐,需要提前准
备
GCC
编译器、
PCRE
兼容正则表达式库、
zlib
压缩库、
OpenSSL
安全通
信的软件库包,然后才能进行
Nginx
的安装。
(1)安装
yum-utils
sudo yum install -y yum-utils
(2)添加
yum
源文件
vim /etc/yum.repos.d/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/$re
leasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
(3)查看是否安装成功
yum list | grep nginx
(
4
)使用
yum
进行安装
yun install -y nginx
(
5
)查看
nginx
的安装位置
whereis nginx
(6)启动测试
源码简单安装和
yum
安装的差异:
这里先介绍一个命令
:
./nginx
-
V
,
通过该命令可以查看到所安装
Nginx
的版本及相关配置信息。
简单安装
yum
安装
解压
Nginx
目录
执行
tar
-
zxvf nginx
-
1.16.1.tar.gz
对下载的资源进行解压缩,进入
压缩后的目录,可以看到如下结构
内容解释:
auto:
存放的是编译相关的脚本
CHANGES:
版本变更记录
CHANGES.ru:
俄罗斯文的版本变更记录
conf:nginx
默认的配置文件
confifigure:nginx
软件的自动脚本程序
,
是一个比较重要的文件,作用如
下:
(1)检测环境及根据环境检测结果生成
C
代码
(2)生成编译代码需要的
Makefifile
文件
contrib:
存放的是几个特殊的脚本文件,其中
README
中对脚本有着详细
的说明
html:
存放的是
Nginx
自带的两个
html
页面,访问
Nginx
的首页和错误页
面
LICENSE:
许可证的相关描述文件
man:nginx
的
man
手册
README:Nginx
的阅读指南
src:Nginx
的源代码
方案三
:Nginx
的源码复杂安装
这种方式和简单的安装配置不同的地方在第一步,通过
./configure
来
对编译参数进行设置,需要我们手动来指定。那么都有哪些参数可以进
行设置,接下来我们进行一个详细的说明。
PATH:
是和路径相关的配置信息
with:
是启动模块,默认是关闭的
without:
是关闭模块,默认是开启的
我们先来认识一些简单的路径配置已经通过这些配置来完成一个简单的
编译:
--prefifix=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
要想使用可以通过如下命令
./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
在使用上述命令之前,需要将之前服务器已经安装的
nginx
进行卸载,卸
载的步骤分为三步骤:
步骤一:需要将
nginx
的进程关闭
./nginx -s stop
步骤二
:
将安装的
nginx
进行删除
rm -rf /usr/local/nginx
步骤三
:
将安装包之前编译的环境清除掉
make clean
2.5Nginx目录结构分析
在使用
Nginx
之前,我们先对安装好的
Nginx
目录文件进行一个分析,在
这块给大家介绍一个工具
tree
,通过
tree
我们可以很方面的去查看
centos
系统上的文件目录结构,当然,如果想使用
tree
工具,就得先通
过
yum install
-
y tree
来进行安装,安装成功后,可以通过执行
tree
/usr/local/nginx
(tree
后面跟的是
Nginx
的安装目录
)
,获取的结果如
下:
conf:nginx
所有配置文件目录
CGI(Common Gateway Interface)
通用网关【接口】,主要解决的问题
是从客户端发送一个请求和数据,服务端获取到请求和数据后可以调用
调用
CGI
【程序】处理及相应结果给客户端的一种标准规范。
fastcgi.conf:fastcgi
相关配置文件
fastcgi.conf.default:fastcgi.conf
的备份文件
fastcgi_params:fastcgi
的参数文件
fastcgi_params.default:fastcgi
的参数备份文件
scgi_params:scgi
的参数文件
scgi_params.default
:
scgi
的参数备份文件
uwsgi_params:uwsgi
的参数文件
uwsgi_params.default:uwsgi
的参数备份文件
mime.types:
记录的是
HTTP
协议中的
Content-Type
的值和文件后缀名的
对应关系
mime.types.default:mime.types
的备份文件
nginx.conf:
这个是
Nginx
的核心配置文件,这个文件非常重要,也是我
们即将要学习的重点
nginx.conf.default:nginx.conf
的备份文件
koi-utf
、
koi-win
、
win-utf
这三个文件都是与编码转换映射相关的配置文
件,用来将一种编码转换成另一种编码
html:
存放
nginx
自带的两个静态的
html
页面
50x.html:
访问失败后的失败页面
index.html:
成功访问的默认首页
logs:
记录入门的文件,当
nginx
服务器启动后,这里面会有
access.log
error.log
和
nginx.pid
三个文件出现。
sbin:
是存放执行程序文件
nginx
nginx
是用来控制
Nginx
的启动和停止等相关的命令。
2.6Nginx服务器启停命令
Nginx
安装完成后,接下来我们要学习的是如何启动、重启和停止
Nginx
的服务。
对于
Nginx
的启停在
linux
系统中也有很多种方式,我们本次课程介绍两
种方式:
1. Nginx
服务的信号控制
2. Nginx
的命令行控制
方式一
:Nginx
服务的信号控制
Nginx
中的
master
和
worker
进程
?
Nginx
的工作方式
?
如何获取进程的
PID?
信号有哪些
?
如何通过信号控制
Nginx
的启停等相关操作
?
前面在提到
Nginx
的高性能,其实也和它的架构模式有关。
Nginx
默认采
用的是多进程的方式来工作的,当将
Nginx
启动后,我们通过
ps
-
ef |
grep nginx
命令可以查看到如下内容:
从上图中可以看到
,Nginx
后台进程中包含一个
master
进程和多个
worker
进程,
master
进程主要用来管理
worker
进程,包含接收外界的信息,并
将接收到的信号发送给各个
worker
进程,监控
worker
进程的状态,当
worker
进程出现异常退出后,会自动重新启动新的
worker
进程。而
worker
进程则是专门用来处理用户请求的,各个
worker
进程之间是平等
的并且相互独立,处理请求的机会也是一样的。
nginx
的进程模型,我们
可以通过下图来说明下:
我们现在作为管理员,只需要通过给
master
进程发送信号就可以来控制
Nginx,
这个时候我们需要有两个前提条件,一个是要操作的
master
进
程,一个是信号。
(1)要想操作
Nginx
的
master
进程,就需要获取到
master
进程的进程
号
ID
。获取方式简单介绍两个,
方式一:通过
ps
-
ef | grep nginx
;
方式二:在讲解
nginx
的
./configure
的配置参数的时候,有一个参数
是
--
pid
-
path=PATH
默认是
/usr/local/nginx/logs/nginx.pid
,
所以
可以通过查看该文件来获取
nginx
的
master
进程
ID.
(2)信号
调用命令为
kill
-
signal PID
signal:
即为信号;
PID
即为获取到的
master
线程
ID
1.
发送
TERM/INT
信号给
master
进程,会将
Nginx
服务立即关闭。
kill -TERM PID / kill -TERM `cat
/usr/local/nginx/logs/nginx.pid`
kill -INT PID / kill -INT `cat
/usr/local/nginx/logs/nginx.pid
2.
发送
QUIT
信号给
master
进程,
master
进程会控制所有的
work
进程不
再接收新的请求,等所有请求处理完后,在把进程都关闭掉。
kill -QUIT PID / kill -TERM `cat
/usr/local/nginx/logs/nginx.pid`
3.
发送
HUP
信号给
master
进程,
master
进程会把控制旧的
work
进程不
再接收新的请求,等处理完请求后将旧的
work
进程关闭掉,然后根
据
nginx
的配置文件重新启动新的
work
进程
kill -HUP PID / kill -TERM `cat
/usr/local/nginx/logs/nginx.pid`
4.
发送
USR1
信号给
master
进程,告诉
Nginx
重新开启日志文件
kill -USR1 PID / kill -TERM `cat
/usr/local/nginx/logs/nginx.pid`
5.
发送
USR2
信号给
master
进程,告诉
master
进程要平滑升级,这个时
候,会重新开启对应的
master
进程和
work
进程,整个系统中将会有
两个
master
进程,并且新的
master
进程的
PID
会被记录
在
/usr/local/nginx/logs/nginx.pid
而之前的旧的
master
进程
PID
会被记录在
/usr/local/nginx/logs/nginx.pid.oldbin
文件
中,接着再次发送
QUIT
信号给旧的
master
进程,让其处理完请求后
再进行关闭
kill -USR2 PID / kill -USR2 `cat
/usr/local/nginx/logs/nginx.pid`
kill -QUIT PID / kill -QUIT `cat
/usr/local/nginx/logs/nginx.pid.oldbin`
6.
发送
WINCH
信号给
master
进程
,
让
master
进程控制不让所有的
work
进程在接收新的请求了,请求处理完后关闭
work
进程。注意
master
进程不会被关闭掉
kill -WINCH PID /kill -WINCH`cat
/usr/local/nginx/logs/nginx.pid`
方式二
:Nginx
的命令行控制
此方式是通过
Nginx
安装目录下的
sbin
下的可执行文件
nginx
来进行
Nginx
状态的控制,我们可以通过
nginx
-
h
来查看都有哪些参数可以
用:
-?
和
-h:
显示帮助信息
-v:
打印版本号信息并退出
-V:
打印版本号信息和配置信息并退出
-t:
测试
nginx
的配置文件语法是否正确并退出
-T:
测试
nginx
的配置文件语法是否正确并列出用到的配置文件信息然后
退出
-q:
在配置测试期间禁止显示非错误消息
-s:signal
信号,后面可以跟 :
stop[
快速关闭,类似于
TERM/INT
信号的作用
]
quit[
优雅的关闭,类似于
QUIT
信号的作用
]
reopen[
重新打开日志文件类似于
USR1
信号的作用
]
reload[
类似于
HUP
信号的作用
]
-p:prefifix
,指定
Nginx
的
prefifix
路径,
(
默认为
: /usr/local/nginx/)
-c:fifilename,
指定
Nginx
的配置文件路径
,(
默认为
: conf/nginx.conf)
-g:
用来补充
Nginx
配置文件,向
Nginx
服务指定启动时应用全局的配置
2.7Nginx服务器版本升级和新增模块
如果想对
Nginx
的版本进行更新,或者要应用一些新的模块,最简单的
做法就是停止当前的
Nginx
服务,然后开启新的
Nginx
服务。但是这样会
导致在一段时间内,用户是无法访问服务器。为了解决这个问题,我们
就需要用到
Nginx
服务器提供的平滑升级功能。这个也是
Nginx
的一大特
点,使用这种方式,就可以使
Nginx
在
7*24
小时不间断的提供服务了。
接下来我们分析下需求:
需求:
Nginx
的版本最开始使用的是
Nginx-1.14.2,
由于服务升级,需
要将
Nginx
的版本升级到
Nginx-1.16.1,
要求
Nginx
不能中断提供服
务。
为了应对上述的需求,这里我们给大家提供两种解决方案
:
方案一
:
使用
Nginx
服务信号完成
Nginx
的升级
方案二
:
使用
Nginx
安装目录的
make
命令完成升级
环境准备
(1)先准备两个版本的
Nginx
分别是
1.14.2
和
1.16.1
(2)使用
Nginx
源码安装的方式将
1.14.2
版本安装成功并正确访问
进入安装目录
./configure
make && make install
(3)将
Nginx1.16.1
进行参数配置和编译,不需要进行安装。
进入安装目录
./configure
make
方案一
:
使用
Nginx
服务信号进行升级
第一步
:
将
1.14.2
版本的
sbin
目录下的
nginx
进行备份
cd /usr/local/nginx/sbin
mv nginx nginxold
第二步
:
将
Nginx1.16.1
安装目录编译后的
objs
目录下的
nginx
文件,拷贝
到原来
/usr/local/nginx/sbin
目录下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
第三步
:
发送信号
USR2
给
Nginx
的
1.14.2
版本对应的
master
进程
第四步
:
发送信号
QUIT
给
Nginx
的
1.14.2
版本对应的
master
进程
kill -QUIT `more /usr/local/logs/nginx.pid.oldbin`
方案二
:
使用
Nginx
安装目录的
make
命令完成升级
第一步
:
将
1.14.2
版本的
sbin
目录下的
nginx
进行备份
cd /usr/local/nginx/sbin
mv nginx nginxold
第二步
:
将
Nginx1.16.1
安装目录编译后的
objs
目录下的
nginx
文件,拷贝
到原来
/usr/local/nginx/sbin
目录下
cd ~/nginx/core/nginx-1.16.1/objs
cp nginx /usr/local/nginx/sbin
第三步
:
进入到安装目录,执行
make upgrade
第四步
:
查看是否更新成功
./nginx -v
在整个过程中,其实
Nginx
是一直对外提供服务的。并且当
Nginx
的服务
器启动成功后,我们是可以通过浏览器进行直接访问的,同时我们可以
通过更改
html
目录下的页面来修改我们在页面上所看到的内容,那么问
题来了,为什么我们要修改
html
目录下的文件,能不能多添加一些页面
是
Nginx
的功能更加丰富,还有前面聊到
Nginx
的前端功能又是如何来实
现的,这就需要我们对
Nginx
的核心配置文件进行一个详细的学习。
三、Nginx核心配置文件结构
从前面的内容学习中,我们知道
Nginx
的核心配置文件默认是放
在
/usr/local/nginx/conf/nginx.conf
,这一节,我们就来学习下
nginx.conf
的内容和基本配置方法。
读取
Nginx
自带的
Nginx
配置文件,我们将其中的注释部分【学习一个技
术点就是在
Nginx
的配置文件中可以使用
#
来注释】删除掉后,就剩下下
面内容
:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
指令名 指令值
; #
全局块,主要设置
Nginx
服务器整体运行的配置指令
#events
块
,
主要设置
,Nginx
服务器与用户的网络连接
,
这一部分对
Nginx
服务器的性能影响较大
events {
指令名 指令值
;
}
#http
块,是
Nginx
服务器配置中的重要部分,代理、缓存、日志记录、
第三方模块配置
...
http {
指令名 指令值
;
server { #server
块,是
Nginx
配置和虚拟主机相关的内容
指令名 指令值
;
location / {
#location
块,基于
Nginx
服务器接收请求字符串与
location
后面的值进行匹配,对特定请求进行处理
指令名 指令值
;
}
}
...
}
简单小结下
:
nginx.conf
配置文件中默认有三大块:全局块、
events
块、
http
块
http
块中可以配置多个
server
块,每个
server
块又可以配置多个
location
块。
3.1全局块
user
指令
(1)
user:
用于配置运行
Nginx
服务器的
worker
进程的用户和用户组。
该属性也可以在编译的时候指定,语法如下
./configure
--
user=user
--
group=group
,
如果两个地方都进行了设置,最终生效的是配置文件中
的配置。
该指令的使用步骤
:
(1)
设置一个用户信息
"www"
user www;
(2)
创建一个用户
useradd www
(3)
修改
user
属性
user www
(4)
创建
/root/html/index.html
页面,添加如下内容
<!DOCTYPE html>
<html>
<head>
<title>
Welcome to nginx!
</title>
<style>
body
{
width
:
35em
;
margin
:
0
auto
;
font-family
:
Tahoma
,
Verdana
,
Arial
,
sans-
serif
;
}
</style>
</head>
<body>
<h1>
Welcome to nginx!
</h1>
<p>
If you see this page, the nginx web server is
successfully installed and
working. Further configuration is required.
</p>
<p>
For online documentation and support please refer
to
<a
href
=
"http://nginx.org/"
>
nginx.org
</a>
.
<br/>
Commercial support is available at
<a
href
=
"http://nginx.com/"
>
nginx.com
</a>
.
</p>
<p><em>
Thank you for using nginx.
</em></p>
<p><em>
I am WWW
</em></p>
</body>
</html>
(5)
修改
nginx.conf
location / {
root /root/html;
index index.html index.htm;
}
(5)
测试启动访问
页面会报
403
拒绝访问的错误
(6)
分析原因
因为当前用户没有访问
/root/html
目录的权限
(7)
将文件创建到
/home/www/html/index.html
,
修改配置
location / {
root /home/www/html;
index index.html index.htm;
}
(8)
再次测试启动访问
能正常访问。
综上所述,使用
user
指令可以指定启动运行工作进程的用户及用户组,
这样对于系统的权限访问控制的更加精细,也更加安全。
work process
指令
master_process:
用来指定是否开启工作进程。
worker_processes:
用于配置
Nginx
生成工作进程的数量,这个是
Nginx
服务器实现并发处理服务的关键所在。理论上来说
workder process
的
值越大,可以支持的并发处理量也越多,但事实上这个值的设定是需要
受到来自服务器自身的限制,建议将该值和服务器
CPU
的内核数保存一
致。
如果将
worker_processes
设置成
2
,则会看到如下内容
:
其他指令
daemon
:设定
Nginx
是否以守护进程的方式启动。
守护式进程是
linux
后台执行的一种服务进程,特点是独立于控制终端,
不会随着终端关闭而停止。
pid:
用来配置
Nginx
当前
master
进程的进程号
ID
存储的文件路径。
该属性可以通过
./configure
--
pid
-
path=PATH
来指定
error_log:
用来配置
Nginx
的错误日志存放路径
该属性可以通过
./configure
--
error
-
log
-
path=PATH
来指定
其中日志级别的值有:
debug|info|notice|warn|error|crit|alert|emerg
,翻译过来为试
|
信
息
|
通知
|
警告
|
错误
|
临界
|
警报
|
紧急,这块建议大家设置的时候不要设
置成
info
以下的等级,因为会带来大量的磁盘
I/O
消耗,影响
Nginx
的性
能。
(5)
include:
用来引入其他配置文件,使
Nginx
的配置更加灵活
3.2events块
(1)accept_mutex:用来设置Nginx网络连接序列化
这个配置主要可以用来解决常说的
"
惊群
"
问题。大致意思是在某一个时
刻,客户端发来一个请求连接,
Nginx
后台是以多进程的工作模式,也
就是说有多个
worker
进程会被同时唤醒,但是最终只会有一个进程可以
获取到连接,如果每次唤醒的进程数目太多,就会影响
Nginx
的整体性
能。如果将上述值设置为
on(
开启状态
)
,将会对多个
Nginx
进程接收连接
进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。
(2)
multi_accept:
用来设置是否允许同时接收多个网络连接
如果
multi_accept
被禁止了,
nginx
一个工作进程只能同时接受一个新的
连接。否则,一个工作进程可以同时接受所有的新连接
(3)
worker_connections
:用来配置单个
worker
进程最大的连接数
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能
的连接数。另外,
number
值不能大于操作系统支持打开的最大文件句
柄数量。
(4)
use:
用来设置
Nginx
服务器选择哪种事件驱动来处理网络消息。
注意:此处所选择事件处理模型是
Nginx
优化部分的一个重要内容,
method
的可选值有
select/poll/epoll/kqueue
等,之前在准备
centos
环
境的时候,我们强调过要使用
linux
内核在
2.6
以上,就是为了能使用
epoll
函数来优化
Nginx
。
另外这些值的选择,我们也可以在编译的时候使用
--
with
-
select_module
、
--
without
-
select_module
、
--
with
-
poll_module
、
--
without
-
poll_module
来设置是否需要将对应
的事件驱动模块编译到
Nginx
的内核。
events
指令配置实例
打开
Nginx
的配置文件
nginx.conf,
添加如下配置
events{
accept_mutex on;
multi_accept on;
worker_commections 1024;
use epoll;
}
启动测试
./nginx -t
./nginx -s reload
3.3http块
定义
MIME-Type
我们都知道浏览器中可以显示的内容有
HTML
、
XML
、
GIF
等种类繁多的
文件、媒体等资源,浏览器为了区分这些资源,就需要使用
MIME
Type
。所以说
MIME Type
是网络资源的媒体类型。
Nginx
作为
web
服务
器,也需要能够识别前端请求的资源类型。
在
Nginx
的配置文件中,默认有两行配置
include mime.types;
default_type application/octet-stream;
(1)
default_type:
用来配置
Nginx
响应前端请求默认的
MIME
类型。
在
default_type
之前还有一句
include mime.types
,include
之前我们已
经介绍过,相当于把
mime.types
文件中
MIMT
类型与相关类型文件的文
件后缀名的对应关系加入到当前的配置文件中。
举例来说明:
有些时候请求某些接口的时候需要返回指定的文本字符串或者
json
字符
串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用
nginx
快
速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并
且响应性能非常快。
如何实现
:
location /get_text {
#
这里也可以设置成
text/plain
default_type text/html;
return 200 "This is nginx's text";
}
location /get_json{
default_type application/json;
return 200 '{"name":"TOM","age":18}';
}
自定义服务日志
Nginx
中日志的类型分
access.log
、
error.log
。
access.log:
用来记录用户所有的访问请求。
error.log:
记录
nginx
本身运行时的错误信息,不会记录用户的访问请
求。
Nginx
服务器支持对服务日志的格式、大小、输出等进行设置,需要使
用到两个指令,分别是
access_log
和
log_format
指令。
(1)
access_log:
用来设置用户访问日志的相关属性。
(2)
log_format:
用来指定日志的输出格式。
其他配置指令
(1)
sendfifile:
用来设置
Nginx
服务器是否使用
sendfifile()
传输文件,该属
性可以大大提高
Nginx
处理静态资源的性能
(2)
keepalive_timeout:
用来设置长连接的超时时间。
》为什么要使用
keepalive
?
我们都知道
HTTP
是一种无状态协议,客户端向服务端发送一个
TCP
请求,
服务端响应完毕后断开连接。
如何客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,
效率相对来说比较多,使用
keepalive
模式,可以告诉服务器端在处理完
一个请求后保持这个
TCP
连接的打开状态,若接收到来自这个客户端的其
他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新
连接,提升效率,但是这个连接也不能一直保持,这样的话,连接如果过
多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时
间。
(3)
keepalive_requests:
用来设置一个
keep-alive
连接使用的次数。
3.4server块和location块
server
块和
location
块都是我们要重点讲解和学习的内容,因为我们后面
会对
Nginx
的功能进行详细讲解,所以这块内容就放到静态资源部署的
地方给大家详细说明。
本节我们主要来认识下
Nginx
默认给的
nginx.conf
中的相关内容,以及
server
块与
location
块在使用的时候需要注意的一些内容。
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root html;
}
}