Nginx的特性与核心类别及配置文件和模块详解

简介:

一、简介

Nginx (读作"engine X") 由Igor Sysoev(俄罗斯)于2005年编写,是一个免费、开源、高性能的HTTP服务器和反向代理,也可以作为一个IMAP/POP3代理服务器。根据 Netcraft 的 March 2014 Web Server Survey, 现在全世界23%的网站使用Nginx,而Apache占54.68%。Nginx因为稳定,丰富的功能集,配置简单,资源占用低而闻名世界。

二、Nginx的特性和基础架构

1、基本功能

       实现与服务静态文件(静态资源的web服务器),能缓存打开的文件标书费

       反向代理服务器,支持缓存、负载均衡、健康状态检测

       支持FastCGI

       模块化机制,非DOS机制,支持多种过滤器,如gzip,ssl和用来完成图形大小调整的图像模块

       支持SSL

2.扩展功能

       基于名称和IP做虚拟主机

       支持keepalive

       支持平滑配置更新和程序版本升级

       定制访问日志,支持使用日志缓存以提高性能

       支持URL rewrite

       支持路径别名

       支持基于IP和用户的认证

       支持速率限制,并发数限制等

3.nginx的基本架构

       一个master,生成一个或多个worker

       事件驱动:kqueue,epoll,/dev/poll    

           消息通知:select poll rt rignals

       支持sendfile,sendfile64

       支持mmap

三、nginx的配置文件详解

       配置参数需要以分号结尾,语法格式如下

          参数名  值1 [值2....];

       配置参数中还支持使用变量

           支持使用模块内置变量

           用户自定义变量:set var_name value

       Nginx基本核心配置的类别

           用于调试、定位问题

           正常运行的必备配置

           优化性能的配置

           事件类的配置

1.正常运行的必备配置

           ①、user username [groupname]    

            以那个用户身份运行,可以在配置文件中指定,如果没有指定则以编译时的用户为运行用户

           ②、pid /path/to/pidfile_name

            指定nginx的pid文件

           ③、worker_rlimit_nofile #

            指定一个worker进程所能打开的最大句柄数

           ④、worker_rlimit_sigpending #

             设定每个用户能够发往worker进程的信息的数量  

2.优化性能相关的配置

           ①、worker_procrsses #

              worker进程的个数,通常其数值应该为cpu的物理核心数减1或2

           ②、worker_cpu_affinity cpumask .....

               用来绑定cpu的,比如

worker_processes    4;

                worker_cpu_affinity 0001 0010 0100 1000;

           ③、ssl_engine device

               在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备

           ④、timer_resolution t

               每次内核事件调用返回时,都会使用gettimeday()来更新nginx缓存时钟,timer_resloution用来定义每隔多久才会由gettimeday()更新一次缓存时钟,x86-64系统上,gettimeday()代价已经很小,可以忽略此配置

           ⑤、worker_priority nice

               -20到19之间的整数值,数值越小越优先被调用

3.跟事件相关的配置

           ①、accept_mutex on|off

               是否打开nginx的负载均衡锁,此锁能够让多个worker轮流地、序列化的与新的客户端请求建立连接;而通常当一个worker进程的负载达到其上限的7/8,master就尽可能不将请求掉地至此worker

           ②、lock_file /path/to/lock_file

               锁文件的位置

           ③、accept_mutex_delay #ms

               使用accept锁以后,只有一个worker能取得锁 ,一个worker进程为取得accept锁的等待市场,即用户建立等待的时间,如果某worker进程在某次试图取得锁时失败了,则至少要等#ms才能再一次请求锁

           ④、multi_accept on|off

               是否允许一次性地响应多个用户请求,默认为off   

           ⑤、use [epoll|rtsig|select|poll]

               指定使用的模型,建议让nginx自动选择

           ⑥、worker_commections #

               每个worker能够并发响应的最大请求数,如果为代理服务器的话,worker_rlimit_nofile=worker_commections*2

4.用于调试、定位问题:只在调试nginx时使用

           ①、daemon [on|off]

               关闭提供守护进程的模式,是否让nignx运行于后台;调试时应该为off,使得所有信息直接输出在控制台上,默认为on

           ②、master_process on|off

               是否已master/worker模式运行nginx,默认为on,调试时可以设置为off以方便追踪

           ③、error_log /path/to/error_log level

               错误日志文件及其级别,调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能,通常默认为error级别

