ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx

2021-09-25 09:59:08  阅读:99  来源: 互联网

标签:请求 nginx ## worker Nginx 进程


一、Nginx的介绍

Nginx是一款轻量级、高性能的HTTP和反向代理web服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行;其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好;中国大陆使用nginx网站用户有:百度、京东、新郎、网易、腾讯、淘宝等,因其稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名

Nginx与Apache的区别:

【1】Nginx相对于Apache的优点:

  • 轻量级,同样是web 服务,比apache占用更少的内存及资源
  • 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的,在高并发下nginx能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速

【2】Apache相对于Nginx的优点:

  • rewrite功能比nginx的rewrite强大
  • 模块超多,基本想到的都可以找到
  • 少bug,nginx的bug相对较多
  • 超稳定

Apache是通过libphp5.so这个模块来处理php文件;Nginx是通过php-fpm这个服务来处理php文件;Apache的libphp5.so是随着Apache服务器一起运行,而Nginx和php-fpm是各自独立运行,所以在运行过程中,Nginx和php-fpm都需要分别启动;Nginx处理动态请求是弱项,一般动态请求要Apache去做,Nginx只适合处理静态页面或反向代理;一般来说,需要性能的web服务器用Nginx,如果不需要性能只求稳定就选Apache

二、Nginx的安装

安装包下载地址:nginx.org

安装包文件:nginx-1.20.1.tar.gz

解压此压缩包:tar zxf nginx-1.20.0.tar.gz

auto                ##cc编译目录

conf                ##配置文件目录

contrib                ##提供语法检测字体

html                ##默认发布目录

src                ##源码目录 

解决依赖性:

编译安装:

运行nginx:

运行测试:

三、Nginx的优化

屏蔽nginx的版本号和缩小nginx命令占用空间

优化步骤:

make  clean清除编译后的Makefile文件

编辑gcc编译文件关闭gcc编译时的debug检测

编辑nginx源码文件nginx.h关闭版本显示

以上配置完成后重新编译生成objs目录

停掉之前运行的nginx:/usr/local/nginx/sbin/nginx  -s  stop

将新生成的objs下的nginx更新至/usr/local/nginx/sbin并创建命令软链接

优化完成,运行nginx查看效果

四、配置Nginx使用守护进程运行控制

在守护进程的启动脚本目录中添加nginx.service的脚本

然后使用systemctl daemon-reload重载systemctl命令后即可使用systemctl控制nginx

五、Nginx的平滑升级及回退

1、Nginx的平滑升级 

Nginx的版本查看:nginx  -V 或 curl  localhost  -I

##此处做了Nginx的优化,未显示版本信息

平滑升级操作步骤:

【1】下载新版本并解压

【2】备份旧版本

【3】对新版本进行编译

【4】将新版本编译好的二进制程序覆盖至安装目录的旧版二进制程序

【5】杀掉旧版进程worker并启用新版

kill  -USR2  旧版master进程

##此时旧版本停止接收请求,并开启新的master产生新的worker 

##此时等待旧版本处理完正在处理的请求并关闭worker进程

##确定升级完成后可以杀掉旧版master进程

2、Nginx的版本回退

查看版本信息

版本回退操作步骤:

【1】使用备份的旧版二进制程序覆盖新版本文件

【2】因旧版已经编译过,此处即可跳过编译操作

【3】杀掉新版进程worker并启用旧版

##此处旧版的master进程已被杀掉;如未杀掉的情况可以使用kill  -HUP  旧版进程号启动旧版worker进程

【4】版本回退成功后可以杀掉新版master进程

六、Nginx的基础配置

Nginx的工作原理

Nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程

master进程主要用来管理worker进程,包含:接收来自外界的信号、向各worker进程发送信号、监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程;除了管理worker进程,还负责读取配置文件、判断配置文件语法的工作,也叫nginx的主进程

worker进程则处理基本的网络事件;多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的;一个请求只可能在一个worker进程中处理,一个worker进程不可能处理其它进程的请求;worker进程的个数是可以设置的,一般会设置与机器cpu核数一致

##########进程模型##########

此模型的优点:

~  对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多

~  采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程;当worker进程异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,降低了风险 

1、指定服务用户

2、指定worker进程数

##查看系统的CPU信息

##worker数量根据cpu核心数量进行调整

当worker_ processes设定为auto时,nginx会自动检测当前主机的cpu核心数,并启动对应数量的worker进程;同时,为了避免cpu在切换进程时产生性能损耗,我们也可以将worker进程与cpu进行绑定,当worker进程与cpu绑定以后,worker进程可以更好的专注的使用某个cpu上的缓存,从而减少因为cpu切换不同worker进程而带来的缓存失效;如上图,使用配置指令worker_ cpu_ affinity进行cpu的绑定,2个cpu时设定为01 10,4个cpu时设定为1000 0100 0010 0001;如果当前机器上一共有n个cpu核心,那么我们就用n个0表示这些cpu核心,如果想要使用某个cpu,就将从右开始数的对应位的0改成1,比如如果有8个cpu,可以使用如下字符表示使用这8个cpu中的第二个:00000010

