Nginx之基础篇2

五、Nginx

5.1定义:

Nginx是免费,开源,高性能的HTTP和反向代理服务器邮件代理服务器,以及TCP/UDP代理服务器

解决C10K问题(10K Connection),http://www.ideawu.net/blog/archives/740.html

5.1.1:Nginx功能介绍:

静态的web资源服务器HTML,图片,js,css,txt等静态资源

结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求

http/https协议的反向代理

imap4/pop3协议的反向代理

tcp/udp协议的请求转发(反向代理)

5.1.2:和web服务相关的功能:

虚拟主机(server)

支持 keep-alive 和管道连接(利用一个连接做多次请求)

访问日志(支持基于日志缓冲提高其性能)

url rewrite

路径别名

基于IP及用户的访问控制

支持速率限制及并发数限制

重新配置和在线升级二无须中断客户的工作进程

5.2:Nginx组织结构:

web请求处理机制:

1、多进程⽅式

服务器每接收到⼀个客户端请求

就有服务器的主进程⽣成⼀个⼦进程响应客户端

直到⽤户关闭连接

这样的优势是处理速度快,各⼦进程之间相互独⽴,但是如果访问过⼤会导致服务器资源耗尽⽽⽆法提供请求。

2、多线程⽅式

与多进程⽅式类似

但是每收到⼀个客户端请求会有服务进程派⽣出⼀个线程来个客户⽅进⾏交互

⼀个线程的开销远远⼩于⼀个进程

因此多线程⽅式在很⼤程度减轻了web服务器对系统资源的要求

但是多线程也有⾃⼰的缺点

当多个线程位于同⼀个进程内⼯作的时候,可以相互访问同样的内存地址空间,所以他们相互影响

另外⼀旦主进程挂掉则所有⼦线程都不能⼯作

IIS服务器使⽤了多线程的⽅式,需要间隔⼀段时间就重启⼀次才能稳定。

5.2.1:组织模型:

Nginx是多进程组织模型,是一个由Master主进程和Worker工作进程组成
在这里插入图片描述

主进程(master process)的功能:

读取 Nginx配置文件 验证 有效性和正确性

建立,绑定,关闭 socket连接

按照配置生成、管理和结束工作进程

接受外界指令、比如重启、升级及退出服务器等指令

不中断服务,实现平滑升级,重启服务并应用新的配置

开启日志文件,获取文件描述符

不中断服务,实现平滑升级,升级失败进行回滚处理

编译和处理perl脚本

⼯作进程(woker process)的功能:

接受处理客户的请求

将请求依次送⼊各个功能模块 —>进⾏处理

IO调⽤,获取响应数据

后端服务器通信---->接收后端服务器的处理结果

缓存数据,访问缓存索引,查询和调⽤缓存数据

发送请求结果,响应客户的请求

接收主程序指令,⽐如重启、升级和退出

5.2.2:进程间通信:

在这里插入图片描述

5.3:Nginx模块介绍:
核⼼模块:core module
标准模块:
HTTP 模块: ngx_http_*
 HTTP Core modules 默认功能
 HTTP Optional modules 需编译时指定
Mail 模块 ngx_mail_*
Stream 模块 ngx_stream_*
第三⽅模块

在这里插入图片描述

5.3.1:Nginx yum安装:

需要提前配置号epel源

[root@s1 ~]# yum install epel-release -y
[root@s1 ~]# yum install -y nginx
[root@s1 ~]# rpm -ql nginx
[root@s1 ~]# which nginx
/usr/sbin/nginx
5.4.1:检查安装:

查看nginx安装包信息

[root@s1 ~]# rpm -qi nginx
5.4.2:查看帮助:

使用安装完成的二进制文件nginx

[root@s1 ~]# nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-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/share/nginx/) #指定Nginx ⽬录
-c filename : set configuration file (default: /etc/nginx/nginx.conf) #配置
⽂件路径
-g directives : set global directives out of configuration file #设置全局指令
5.4.3:验证Nginx:
[root@s1 ~]# nginx -t
[root@s1 ~]# nginx -V
5.4.4:Nginx启动脚本:
[root@s1 ~]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
一些报错
查看 systemctl reload nginx 是否成功
ps -ef |grep nginx
systemctl reload nginx
ps -ef |grep nginx
(需等一分钟--->进程提供的时间只能精确到分钟)
父进程root PID不变,nginx进程PID,时间改变
tail /apps/nginx/logs/access.log
其中[error]"/apps/nginx/html/favicon.ico"failed
指网站标签中没有logo
5.5:默认配置⽂件:
[root@s2 ~]# grep -v "#" /apps/nginx/conf/nginx.conf | grep -v "^$"
#全局配置端,对全局⽣效,主要设置nginx的启动⽤户/组,启动的⼯作进程数量,⼯作模式,Nginx的PID路径,⽇志路径等。
user nginx nginx;
worker_processes 1; #启动⼯作进程数数量
events { #events设置快,主要影响nginx服务器与⽤户的⽹络连接,⽐如是否允许同时接受多个⽹络连接,使⽤哪种事件驱动模型处理请求,每个⼯作进程可以同时⽀持的最⼤连接数,是否开启对多⼯作进程下的⽹络连接进⾏序列化等。

 worker_connections 1024; #设置单个nginx⼯作进程可以接受的最⼤并发,作为web服务器的时候最⼤并发数为worker_connections * worker_processes,作为反向代理的时候为
(worker_connections * worker_processes)/2
}
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和⽇志格式定义等绝⼤多数功能和第三⽅模块都可以在这设置,http块可以包含多个server块,⽽⼀个server块中⼜可以包含多个location块,server块可以配置⽂件引⼊、MIME-Type定义、⽇志⾃定义、是否启⽤sendfile、连接超时时间和单个链接的请求上限等。

 include mime.types;
 default_type application/octet-stream;
 sendfile on; #作为web服务器的时候打开sendfile加快静态⽂件传输,指定是否使⽤
 