5.跟内存及磁盘资源分配相关

           ①、client_body_in_file_only on|clean|off

               是否将请求包体存储在磁盘中,不为off时,即时包体为0,也要存储在硬盘上,如果为on,请求结束后包体文件不会被删除,clean表示删除

          ②、client_body_in_single_buffer on|off

               http的包体是否存储在内存buffer当中,默认为off

          ③、client_body_buffer_size

               nginx接受http包体的内存缓存区大小

          ④、client_body_temp_path dir-path [level1[level2[level3]]]

               定义http包体存放的临时目录,可以使用多级目录,level用来指定某一级目录的文件名的长度

               client_body_temp_path /var/tmp/client 1 2

               表示在/var/tmp/client创建16个一级子目录,在每个一级子目录创建256个二级子目录来存放缓存

          ⑤、client_header_buffer_size size

               正常情况下接受用户请求的http报文header部分时分配的buffer大小,默认为1k

          ⑥、large_client_header_buffers number size

               存储超大http请求首部的内存buffer大小及个数

          ⑦、connection_pool_size size

               nginx对于每个建立成功的tcp连接都会预先分配一个内存池,此处机用于设定此内存池的初始大小,默认为256

          ⑧、request_pool_size size

               nginx对于每个处理每个请求时会预先分配一个内存池,此处机用于设定此内存池的初始大小,默认为4K

四、nginx的http web功能

       必须使用虚拟主机来配置站点,每个虚拟主机使用一个server{}段来定义,非虚拟主机的配置和公共选项,需要定义在server之外,http之内

       1.server{}

           定义一个虚拟主机:nginx支持使用基于主机名或ip的虚拟主机

       2.listen

           liseten address [:port]

           liseten prot

           listen  unix:socket

           default_server:定义此server为http的默认的server,如果所有的server中任意没有任何一个使用此参数,那么第一个server为默认server

           rcvbuf=SIZE:接收缓冲大小

           sndbuf=SIZE:发送缓冲大小

       3.server_name [...]

           server_name可以跟多个主机名,名称可以使用通配符和正则表达式(通常以~开头):当nginx收到一个请求时,会取出去首部的server的值,而后跟众server_name进行比较:比较方式

           (1)先做精确匹配

          (2)左侧通配符匹配

          (3)右侧通配符匹配

          (4)正则表达式匹配

       4.server_name_hash_bucket_size 32|64|128

           为了实现快速主机查找,nginx使用hash表来保存主机名

       5.location [ =|~ |~* |^~] uri {  ... }

         location @name { ... }

           功能:允许根据用户请求的URI来匹配指定的各location以进行访问匹配;匹配到时,将被location块中的配置所处理

           == 精确匹配

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

           ~*:正则表达式模式匹配,匹配时忽略字符大小写

           ^~:只需要前半部分与uri匹配即可,不检查正则表达式

           匹配优先级:

               字符字面量最精确匹配、正则表达式索引(有多个匹配到时,由第一个匹配到的所处理)、安字符字面量

五、文件路径定义

       1.root path      

           设置web资源路径,用于指定请求的根文档目录,从根开始匹配

           root:root/URI

       2.alias path

           指定路径别名,只能用于location中,从最后一个/开始匹配

           alias: alias/

       3. index file ....

           定义默认页面,可以跟多个值,自左向右匹配

       4.error_page code ...[=[response]] URI

           当对于某个请求发回错误时,如果匹配上了error_page指令中设定的code,则从定向至新的URI中

           错误重定向

       5.try_files path1 [path2 ... ] URI

           自左向右尝试读取所有path所指定路径,在第一个找到即停止并返回,如果path均不存在,则返回最后一个URI

location ~* ^/document/(.*)${

           root /www/htdocs

           try_files $uri /docu/$1 /temp.html

           }

           http://www.wangfeng7399.com/documents/a.html

           http://www.wangfeng7399.com/docu/a.html

           http://www.wangfeng7399.com/temp.html

六、网络连接相关的设置

       1.keepalive_timeout time

           保持连接的超时时长,默认为75s

       2.keepalive_requests n

           在一次长连接上允许承载的最大请求数

       3.keepalive_disable [msie6|asfari|none]

           对指定的浏览器禁止使用长连接

       4.tcp_nodelay on|off

           对keepalive连接是否使用tcp_nodelay选项

       5.client_header_timeout time

           读取http请求首部的超时时长

       6.client_body_timeout time

           请求http请求包体的超时时长

       7.save_timeout time

           发送响应的超时时长

七、对客户端请求的限制

       1.limit_except method ... { ... }

          指定范围之外的其他的访问控制,只能用于location中

       2.client_max_body_size SIZE

           http请求包体的最大值,常用于限定客户端所能够请求的最大包体,根据请求首部中的Content-Length来检查,以避免无用的传输

       3.limit_rate speed

           限制客户端每秒传输的字节数,默认为0,表示没有限制

       4.limit_rate_after time

           nginx向客户端发送响应报文时,如果时长超过了此处指定的时长,则后续的发送过程开始限速