3、设定每个worker并发连接数

设定原则:应用的最大连接数不会大于系统和内核的限制连接数;内核的最大连接数受限于内存

##查看默认的系统允许最大连接数

##查看内核允许系统所有进程打开文件的数量 

##在此文件中设定用户或进程可以打开的最大文件描述符数量;nofile=number of open files;- =不区分软/硬连接 

注意:对于ubuntu系统,设定此文件时还需要加载相应的pam模块才能生效

 在nginx配置文件中设定最大连接数;作反向代理时允许的最大连接数为此数值/2 

七、Nginx的反向代理

反向代理功能是nginx的三大主要功能之一(静态web服务器、反向代理、负载均衡);nginx一般同时做为静态web服务器和反向代理服务器,做为web服务器访问静态文件图片、css、js、html等文件,做为反向代理服务器把请求发给后端业务处理服务,如果有多个后端处理节点,会配置负载均衡功能

nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理

使用nginx作为反向代理服务器时,其用于管理从外部网络到内部网络的连接或任何特定请求;它保护、路由和管理从外部网络到内部网络、Web服务器或专用网络的流量

nginx反向代理原理:浏览器输入网址并回车后,会发起一个http请求给nginx(反向代理服务器),这个请求如果是访问静态文件,那么nginx作为web服务器直接返回请求的内容,如果是访问的后台服务逻辑,那么nginx把请求转发给后端的服务处理

反向代理服务器的优点:

nginx反向代理重要的作用是配合upstream实现负载均衡;同时也增加了后端服务器的安全性;通过异步非阻塞的方式将请求传给后端,提升了性能和并发处理能力;可利用缓存、压缩响应提高响应速度 

1、反向代理基础配置

反向代理的轮询功能:每个请求按时间顺序逐一分配到不同的后端服务器

实验步骤:

【1】配置反向代理服务器server1

 【2】配置后端服务器server2、server3

【3】测试:

由此实验可知,nginx代理服务器通过upstream实现了后端服务器的负载均衡

2、反向代理扩展配置

【1】设置权重weight

权重越高的后端服务器被分配的客户访问越多,不指定weight值时默认weight=1

测试效果为server2的数据出现次数为server3数据出现次数的两倍

【2】ip_hash 

Nginx中的ip_hash技术能够将某个ip 的请求定向到同一台后端web机器中,这样一来这个ip 下的客户端和某个后端 web机器就能建立起稳固的session.

ip_hash机制能够让某一客户机在相当长的一段时间内只访问固定的后端的某台真实的web服务器,这样会话就会得以保持,在网站页面进行login的时候就不会在后面的web服务器之间跳来跳去了,也不会出现登录一次的网站又提醒重新登录的情况

测试效果为只出现了server2的数据(因此处设置了server2的权重为2故server2数据出现的概率高)

 ***nginx反向代理时自带健康监测,当server2关闭后后自动从server3返回数据

当server2重新启用后又只会从server2返回数据

【3】backup 

在希望成为后备的服务器ip后面添加backup参数,这台服务器就会成为备份服务器;在平时不使用,nginx不会给它转发任何请求,只有当其他节点全部无法连接的时候,nginx才会启用这个节点;一旦有可用的节点恢复服务,该节点则不再使用,重又进入后备状态

可以两台主机互为热备,平时各自负责各自的服务;在做上线更新的时候,关闭一台服务器后,nginx自动把流量切换到另外一台服务的后备主机上,从而实现无痛更新,保持服务的持续性,提高服务的可靠性

当把后端服务器server2、server3关闭后测试结果为

当server2、server3重新启用后得到的测试结果为

【4】sticky

Nginx的ip_hash是根据客户端的IP将请求分配到不同的服务器上;而Nginx的sticky模块是基于cookie的一种负载均衡解决方案,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器;请求来了,服务器发个cookie,并说:下次来带上,直接来找我

##cookie:服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发行者,需要浏览器支持

sticky工作原理:通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上

sticky的处理过程如下(假设cookie名称为route):

客户端首次发起请求,请求头未带route的cookie;nginx接收请求,发现请求头没有route,则以轮询方式将请求分配给后端服务器——>后端服务器处理完请求,将响应头和内容返回给nginx——>nginx生成route的cookie,返回给客户端;route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值——>客户端接收请求,并创建route的cookie——>客户端再次发送请求时,带上route

配置步骤:

关闭nginx后重新编译nginx,添加sticky模块

编译(make)完成后在配置文件中添加sticky参数后启动nginx

测试效果

##curl命令测试可以看到nginx的轮询

##浏览器访问则一直为server2服务器提供数据  

八、Nginx的限流

