Nginx("engine x") 是目前使用最广泛的web服务器,同时也是常用的反向代理服务器。本文对Nginx基础功能做一些总结,希望自己加深理解的同时,对需要的朋友有所帮助。
一.安装Nginx
1.nginx依赖于pcre库,要先安装pcre,执行以下命令
yum install pcre pcre-devel
2.下载nginx源码包,并解压,执行以下命令
./configure --prefix=/usr/local/nginx
make && make install
3.进入安装目录,cd /ulsr/local/nginx, 看到如下4个目录
....conf 配置文件
... html 网页文件
...logs 日志文件
...sbin 主要二进制程序
要启动nginx,执行命令 ./sbin/nginx
二.Nginx的工作模式
nginx是一个多进程/多线程高性能web服务器,在linux系统中,nginx启动后会以后台守护进程(daemon)的方式去运行,后台进程包含一个master进程和多个worker进程(这个数量可以在nginx.conf配置文件中worker_processes这个参数设置),可以充分利用多核架构。nginx工作模式是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。nginx在启动之后会有一个master进程和多个worker进程(默认是一个),多个worker子进程将监听同一个端口,并行处理请求。
master主进程主要用来管理worker进程,主要作用是:读取并验正配置信息,管理真正提供服务的worker进程,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。master进程不会对用户请求提供服务,而用户的请求则是worker进程来响应的。
worker 进程数应该设置为等于 CPU 的核数(CPU数*核数),高流量并发场合也可以考虑将进程数提高至 CPU 核数 * 2。
三.Nginx的信号控制
nginx是通过linux系统信号量来控制的。
Nginx支持以下几种信号选项:
TERM,INT: 快速关闭
QUIT :从容关闭(优雅的关闭进程,即等请求结束后再关闭)
HUP :平滑重启,重新加载配置文件 (平滑重启,修改配置文件之后不用重启服务器。直接kill -PUT 进程号即可)
USR1 :重新读取日志文件,在切割日志时用途较大(停止写入老日志文件,打开新日志文件,之所以这样是因为老日志文件就算修改的文件名,由于inode的原因,nginx还会一直往老的日志文件写入数据)
USR2 :平滑升级可执行程序 ,nginx升级时候用
WINCH :从容关闭工作进程
具体语法:
kill -信号选项 nginx的主进程号
kill -HUP 4873
nginx的主进程号,每次查询有点麻烦。其实nginx会通过nginx.pid文件记录主进程号,可以使用如下统一的语法简化上述操作:
kill -信号控制 `cat /xxx/path/log/nginx.pid`
nginx也可以使用./sbin/nginx -s 命令选项,来发送信号量。命令方式使用简单,但没有直接使用信号量丰富。
命令选项包括:stop、quit、reopen、reload
四.Nginx日志
1.Nginx允许针对不同的虚拟主机server做不同的日志。
2.nginx日志切割和备份
将日志按日期进行切割和备份是常见的运维操作,但nginx日志不能简单进行复制操作实现。
在linux中,一个文件对应一个节点叫inode, inode才是文件在磁盘上真正的位置,而文件名只是表象。
Linux系统允许多个文件名可以指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。
由于日志文件一直被nginx进程打开,所以即使使用mv命令改名并新建了同名的新文件,nginx进程还是打开原来的文件描述符指向原来的磁盘空间(node),还是向原来的文件中写入。即使执行文件删除命令还是向原来的磁盘空间写入。因此要实现日志备份、切割等操作,需要使用nginx的USR1信号量进行操作。
具体脚本:
#!/bin/bash
base_path='/usr/local/nginx/logs'
log_path=$(date -d yesterday +"%Y%m")
day=$(date -d yesterday +"%d")
mkdir -p $base_path/$log_path
mv $base_path/access.log $base_path/$log_path/access_$day.log
#echo $base_path/$log_path/access_$day.log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
这里顺便说一下软连接。除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。
五.location的解析过程
location 是”定位”的意思, 根据Uri来进行不同的定位。
location 的语法
location [=|~|~*|^~] patt {
}
中括号可以不写任何参数,此时称为一般匹配,也可以写参数
因此,大类型可以分为3种
location = patt {} [精准匹配]
location patt{} [一般匹配]
location ~ patt{} [正则匹配]
location的命中过程是这样的:
1.先判断精准匹配,如果命中,立即返回结果并结束解析过程。
2.判断普通匹配,如果有多个命中,记录下最长匹配的命中结果,只是记录但不结束。
3.继续判断正则匹配的解析结果,按配置文件的先后顺序为准。由上向下开始匹配,如果匹配成功立即返回并结束解析过程。如果没有命中则返回普通匹配记录的命中结果。
注意:普通匹配,顺序无所谓,按匹配的长短来确定。正则匹配,按配置的先后顺序,由上向下开始匹配。
六.rewrite重写
rewrite重写功能是nginx服务的一个非常重要的功能模块,其可以重新修改域名,为企业将动态的URL地址伪装成静态的地址等。
1.rewrite语法
rewrite 正则表达式 定向后的位置 模式
例如:将Goods-3.html页面,重写到id=3的后端程序 Goods.php?goods_id=3
rewrite goods-([\d]+)\.html$ /ecshop/goods.php?id=$1;
注意:用url重写时, 正则里如果有”{}”,正则要用双引号包起来。
2.服务器内部的rewrite和302跳转不一样。302跳转URL变成重新http请求, 而内部rewrite, 上下文没变。就是说 fastcgi_script_name 仍然是原来的内容。因此要考虑循环重定向问题,在需要的地方使用break指令.
七.其它
1.如果页面或其它静态文件做了改动,有时客户端浏览器缓存而没有及时刷新最新代码。为了保证客户端浏览器及时更新最新代码,可以通过nginx设置不使用缓存。在server段增加以下设置:
add_header Cache-Control no-cache;
发现上一次写文章居然是1年多之前了。不知不觉间,时光飞逝。不知是工作太忙,还是自己懈怠了。疫情期间,生活节奏放缓了一些,对于中国人民来说,辩证的看,也有些许好的一面。