当前位置: 首页 > news >正文

Nginx的介绍

Nginx的介绍

制作人:全心全意

I/O模型介绍

Select:Linux实现对应,I/O复用模型,BSD4.2最早实现

Poll:Linux实现,对应I/O复用模型,System V unix最早实现

Epoll:Linux实现,对应I/O复用模型,具有信号驱动I/O模型的某些特性

实现机制

 selectpollepoll
操作方式遍历遍历回调
底层实现数组链表哈希表
IO效率每次调用进行线性遍历,时间复杂度O(n)每次调用进行线性遍历,时间复杂度O(n)事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,时间复杂度O(1)
最大连接数1024(x86)或2048(x64)无上限无上限
fd拷贝每次调用select,都需要将fd集合从用户态拷贝到内核每次调用poll,都需要将fd集合从用户态拷贝到内核调用时拷贝进内核并保存,之后每次epoll_wait不拷贝

 

epoll的介绍

说明:

在Linux2.6内核中提出的select和poll的增强版本

支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次

使用”事件“的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知

优点:

没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口)

效率提升:非轮询方式,不会随着FD数目的增加而效率降低;只有活跃可用的FD才会调用callback函数,即epoll最大的优点就在于它只管理”活跃“的连接,而跟连接总数无关

内存拷贝:利用mmap加速与内核空间的消息传递;即epoll使用mmap减少复制开销

 

nginx的程序架构

master/worker结构

一个master进程:负责加载和分析配置文件、管理worker进程、平滑升级

一个或多个worker进程:处理并响应用户请求

缓存相关的进程:

  cache loader:装载缓存对象

  cache manager:管理缓存对象

 

nginx模块

nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载

模块的分类:

  核心模块:core module

  标准模块:

    HTTP模块:ngx_http_*

      HTTP Core modules 默认功能

      HTTP Optional modules 需编译时指定

    Mail模块:ngx_mail_*

    Stream模块:ngx_stream_*

  第三方模块

 

nginx命令选项

命令语法:
	nginx [-?hqTtVv] [-c file] [-g directives] [-p prefix] [-s signal]

选项:
	-?,-h				查看帮助
	-c file				指定配置文件(默认:/etc/nginx/nginx.conf)
	-v					显示版本和编译语法并退出
	-t					检查配置文件语法
	-T					检查配置文件语法并输出配置文件
	-q					在检查配置文件时,不显示非错误信息
	-s signal			发送信号(stop停止、quit退出、reopen重启、reload加载配置文件)
	-p prefix			指定工作目录路径(默认:/usr/share/nginx)
	-g directives		指定全局参数和附加配置文件

  

nginx配置文件介绍

主配置文件结构

main block:主配置段,即全局配置段,对http,mail都生效
	event{
		...
	}	事件驱动相关配置
http {
	...
}	http/https协议相关配置段
mail {
	...
}	mail协议相关配置段
stream {
	...
}	stream服务器相关配置段

http协议相关的配置结构

http {
	...
	各server的公共配置
	...
	server {  每个server用于定义一个虚拟主机
		...
	}
	server {
		...
		server_name 虚拟主机名
		root 主目录
		alias 路径别名
		location [OPENATOR] URL {	指定URL的特性
			...
			if CONDITION {
			
			}
		}
	}
}

 

  • 主配置段

user:指定nginx(worker进程)的运行用户,只能放在主配置段

pid:pid文件位置

include:指定包含进来的其他配置文件路径

load_module:加载模块

性能相关

worker_processes:worker进程的数量;通常为当前主机CPU的物理核心数,也可设置为auto

worker_cpu_affinity:绑定一个worker进程一直在某一个cpu上运行(cpumask:00000001、00000010、00000100,分别代表第零、一、二号CPU)

worker_priority:指定worker进程优先级,范围是[-20,20],默认为0

worker_rlimit_nofile:指定worker进程所能够打开的文件数量上限,如65535

调试和定位

daemon:是否以守护进程方式运行Nginx,默认是守护进程方式(后台)on|off

master_process:是否以master/worker模型运行nginx;默认为on,off将不启动worker

error_log:指定错误日志输出位置

 

  • 事件驱动

worker_connections:每个worker进程支持多少个并发连接

use:指定并发连接请求的处理方法,默认自动选择最优方法(epoll)

accept_mutex:处理新的连接请求的方法,on表示由各个worker轮流处理新请求,off表示每个新请求的到达都会通知所有的worker进程,但只有一个进程可以获得连接,造成“惊群”,影响性能,默认为off。

 

  • http协议的相关配置

 