sendfile #系统调⽤来传输⽂件,sendfile通过DMA(直接内存访问)⽅式直接访问⽂件数据,并通过传输协议发送,从⽽避免了数据在内核缓冲区和⽤户缓冲区之间的拷⻉,操作效率很⾼,被称之为零拷⻉,硬盘

>> kernel buffer #(快速拷⻉到kernel socket buffer) >>协议栈。
 # DMA(Direct Memory Access)即直接内存访问,DMA是⼀种完全由硬件执⾏I/O交换的⼯作⽅式,⼀个处理器可以包含多个DMA控制器,每个控制器有多个DMA通道,以及多条直接与存储器站(memorybank)和外设连接的总线,在很多⾼性能处理器中集成了两种类型的DMA控制器,第⼀类通常称为“系统DMA控制器”,可以实现对任何资源(外设和存储器)的访问,第⼆类称为内部存储器DMA控制器,专⻔⽤于内部存储器所处位置之间的相互存取操作,即数据交换不经过CPU在不同的内存空间进⾏拷⻉可以节省资源copy带来的上线⽂切换,可以直接在内存和I/O设备之间进⾏,可以⼤幅提⾼CPU性能。
 
 keepalive_timeout 65; #⻓连接超时时间,单位是秒
 
 server { #设置⼀个虚拟机主机,可以包含⾃⼰的全局快,同时也可以包含多个location模块。⽐如本虚拟机监听的端⼝、本虚拟机的名称和IP配置,多个server 可以使⽤⼀个端⼝,⽐如都使⽤80端⼝提供web服务、
 
 listen 80; #配置server监听的端⼝
 
 server_name www.300.cn; #本server的名称,当访问此名称的时候nginx会调⽤当前serevr内部的配置进程匹配。
 
 location / { 
 #location其实是server的⼀个指令,为nginx服务器提供⽐较多⽽且灵活的指令,都是在location中体现的,主要是基于nginx接受到的请求字符串,对⽤户请求的UIL进⾏匹配,并对特定的指令进⾏处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三⽅模块的配置也是在location模块中配置。
 
 root html; #相当于默认⻚⾯的⽬录名称,默认是相对路径,可以使⽤绝对路径配
置。
 index index.html index.htm; #默认的⻚⾯⽂件名称
 }
 error_page 500 502 503 504 /50x.html; #错误⻚⾯的⽂件名称
 location = /50x.html { #location处理对应的不同错误码的⻚⾯定义到/50x.html,
这个跟对应其server中定义的⽬录下。
 root html; #定义默认⻚⾯所在的⽬录
 }
 }
 
#和邮件相关的配置
#mail {
# ...
# } mail 协议相关配置段
#tcp代理配置,1.9版本以上⽀持
#stream {
# ...
# } stream 服务器相关配置段
#导⼊其他路径的配置⽂件
#include /apps/nginx/conf.d/*.conf
}
5.5.1worker_processes

查看详情http://nginx.org/en/docs/ngx_core_module.html#worker_processes

Binds worker processes to the sets of CPUs. Each CPU set is represented by a bitmask of allowed CPUs. There should be a separate set defined for each of the worker processes. By default, worker processes are not bound to any specific CPUs.

For example,

worker_processes    4;   #工作进程
worker_cpu_affinity 0001 0010 0100 1000;  #进程绑定,绑定到cpu上
binds each worker process to a separate CPU, while

worker_processes    2;
worker_cpu_affinity 0101 1010;

在这里插入图片描述

如果线程工作在cpu0~3切换,它会在所在的cpu上申请内存空间,跳到其他cpu上时需要回收上一个所在的cpu上的内存,申请和回收内存由kernel来开销,反复的操作不必要的系统损耗。

5.5.2零拷贝

零拷贝(Zero-copy)技术,因为我们没有在内存层面去拷贝数据,也就是说全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的

sendfile
在这里插入图片描述

从 Linux 内核 2.4 版本开始起,对于支持网卡支持 SG-DMA 技术的情况下, sendfile() 系统调用的过程发生了点变化,具体过程如下:

  • 第一步,通过 DMA 将磁盘上的数据拷贝到内核缓冲区里

  • 第二步,缓冲区描述符和数据长度传到 socket 缓冲区

    这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里

    此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中

    这样就减少了一次数据拷贝;

在这里插入图片描述

mmap + write

具体过程如下:

应用进程调用了 mmap() 后

DMA 会把磁盘的数据拷贝到内核的缓冲区里

接着,应用进程跟操作系统内核「共享」这个缓冲区
应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中

这一切都发生在内核态,由 CPU 来搬运数据
最后,把内核的 socket 缓冲区里的数据,拷贝到网卡的缓冲区里,这个过程是由 DMA 搬运的
在这里插入图片描述

5.5.3server_name

详情http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name

Syntax:	server_name name ...;
Default:	
server_name "";
Context:	server
Sets names of a virtual server, for example:

server {
    server_name example.com www.example.com;
}
The first name becomes the primary server name.

Server names can include an asterisk (“*”) replacing the first or last part of a name:

server {
    server_name example.com *.example.com www.example.*; #模糊匹配
}

验证进程优先级

watch -n1 'ps -axo pid,cmd,nice|grep nginx'
Every 1.0s: ps -axo pid, cmdcentos8mini.magedu.org: Tue Mar 23 20:01:18 2021
91199 nginx: master process /usr/ 
91200 nqinx: worker process 
91201 nginx: worker process
92056 grep nqinx9оо
watch -n1 'ps -axo pid,cmd,nice,psr|grep nginx'#可查看所在cpu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值