Nginx提供两种限流方式:限制速率、限制并发连接数

【1】控制单IP的并发连接数

实验步骤:

编辑nginx配置文件添加限制并发区域(目录)

$binary_remote_addr        ##表示通过remote_addr这个标识来做限制

zone=addr:10m        ##表示生成一个大小为10M,名字为addr的内存区域 

limit_conn addr 1        ##限制并发数

添加限制区域内的素材文件

重启nginx后测试

##1个并发时所有请求全部完成,无请求失败 

##多个并发时请求出现请求失败 

【2】控制单IP的并发连接带宽

实验步骤:

编辑nginx配置文件添加限制带宽区域(目录)

重启nginx后进行压力测试

##并发数=1时,请求数越多访问时间越长 

限制带宽本质上也是限制了请求速率

【3】限制请求速率

ngx_http_limit_req_module模块提供限制请求处理速率的功能,可以在nginx配置文件中使用limit_req指令来进行配置

##zone:定义共享内存区域来存储访问信息;addr:10m表示一个大小为10M,名为addr的内存区域;rate=1r/s:限制相同标识的客户端每秒只能访问1次

rate用于设置最大访问速率,rate=1r/s表示每秒最多处理1个请求;Nginx实际上以毫秒为粒度来跟踪请求信息,因此1r/s本质为:每1000毫秒处理一个请求;这意味着自上一个请求处理完后,若后续1000毫秒内又有请求到达,将拒绝处理

##配置限速区域

压力测试效果:

##因限制每秒处理1个请求,故后续请求都会被拒绝处理

burst参数 

此参数可以配置在超过设定的处理速率后能额外处理的请求数量;上面例子限制1r/s,如果正常流量突然增大,超出的请求将被拒绝,无法处理突发流量,可以结合此参数使用来解决问题

##burst=5表示将超出速率的请求放入队列,每隔1s从队列中抓取一个请求进行处理,并保持此种循环直到所有请求都被处理完成

此时测试效果为: 

nodelay参数 

上述中所有请求都被处理完成,但是很低效,这种情况下可以结合此参数来对上述解决方式进行优化

##nodelay针对的是burst参数,burst=5 nodelay表示第一个请求和队列里的5个请求会立即处理,不能延迟,相当于特事特办;不过后续超出(burst数+1)的请求则会被拒绝

测试效果:

##burst=5

##burst=20

##burst=66  

九、Nginx配置管理

1、自动索引

Nginx未配置自动索引时,浏览器访问时需要具体到文件

在Nginx的配置文件中配置自动索引功能

重启Nginx后测试功能

2、Nginx缓存配置

Nginx配置缓存可以降低i网站带宽,加速用户访问

##在Nginx配置文件中添加此功能

重启Nginx后测试功能

3、Nginx的日志轮询

##编辑脚本配置nginx的日志备份功能

##执行脚本后之前的日志都被备份至新日志文件,原日志文件中内容被清空

再次进行访问测试后,原日志文件中生成内容

日志轮询功能可以结合定时任务使用,以做到规律性的日志轮询;还可以配置禁用不必要的日志记录以节省磁盘IO消耗

添加访问请求后测试(查看日志)

4、访问限制配置

【1】站点目录和文件的限制

##配置限制访问区域

重启nginx后访问测试:

【2】限制IP

##配置限制IP

重启nginx后访问测试:

【3】设定报错返回码

重启nginx后访问测试

【4】恶意解析防护配置

未防止域名恶意解析到服务器IP,可以设定错误返回码或者将访问重定向

实验步骤:

配置恶意解析

配置重定向 

重启nginx后访问测试

5、Nginx的重定向

【1】80重定向至443(https)

##配置重定向的server模块 

##创建https的证书并将证书文件使nginx在重启时可以读取到

##配置原访问位置的重定向

重启nginx后进行访问测试:

【2】虚拟主机的重定向

##配置虚拟主机bbs并创建默认发布文件内容

##配置原访问的重定向至虚拟主机

##重启测试

针对以上情况可以按如下进行配置重定向

重启后测试结果为

【3】虚拟主机重定向至原访问路径(bbs.westos.org重定向www.westos.org/bbs) 

##配置访问bbs的请求重定向至原路径下的bbs目录并配置发布文件内容

访问测试效果:

以配置方式得到效果同以下

6、Nginx的防盗链功能

配置盗链行为

此盗链可以被访问到

配置防盗链功能

重启nginx后访问之前被盗链接效果为

##无法访问

还可以将盗链的访问重定向

此时重启nginx后访问之前被盗链接效果为

7、中文乱码修复

##发布页面默认不支持中文

##配置nginx编码格式为utf-8

##清除浏览器页面缓存后重新访问,可以查看到中文

标签:请求,nginx,##,worker,Nginx,进程
来源: https://blog.csdn.net/m0_59749940/article/details/120059933

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有