server(虚拟主机)中的配置

listen:指定监听端口,可同时指定监听主机名(IP/域名)

  default_server:设定为默认虚拟主机

  ssl:限制仅能够通过ssl连接提供服务(https)

  backlog=number:设置超过并发连接后,新请求队列的长度

  rcvbuf=size:设置接收缓冲区的大小

  sndbuf=size:设置发送缓冲区的大小

server_name:指定网站名称(网站域名)

  支持通配字符*(如*.xinyi.com、www.xinyi.*)

  支持正则表达式

root:指定网站家目录

tcp_nodelay:在keepalived模式下的连接是否启动RCP_NODELAY选项(on:不延迟发送,收到一个请求立即回应一个请求,默认选项。off:延迟发送,合并多个请求后发送)

sendfile:默认为off。为on时,从磁盘中将数据拷贝到内核中封装报文直接发送,不需在从内存中转

server_tokens:是否在响应报文的Server头部显示nginx版本,可在http和server中设置(on|off)商业版可支持字符串

 

location

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;nginx会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置。该段可放在server中,也可嵌套在location中。

  =:精确匹配

  ^~:对URI的最左边部分做匹配检查,不区分字符大小写

  ~:对URI做正则表达式模式匹配,区分字符大小写

  ~*:对URI做正则表达式模式匹配,不区分字符大小写

  不带符号:匹配起始于此uri的所有uri

  匹配优先级从高到低:=,^~,~/~*,不带符号

server {
    root ...
    location ... {
        root ...
    }
}

  

alias:路径别名,文档映射的另一种机制;仅能用于location上下文。(与root的不同,例“/web”中路径“/www/html”,访问/web,使用root匹配html/web下的文件,而alias访问的是html下的文件)

index:指定默认网页文件。

error_page:定义响应状态码所对应的响应错误页(例:error_page 404 /404.html),还可以设置以200状态码响应错误页面,防止被浏览器劫持错误页面(例:error_page 404  =200 /404.html)

try_files:按顺序检查文件是否存在,返回按顺序找到的第一个文件或文件夹,如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数,只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。

location /images/ {
    try_files $uri /images/defautl.gif;
}
location / {
    try_files $uri $uri/index.html $uri.html =404;
}

 

定义客户端请求的相关配置

keepalive_timeout timeout [header_timeout]:设定保持连接超时时长,0表示禁止长连接,默认为75S

keepalive_requests number:在一次长连接上允许请求资源的最大数量,默认为100。

keepalive_disable none|browser...:对那种浏览器禁用长连接。

send_timeout time:向客户端发送响应报文的超时时长,此外是指两次写操作之间的间隔时长,而非整个响应过程的传输时长。

 

client_body_buffer_size size:用于接收每个客户端请求报文的body部分的缓冲区大小,默认为16k;超出此大小时,将其暂存到磁盘上,由client_body_temp_path指令所暂存的位置

client_body_temp_path path [level1 [level2 [level3]]]:设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字。

client_body_temp_path /var/tmp/client_body 1 2 2
1   1级目录占1位16进制,即2^4=16个目录0-f
2   2级目录占2位16进制,即2^8=256个目录00-ff
2   3级目录占2位16进制,即2^8=256个目录00-ff

 

对客户端进行限制的相关配置

 limit_rate rate:限制响应给客户端的传输速率,单位是bytes/second,默认值为0,表示无限制。(1000000 = 1M)

limit_except method ... {...}:仅用于location,限制客户端使用除了指定的请求方法之外的其它方法(GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH)

limit_except GET {
    allow 192.168.1.0/24;
    deny all;
}
#除了GET和HEAD之外其它方法仅允许192.168.1.0/24网段主机使用

 

文件操作的优化配置

aio on|off|threads[=pool]:是否启动aio功能

directio size|off:当文件大于给定大小时,例如directio 4m,同步(直接)写磁盘,而非写缓存

open_file_cache:缓存的设置

open_file_cache off
#
open_file_cache max=N [inactive=time]
nginx可以缓存以下三种信息:
    文件元数据(文件的描述符,大小和最近一次修改的时间)
    目录结构
    没有找到的或者没有权限访问的文件的相关信息
    max=N:可缓存的缓存项上线,达到上限后会使用LRU算法(最近,最少使用算法)实现管理
    inative=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除