八、文件操作的优化

       1.aendfile on|off

           是否启用sendfile功能

       2.aio on|off

           是否启用aio功能

       3.open_file_cache max=N [incative=time]|off

           是否打开文件缓存功能

           max:用于缓存条目的最大值,允许打开的缓存条目最大数,当满两类以后将根据LRU(最小最少连接数)算法进行置换     

           inactive:某缓存条目在指定时长内没有被访问过时,将自动被删除,通常默认为60s

           缓存的信息包括

               文件句柄、文件大小和上次修改的时间

               已经打开的目录结构

               没有找到或没有访问权限的信息

       4.open_file_cache_errors on|off

           是否缓存文件找不到或者没有权限访问等信息

       5.open_file_cache_min_use #

           在inactive指定的时长内被访问超过此处指定的次数时,不会被删除

       6.open_file_cache_valid time

           多长时间检查一次缓存中的额条目是否超出非活动时长,默认为60s

九、对客户端请求的特殊处理

       1.ignore_invalid_headers on|off

           是否忽略不合法的http首部,默认为on,off意味着请求首部中出现不合规的首部将拒绝响应,只能用于server和http中,建议改为off

       2.log_not_found on|off

           用户访问的文件不存在时,是否将其记录到错误日志中

       3.resolver address

           指定nginx使用的dns服务器地址

       4.resolver timeout

           指定DNS解析超时时长,默认为30s

       5.server_tokens on|off

           是否在错误页面中显示nginx的版本号

十、http核心模块的内置变量

       1.$uri:当前请求的uri,不带参数

       2.$request_uri:请求的uri,带完整参数

       3.$host:http请求报文中host首部,如果请求中没有host首部,则以处理此请求的主机的著名代替

       4.$hostname:nginx服务运行所在主机的主机名

       5.$remote_addr:客户端ip

       6.$remote_port:客户端port

       7.$remote_user:使用用户认证时客户端用户输入的用户名

       8.$request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径

       9.$request_method:请求方法

       10.$server_addr:服务器地址

       11.$server_name: 服务器名称

       12.$server_port: 服务器端口

       13.$server_protocol:服务器想客户端发送响应时的协议,如http/1.1 http/1.0

       14.$scheme: 在请求中使用的scheme映射协议本身的协议

       15.$http_HEADER:匹配请求报文中指定的HEADER  例如:$http_host匹配请求报文中的host首部

       16.$sent_http_HEADER:响应报文中指定的HERADER,例如:$http_content_type匹配相应报文中的content-type首部

       17.$document_root:当前请求映射到的root配置


本文转自wangfeng7399 51CTO博客,原文链接:http://blog.51cto.com/wangfeng7399/1402233,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
应用服务中间件 nginx
Nginx安装nginx-rtmp-module模块
【2月更文挑战第4天】 nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展。 nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最终生成一个名为nginx的可执行文件。
89 6
|
4月前
|
负载均衡 网络协议 应用服务中间件
【Nginx】Nginx 功能特性
【1月更文挑战第25天】【Nginx】Nginx 功能特性
|
4月前
|
应用服务中间件 nginx
百度搜索:蓝易云【利用nginx内置ngx_http_mirror_module模块实现流量复制及流量放大】
以上就是使用Nginx内置 `ngx_http_mirror_module`模块实现流量复制和流量放大的简要示例。通过合理配置和利用该模块,可以实现更复杂的流量控制和调试需求。
63 1
|
7天前
|
Ubuntu 应用服务中间件 nginx
ubuntu编译安装nginx及安装nginx_upstream_check_module模块
以上是编译安装Nginx和安装 `nginx_upstream_check_module`模块的基本步骤。根据你的需求和环境,你可能需要进一步配置Nginx以满足特定的要求。
19 3
|
18天前
|
存储 NoSQL 应用服务中间件
Etcd+Confd实现Nginx配置文件自动管理
Etcd+Confd实现Nginx配置文件自动管理
|
23天前
|
Java 应用服务中间件 PHP
Nginx配置文件解释
Nginx配置文件解释
18 1
|
2月前
|
运维 应用服务中间件 Linux
LNMP详解(五)——Nginx主配置文件详解
LNMP详解(五)——Nginx主配置文件详解
18 1
|
2月前
|
应用服务中间件 Linux PHP
Linux下安装php环境并且配置Nginx支持php-fpm模块
Linux下安装php环境并且配置Nginx支持php-fpm模块
34 0
|
2月前
|
负载均衡 应用服务中间件 nginx
|
3月前
|
消息中间件 关系型数据库 MySQL
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
81 0