1、Nginx简介
? ? ? ? Nginx("engine x") 一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时它也是一个【POP3/SMTP/IMAP代理服务器】,由伊戈尔 ? 赛索耶夫(俄罗斯人)使用【C语言】编写的,Nginx的第一个版本是2004年10月4日发布的0.1.0版本。另外值得一提的是伊戈尔 ? 赛索耶夫将Nginx的源码进行了开源,这也为Nginx的发展提供了良好的保障。
? ? ? ?
???????? 1.1、一些名词的解释
正向代理和反向代理:以下图说明
????????正向代理是上面的情况,我们无法直接的访问某个服务,于是我们访问另外的一台代理服务器,让其代理我们去访问,然后将访问结果返回。我们经常使用的VPN工具就是这个原理。我们无法访问的Google服务可以通过代理的方式去实现。注意这里我们已知真实的目标服务器的ip地址,也知道代理服务器的ip地址。
? ? ? ? 反向代理是这张图下面的情况,不同的我们只知道代理服务器的地址,并不知道在其后面隐藏的服务,因此反向代理代理的是目标服务器,我们只知道一个地址,通过这个地址就可以访问代理服务器,代理服务器再访问它代理的目标服务器为我们服务。
? ? ? ? 综上我们可以这也理解,正向代理更强调的是代理服务器代理我们发送接收请求,反向代理更强调代理服务器为目标服务器代理对外提供服务。
? ? ? ? 1.2、常见服务器对比
????????在介绍这一节内容之前,我们先来认识一家公司叫Netcraft。
Netcraft公司于1994年底在英国成立,多年来一直致力于互联网市场以及在线安全方面的咨询服务,其中在国际上最具影响力的当属其针对网站服务器、SSL市场所做的客观严谨的分析研究,公司官网每月公布的调研数据(web server survey)已成为当今人们了解全球网站数量以及服务器市场分额情况的主要参考依据,时常被诸如华尔街杂志,英国BBC,Slashdot等媒体报道或引用。
?????????上面这张图展示了1995年以来全球主流Web服务器的市场情况,其中有Apache、Microsoft- llS、google Servers、Nginx、Tomcat等,而我们在了解新事物的时候,往往习惯通过类比来帮助自己理解事物的概貌。所以下面我们把几种常见的服务器来给大家简单介绍下:
IIS
????????全称(Internet Information Services)即互联网信息服务,是由微软公司提供的基于windows系统的互联网基本服务。windows作为服务器在稳定性与其他一些性能上都不如类UNIX操作系统,因此在需要高性能Web服务器的场合下,IIS可能就会被"冷落"。
Tomcat
????????Tomcat是一个运行Servlet和SP的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的资源要更丰富些。
? ? ? ? 1.3、Nginx的优点
速度更快、并发更高 ????????单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务器更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。 配置简单,扩展性强 ????????Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。 高可靠性 ????????Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。 热部署 ????????现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。 成本低、BSD许可证 ????????BSD是一个开源的许可证,世界上的开源许可证有很多,现在比较流行的有六种分别是GPL、BSD、MIT、Mozilla、Apache、LGPL。这六种的区别是什么,我们可以通过下面一张图来解释下:
?????????Nginx本身是开源的,我们不仅可以免费的将Nginx应用在商业领域,而且还可以在项目中直接修改Nginx的源码来定制自己的特殊要求。这些点也都是Nginx为什么能吸引无数开发者继续为Nginx来贡献自己的智慧和青春。OpenRestry [Nginx+L]? ?、 Tengine
? ? ? ? 1.4、Nginx的功能特性及常见功能
基本HTTP服务 Nginx可以提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓 存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。
- 处理静态文件、处理索引文件以及支持自动索引;
- 提供反向代理服务器,并可以使用缓存加上反向代理,同时完成负载均衡和容错;
- 提供对FastCGl、memcached等服务的缓存机制,,同时完成负载均衡和容错;
- 使用Nginx的模块化特性提供过滤器功能。Nginx基本过滤器包括gzip压缩、ranges支持、chunked响应、XSLT、SSI以及图像缩放等。其中针对包含多个SSI的页面,经由FastCGl或反向代理,SSI过滤器可以并行处理。
- 支持HTTP下的安全套接层安全协议SSL.
- 支持基于加权和依赖的优先权的HTTP/2
高级HTTP服务
- 支持基于名字和IP的虚拟主机设置
- 支持HTTP/1.0中的KEEP-Alive模式和管线(PipeLined)模型连接
- 自定义访问日志格式、带缓存的日志写操作以及快速日志轮转。
- 提供3xx~5xx错误代码重定向功能
- 支持重写(Rewrite)模块扩展
- 支持重新加载配置以及在线升级时无需中断正在处理的请求
- 支持网络监控
- 支持FLV和MP4流媒体传输
邮件服务 Nginx提供邮件代理服务也是其基本开发需求之一,主要包含以下特性:
- 支持IMPA/POP3代理服务功能
- 支持内部SMTP代理服务功能
2、Nginx学习
? ? ? ? 2.1、Nginx环境准备
打开Nginx官网:http://nginx.org
也可以直接进入:http://nginx.org/en/download.html
- Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
- Stable version:最新稳定版,生产环境上建议使用的版本
- Legacy versions:遗留的老版本的稳定版?
? ? ? ? ?图片中其中CHANGES是记录版本变更日志,包括功能新增、修改、优化的说明。pgp是PGP加密计算后的签名,公钥文件用以验证你下载的nginx是否被篡改过。nginx-1.18.0是nginx的linux版本的源码
或者在更全版本的的:http://nginx.org/download/? ?这个里面有所有的版本的源码
? ? ? ? ? ? ? ? 2.1.1、准备一台Linux服务器
????????没有网上买在线服务器的可以安装VMWare代替。有关VMWare的一些东西例如VMWare的几种网络模式的区别(需要有计算机网络基础),VMWare安装Linux虚拟机和Windows虚拟机的方法,以及一些Linux虚拟机初始化时一些勾选项一些初始配置项等都可以自行搜索。最后总结需要以下软硬件环境:
? ? ? ? VMWare 、CentOS7、 远程Sheel工具:MobaXterm、xsheel、SecureCRT等
(1)确认centos内核
????????准备一个内核为2.6及以上版本的操作系统,因为linux2.6及以上内核才支持epoll,而Nginx需要解决高并发压力问题是需要用到epoll,所以我们需要有这样的版本要求。
使用uname -a命令来查询Linux内核版本
[root@192 download]# uname -a
Linux 192.168.111.135 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
(2)确保联网,并且能够用主机ping通
? ? ? ? 使用ifconfig查看Linux虚拟机的ip地址,连接Vmware虚拟交换机的那个ip地址,一般默认是ens33.?
????????打开主机cmd,使用 ping 命令确保连通性。
? ? ? ? 你可以使用ping命令ping以下百度试一试能否接如互联网。
(3)确保关闭了防火墙
????????这一项的要求仅针对于那些对linux系统的防火墙设置规则不太清楚的,建议大家把防火墙都关闭掉,因为我们此次课程主要的内容是对Nginx的学习,把防火墙关闭掉,可以省掉后续Nginx学习过程中遇到的诸多问题。
防火墙操作的有关命令:
systemctl stop firewalld #关闭一次防火墙服务,系统重启后将重新打开
systemctl status firewalld #查看防火墙状态
systemctl disable firewalld #永久关闭防火墙
systemctl enable firewalld #解除禁用
systemctl start firewalld #开启防火墙
(4)确认停用selinux
????????selinux(security-enhanced linux),美国安全局对于强制访问控制的实现,在linux2.6内核以后的版本中,selinux已经成功内核中的一部分。可以说selinux是linux史上最杰出的新安全子系统之一。虽然有了selinux,我们的系统会更安全,但是对于我们的学习Nginx的历程中,会多很多设置,所以这块建议大家将selinux进行关闭。
? ? ? ? 查看selinux状态命令
[root@192 download]# sestatus
SELinux status: disabled
? ? ? ? 如果你的状态的enable你可以这也修改配置后重启即可关闭
? ? ? ? 修改配置:
[root@192 download]# vim /etc/selinux/config
????????
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
? ? ? ? 注释掉SELINUX=enforcing添加一行SELINUX=disabled 之后重启即可
? ? ? ? 2.2、Nginx安装和卸载
Nginx的安装方式有如下:
通过Nginx源码
? ? ? 通过Nginx源码简单安装
? ? ? 通过Nginx源码复杂安装
通过yum安装
如果使用Nginx源码安装需要做如下提前准备:
GCC编译器
????????Nginx是使用C语言编写的程序,因此想要运行Nginx就需要安装一个编译工具。GCC就是一个开源的编译器集合,用于处理各种各样的语言,其中就包含了C语言。
????????你可以使用gcc --version查看系统是否已经安装了gcc编译器。如果没有安装可以使用如下命令安装gcc编译器(需要连接互联网 -y是对一些询问是否的情况下免于手动输入y)
yum install -y gcc
? PCRE
????????Nginx在编译过程中需要使用到PCRE库(perlCompatible Regular Expressoin兼容正则表达式库),因为在Nginx的Rewrite模块和http核心模块都会使用到PCRE正则表达式语法。
可以使用如下命令安装
yum install -y pcre pcre-devel #pcre-devel是开发包类似于于c头文件作用
?可以通过rpm -q?pcre pcre-devel查看是否安装成功。
rpm –qa
????????其中
????????–a选项是查询所有已经安装的软件包。
????????-q是查询一个包是否安装
更多有关rpm指令:http://c.biancheng.net/view/817.html
zlib
????????zlib库提供了开发人员的压缩算法,在Nginx的各个模块中需要使用gzip压缩,所以我们也需要提前安装其库及源代码zlib和zlib-devel
可以使用下面的命令安装检查:
yum install zlib zlib-devel #安装
rpm -q zlib zlib-devel #检查是否安装成功
OpenSLL
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包进行安全通信,并且避免被窃听。
可以使用下面的命令安装:
yum install openssl openssl-devel #安装
rpm -q openssl openssl-devel #检查是否安装成功
#可以一次性安装多个就像 xxx xxx-devel一样
yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
#安装之前使用rpm检查一下系统是否都有,我都没安装,这些都有
? ? ? ? ? ? ? ? 2.1.1、源码简单安装
(1)下载源码
你可以使用windows下载后上传到你的linux服务器,你也可以使用如下命令下载
wget 链接 #默认下载到当前路径下,也就是pwd命令显示的路径
wget -P 指定目录 链接 #下载到指定目录,wget支持http,https,ftp等,支持断点续传
wget后加的是资源的URL
(2)解压缩
tar -xf nginx-xxxx.tar.gz
压缩相关基础知识
#两个压缩工具的命令
gzip 路径文件 或 bzip2 路径文件 #都不支持目录,且会删除原文件
gunzip 路径文件.gz 或 bunzip2 路径文件.bz2 #解压缩文件到当前目录
#因为这两种压缩方式都不支持压缩整个目录,所以有了tar
#注意tar只是个打包工具,也就是把一个目录以及里面的文件打包成一个文件
tar -cf 生成tar文件路径 要打包的文件 #打包生成tar文件,这个文件没有压缩
#tar配合两个压缩工具的命令
tar -zcf/-jcf 生成tar文件路径 要打包压缩文件或文件夹 ”-”可加可不加 z是合并gzip j是合并bzip2
#-c 是create (-f 路径文件名)表示要输出的文件要放在哪 zcf和jcf顺序不可变 f后面一定是文件名
更多有关压缩知识请自行搜索
(3)进入解压后的文件夹,ls之后发现configure文件
相信你并不陌生整个文件,它会检查系统配置以及依赖信息生成目标代码和makefile文件就是
./configure
(4)编译安装
make && make install
#你也可以分开执行 make 和 make install
? ? ? ? ? ? ? ? 2.2.1、Nginx简单源码安装的卸载
? 将nginx进程关闭
./nginx -s stop
? 将安装的nginx进行删除
rm -rf /usr/local/nginx
? 将安装包之前编译的环境清除掉
make clean
? ? ? ? ? ? ? ? 2.2.3、yum安装
????????使用源码进行简单安装,我们会发现安装的过程比较繁琐,需要提前准备GCC编译器.PCRE兼容正则表达式库、zlib压缩库、OpenSSL安全通信的软件库包,然后才能进行Nginx的安装。
yum相关知识:https://developer.aliyun.com/article/53630
#yum全称Yellow dog Updater, Modified,是为了简化安装,解决包之间的依赖关系的。
#yum命令基本用法如下
yum 功能(install/search/list/...) 包名(nginx /tomcat/.... 可多个) [-y]
yum install docker #安装docker
yum update docker #升级docker
yum remove docker #删除docker
yum clean packages #清除rpm包文件缓存
yum clean headers #清除rpm后文件缓存
yum clean all #清除所有
yum info docker #列出docker信息
yum info installed #列出所有安装了的包的信息
yum repolist #列出yum源信息
yum search docker #搜索包信息
yum list docker #列出docker的包,包括yum源上可安装的包,和已经安装的包信息。
yum list updates #列出可以升级的所有包
yum list installed #列出已经安装的所有包
yum -y install yum-utils #下载yum-utils,有时我们只是想把rpm包下下来。比如要copy到另一台机器上
装啊等等。我们可以用yum-utils来解决。
yumdownloader docker #yum-utils里面的工具,下载docker包,亦可以找到repo文件,找到地址直接wget它
yum install yum-fastestmirror -y #安装yum源选择插件,自动寻找最快的源。
#yum默认都是安装最新版的软件,这样可能会出一些问题,或者我们希望yum安装指定(特定)版本(旧版本)软件包.所以,就顺带分享yum安装指定(特定)版本(旧版本)软件包的方法。只要安装时指明软件包完整的名字即可。
在nginx的这个地址http://nginx.org/en/linux_packages.html
根据上面的方法,首先检查是否安装了yum-utils
(1)安装yum-utils
rpm -q yum-utils #检查是否安装了yum-utils
yum install yum-utils #如果没安装,就安装
(2)创建yum源文件到指定文件夹
vim /etc/yum.repos.d/nginx.repo
先输入一个字符“i”进入插入模式再粘贴下面的内容到这个文件
[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
看这个文件的内容它默认enable的是稳定版,所以我们就不做修改了。
官网说如果你想更换成最新测试版(mainline)版本你就执行下面的命令
sudo yum-config-manager --enable nginx-mainline
(3)安装
sudo yum install nginx
(4)可以使用如下命令查看yum安装的nginx的目录
whereis nginx
可能的一些问题:当你安装的时候可能会提示没有软件包。通过?yum list? 可以看到很多软件包在yum里面没有的。我们可以使用epel源(EPEL : Extra Packages for Enterprise Linux是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux.)。网上有说这样解决,但是我这样做没有解决掉,所以这种安装方式我就没成功了:
? ? ? ? (1)安装epel
sudo yum install epel-release
? ? ? ? (2)更新系统
yum update
? ? ? ? ?(3)再次安装
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? 2.2.4、源码简单安装和yum安装的差异
首先提前学一下 ./nginx -V?命令,通过该命令可以看安装的nginx的版本及相关配置信息。
简单源码安装后使用该命令的结果:
[root@192 sbin]# ./nginx -V
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments:
yum安装后使用该命令的结果(由于我yum没有安装成功,这是网上找的yum安装后执行该命令的类似结果):
[root@localhost sbin]#./nginx -V
nginx version:nginx/1.16.i
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36)(GCC)
built with openssL 1.0.2k-fips26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf--error-log-path=/var/log/nginx/error.log -http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/ run/nginx.lock--http-client-body-temp-path=/var/cache/nginx/client_temp'--http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat--with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module--with-http_dav_module --with-http_flv_module--with-http_9unzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_randomindex_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module--with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail--with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-02 -g -pipe -wall -wp, -D_FORTIFY_$OURCE=2-fexceptions .fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches-m64 -mtune=generic -fPIC' --with-ld-opt='-wl,-z,relro -wl,-z,now -pie'
从两个结果的对比,我们可以看出其中yum安装会给出特别多的配置参数,这个配置参数就是我们在源码安装第一步执行configure时可以在其后面指定的参数,我们简单安装并没有指定这些参数。
? ? ? ? ? ? ? ? 2.2.5、Nginx的源码复杂安装
????????这种方式和简单的安装配置不同的地方在第一步,通过./configure来对编译参数进行设置,需要我们手动来指定。那么都有哪些参数可以进行设置,接下来我们进行一个详细的说明。
? ? ? ? 其中带PATH的:一般是和路径相关的配置信息
? ? ? ? 以with开通的参数:是安装时要求启动的模块,默认是关闭的
? ? ? ? 以without开通的参数:是安装时要求关闭的模块,默认是开启的
先简单的认识一些路径配置,通过这些配置进行一个简单的编译安装
--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(Pid),默认<prefix>/logs/nginx.pid
--lock-path = PATH #指向Nginx锁文件的存放路径,默认<prefix>/logs/nginx.lock
#注意写参数时不应该写<prefix>,应该写全
这里只是简单的罗列了几个,总的参数有百十个,可以在安装包解压后的目录使用查看全部参数以及解释信息
./configure --help
我们可以使用参数来编译一次源码,自己定义默认的目录位置,不过建议与默认统一方便学习
./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 #注意右斜线前面有空格,等号两边没有空格
make && make install
? ? ? ? 2.3、Nginx目录结构分析
????????在使用Nginx之前,我们先对安装好的Nginx目录文件进行一个分析,在这块给大家介绍一个工具tree,通过tree我们可以很方面的去查看centos系统上的文件目录结构,当然,如果想使用tree工具,就得先通过以下命令来进行安装:
yum insta1l -y tree
安装成功后,可以通过执行
tree /usr/loca1/nginx
(tree后面跟的是Nginx的安装目录),获取的结果如下:
[root@localhost nginx]# tree /usr/local/nginx
/usr/local/nginx
├── conf
│?? ├── fastcgi.conf
│?? ├── fastcgi.conf.default
│?? ├── fastcgi_params
│?? ├── fastcgi_params.default
│?? ├── koi-utf
│?? ├── koi-win
│?? ├── mime.types
│?? ├── mime.types.default
│?? ├── nginx.conf
│?? ├── nginx.conf.default
│?? ├── scgi_params
│?? ├── scgi_params.default
│?? ├── uwsgi_params
│?? ├── uwsgi_params.default
│?? └── win-utf
├── html
│?? ├── 50x.html
│?? └── index.html
├── logs
└── sbin
└── nginx
下面对该目录的结构进行简单的介绍:
首先所有的配置文件都有一个副本为的是在我们把配置文件改的很乱的时候可以用来恢复到一个默认配置文件的状态其命名为配置文件名.default,下面的说明中就不做介绍
一级子目录conf是nginx的所有配置文件目录,里面的结构如下
????????CGI(Common Gateway Interface)通用网关【接口】,主要解决的问题是从客户端发送一个请求和数据,服务端获取到请求和数据后可以调用调用CGl【程序】处理及相应结果给客户端的一种标准规范。
? ? ? ? fastcgi.conf? ? ? ? ? ? ? ? ? ? ? ? #是fastcgi相关的配置文件
? ? ? ? fastcgi_params? ? ? ? ? ? ? ? ? #fastcgi的参数备份文件
? ? ? ? scgi_params? ? ? ? ? ? ? ? ? ? ? #scgi的参数文件
? ? ? ? uwsgi_params? ? ? ? ? ? ? ? ? ?#uwsgi的参数备份文件
? ? ? ? mime.types? ? ? ? ? ? ? ? ? ? ? ? #记录的是HTTP协议中Content-Type的值和文件后缀的对应关系
? ? ? ? nginx.conf? ? ? ? ? ? ? ? ? ? ? ? ? #nginx的核心配置文件,非常重要
? ? ? ? koi-utf、koi-win、win-utf? ? #这三个文件都是与编码转换映射相关的配置文件,用来将一种编码转化成另一种编码
一级子目录html下存放是nginx自带的两个静态页面
? ? ? ? 50x.html? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #访问失败后的失败页面
? ? ? ? index.html? ? ? ? ? ? ? ? ? ? ? ? ? ?#成功访问默认的首页
一级子目录logs记录入门文件,启动nginx后里面会有access.log、error.log、nginx.pid三个文件分别是访问日志,错误日志、nginx的进程号
sbin里面存放的是nginx执行文件,用以执行命令
? ? ? ? 2.4、Nginx服务的信号量控制
主要需要搞清楚以下几点:
- Nginx中的master和worker进程?
- Nginx的工作方式?
- 如何获取进程的PID?
- 信号有哪些?
- 如何通过信号控制Nginx的启停等相关操作?
Nginx的高性能与其架构模式有关,Nginx默认采用的是多进程的方式来工作的,启动Nginx服务后,可以通过如下命令查看Nginx相关的进程信息:
ps -ef|grep nginx #-e entire完全的,显示有关其他用户进程的信息,包括那些没有控制终端的进程
#-f 格式化显示,uid, pid, parent pid, recent CPU usage, process start time, controlling tty,elapsed CPU usage, and the associated command
首先启动nginx
cd /usr/local/nginx/sbin
./nginx
结果如下:
[root@localhost sbin]# ps -ef|grep nginx
root 14892 1 0 06:41 ? 00:00:00 nginx: master process ./nginx
nobody 14894 14892 0 06:41 ? 00:00:00 nginx: worker process
root 15531 3248 0 06:48 pts/0 00:00:00 grep --color=auto nginx
????????从上图中可以看到,Nginx后台进程中包含一个master进程和多个(图中只有一个,可以有多个)worker进程,master进程主要用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态,当worker进程出现异常退出后,会自动重新启动新的worker进程。而worker进程则是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的。
root 15531 3248 0 06:48 pts/0 00:00:00 grep --color=auto nginx
?这行是因为你使用ps -ef|grep nginx导致的的一个与nginx字样有关的grep的进程
?nginx的进程模型,我们可以通过下图来说明下:
? ? ? ? 作为管理员,只需要通过给master进程发送控制信号就可以控制Nginx,这个时候我们需要有两个前提条件,一个是mater进程在运行,一个是我们发信号(操作系统叫信号量)控制
? ? ? ? (1)要想要操作Nginx的master进程,就需要获取到master进程的进ID,获取方式可以从前面我们一直提到过的nginx.pid文件。主要方式有两种:
ps -ef | grep nginx #根据结果查看master进程的pid
#使用nginx.pid文件
cat /usr/local/nginx/logs/nginx.pid
more /usr/local/nginx/logs/nginx.pid
#使用"`"这个符号将命令引住,就可以实现将其输出作为其他命令的参数值输入
? ? ? ? (2)信号表
信号 | 作用 |
---|
TERM/INT | 立即关闭整个服务 | QUIT | 优雅的关闭服务,即处理完最后的请求后关闭 | HUP | 重新读取配置文件,重新创建worker进程使得配置生效 | USR1 | 重新链接到另一个日志文件,可以搭配周期任务做日志切割 | USR2 | 平滑升级到最新版本的nginx,不中断服务 | WINCH | 所有子进程不在接收新连接,相当于给work的QUIT指令,但是与QUIT的区别是master进程不退出,也就是程序不关闭 |
发送信号的方法是
kill -signal PID #例如 kill -INT 123456
所以有如下命令
kill -INT `cat /usr/local/nginx/logs/nginx.pid` #立即关闭nginx
kill -TERM `cat /usr/local/nginx/logs/nginx.pid` #立即关闭nginx
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid` #优雅关闭
kill -HUP `cat /usr/local/nginx/logs/nginx.pid` #让nginx动态读取配置
kill......
使用USR1信号重新链接日志文件
? ? ? ? 这里要强调一下这个信号量,首先需要的是在Linux中我们的程序和文件的关联并不是通过文件的名字,其实文件的名字只是文件的一个属性,在磁盘中存储的也是描述符里面的文件名而已,我们的系统与文件关联的是文件的物理存储地址,“所以有些同学想的直接把access.log改个名字,之后的访问不就直接会写入新的access.log这种想法其实是不正确的”。无论我们的文件怎么改名字你都会发现访问日志都会追加在你改过名字的文件里面,这点你可以看我下面的验证,所以有了这个信号量我们就可以控制程序链接到新的文件中,进而做日志分割,当然可以搭配上周期任务+shell脚本,自动化完成定时日志分割。下面做一个小验证:
首先开启nginx服务器
./nginx
此时你的nginx链接的访问日志默认是access.log,你可以使用浏览器访问一下nginx,用你的主机输入虚拟机ip作为网址访问即可。可以发现access.log文件有新的内容增加,使用如下命令将文件改名:
cd /usr/local/nginx/logs/ # 进入这个文件夹
mv access.log abc.log # 重命名为abc.log
可以使用如下命令追踪这个abc.log的变化
tail -f abc.log #-f 是follow追踪的意思
接着你再访问一次nginx,你会发现虽然你改过名字但是还是会向这个文件增加内容。
你给它发个USR1的信号量
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
????????你直接ls一下就能发现access.log又被新建了一个,并且新的访问记录被写入了这个新建的文件,顺滑的切换了。
使用USR2信号给master进程,实现平滑的升级,添加新模块,移除模块等等操作
下面是一个简单的描述执行之后会发生什么。
????????发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master进程和work进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在/usr/loca1/nginx/logs/nginx.pid而之前的旧的/usr/loca1/nginx/logs/nginx.pid会被重命名为/usr/loca1/nginx/1ogs/nginx.pid.oldbin,接着再次发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭
[root@192 logs]# ps -ef | grep nginx
root 22928 1 0 07:57 ? 00:00:00 nginx: master process ./nginx
nobody 22930 22928 0 07:57 ? 00:00:00 nginx: worker process
root 24500 22928 0 08:17 ? 00:00:00 nginx: master process ./nginx
nobody 24503 24500 0 08:17 ? 00:00:00 nginx: worker process
root 24533 16221 0 08:17 pts/0 00:00:00 grep --color=auto nginx
可以看到下面这个 master process的父进程id是22928,也就是第一个master process。所以读到现在了,聪明的你有没有想到怎么平滑的升级,没错就是用源码的configure重新编译,这是更改参数进行模块的添加和减少,重新编译后生成的目标文件中的心得nginx执行文件替换原来的sbin下的nginx执行文件,也可以将原来的sbin下的nginx文件重命名备份起来,之后将新编译的nginx执行文件复制到sbin目录下,发送USR2信号,再发送QUIT信号给旧的mstaer进程,实现升级。具体的再后面会讲,这里只做了解。
? ? ? ? 2.5、Nginx命令控制
????????此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来进行Nginx状态的控制,我们可以通过nginx -h来查看都有哪些参数可以用:
????????
[root@192 sbin]# ./nginx -?
nginx version: nginx/1.20.1
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it 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/)
-e filename : set error log file (default: /usr/local/nginx/logs/error.log)
-c filename : set configuration file (default: /usr/local/nginx/conf/nginx.conf)
-g directives : set global directives out of configuration file
#翻译后的
Options:
-?,-h : 帮助选项
-v : 显示版本,然后退出
-V : 显示版本和安装时的configure agrs,然后退出,我们之前就用的这个选项
-t : 测试配置文件是否正确,如果错误就提示错误地方
-T : 测试配置文件是否正确,如果正确就打印出所有配置内容,如果错误那么和 -t效果一样
-q : 测试期间禁止显示非错误的信息
#对nginx -t/T 如果后面没有配置文件的路径则测试的是默认路径,如果有文件路径,则测试的这个路径指定的文件
-s signal : 发信号量给主进程,可以发的有: stop, quit, reopen, reload 分别对应INT/TERM QUIT USR1 HUP
-p prefix : 设置prefix 路径 (默认: /usr/local/nginx/)
-e filename : 设置错误日志文件位置(default: /usr/local/nginx/logs/error.log)
-c filename : 设置配置文件位置 (default: /usr/local/nginx/conf/nginx.conf)
-g directives : 设置在配置文件外补充的配置,使用命令行的方式
#后面这几种都是启动时给的本次启动有效的参数,仅对本次启动有效
所以下面是一些基本的命令
./nginx -s stop #立即停止nginx
./nginx -s reopen #重新链接日志文件
./nginx -s quit #优雅的退出
./nginx -s reload #重新加载配置
./nginx -t #测试默认位置配置文件是否有错误
./nginx -t /nginx.conf #测试根目录下nginx.conf文件是否有配置错误
未完待续。。。
?
|