open_file_cache_errors on|off:是否缓存查找时发生的错误的文件的一类的信息,默认值为off

open_file_cache_min_uses number:在open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数,方可被归类为活动项。

open_file_cache_valid time:缓存项有效性的检查频率,默认值为60S

 

实现基于ip的访问控制功能

location / {
    deny 192.168.1.1;
    allow 172.16.1.0/24;
    allow 2001:0db8::/32 #ipv6地址
    deny all;
}

自上而下检查,一旦匹配,立即生效。

 

实现基于用户的访问控制,使用basic机制进行用户认证

auth_basic string|off

auth_basic_user_file file

location /admin/ {
    auth_basic "Admin Area";
    auth_basic_user_file /etc/nginx/ngxpasswd;
}

用户口令文件格式:

明文文本:name:password:comment

加密文本:由htpasswd命令实现,httpd-tools所提供

 

输出nginx的基本状态信息

ngx_http_stub_status_module模块

输出信息示例:

Active connections:291
server accepts handled requests
    123 123 123
Reading:6 Writing:179 Waiting:106

  三个数字分别对应accepts,handled,requests三个值

Active connections: 当前状态 ,活动状态的连接数
accepts :统计总值 ,已经接受的客户端请求的总数
handled :统计总值 ,已经处理完成的客户端请求的总数
requests :统计总值 ,客户端发来的总的请求数
Reading :当前状态 ,正在读取客户端请求报文茵部的连接的连接数
Writing :当前状态 ,正在向客户端发送响应报文过程中的连接数
Waiting :当前状态 ,正在等待客户端发出请求的空闲连接数

 

 示例:

location /status {
    stub_status;
    allow 172.16.1.0/24;
    deny all;
}

  

用gzip方法压缩响应数据,节约宽带

gzip on|off:启用或禁用gzip压缩

gzip_comp_level level:压缩比由低到高1-9,默认为1

gzip_min_length length:启动压缩功能的响应报文大小阈值,达到指定大小的进行压缩。

gzip_http:version 1.0|1.1:设定压缩协议,默认1.1

gzip_types:指明仅对哪些类型的资源执行压缩操作,默认包含有“text/html”,不用指定,否则报错。

gzip_vary on|off:如果启用压缩,是否在响应报文头部插入“Vary:Accept-Encoding”

gzip_proxied:nginx为代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能

示例:

gzip on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css application/javascript;

  

 

 

 

 

转载于:https://www.cnblogs.com/zhangquan-yw/p/10265633.html

相关文章:

  • 14个值得推荐的个人提升方法
  • 上海科学家研制出新型“耐火宣纸”
  • Java Web:项目结构和web.xml
  • 调查:澳门96%打工者称奖金、薪酬决定工作去留
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端工程化的理解
  • 公安部发2019年春运交通安全预警 道路客运量将达24.6亿人次
  • WebSocket 协议 5~10 节
  • javascript从右向左截取指定位数字符的3种方法
  • 利用openpyxl模块处理excel表格
  • mysql索引使用like的时候出现的问题
  • Abp中使用可视化的日志面板
  • Vue PC端图片预览插件
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 全局变量与局部变量
  • [NodeJS] 关于Buffer
  • 2018一半小结一波
  • Bootstrap JS插件Alert源码分析
  • Centos6.8 使用rpm安装mysql5.7
  • Docker下部署自己的LNMP工作环境
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • extjs4学习之配置
  • mysql中InnoDB引擎中页的概念
  • Nacos系列:Nacos的Java SDK使用
  • October CMS - 快速入门 9 Images And Galleries
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 创建一种深思熟虑的文化
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 马上搞懂 GeoJSON
  • 前端之Sass/Scss实战笔记
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 微信小程序--------语音识别(前端自己也能玩)
  • 正则学习笔记
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #vue3 实现前端下载excel文件模板功能
  • (1)SpringCloud 整合Python
  • (javascript)再说document.body.scrollTop的使用问题
  • (译)计算距离、方位和更多经纬度之间的点
  • .NET Core 项目指定SDK版本
  • .net FrameWork简介,数组,枚举
  • .NET gRPC 和RESTful简单对比
  • .net 后台导出excel ,word
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 使用反射注册事件
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @ModelAttribute注解使用
  • [ Linux ] Linux信号概述 信号的产生
  • [android] 练习PopupWindow实现对话框
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [Flutter]打包IPA
  • [Git 1]基本操作与协同开发
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [Hibernate] - Fetching strategies