0°

Nginx配置文件优化详解

Nginx.conf主配置文件结构

main block:主配置段,也即全局配置段;
event {
        ...
       }:事件驱动相关的配置;
http {
    ...
}:http/https 协议相关的配置段;
mail {
    ...
}
stream {
    ...
}

main block:主配置文件段,又称全局配置段,在该段的配置会应用到整个Nginx服务器内
http:http字段内的配置会应用到所有主机上
mail:邮件功能段
stream:四层代理功能段


全局配置段

main block:主配置段,也即全局配置段;
event {
        ...
      }:事件驱动相关的配置;

1.运行用户组配置

user  nginx nginx;
定义Nginx的worker进程运行的用户和用户组,Nginx的Master进程以root启动

2.nginx进程数设置

worker_processes  number | auto;
worker进程的数量;应该等于或小于当前主机的cpu的物理核心数。auto选项为自动填充nginx进程数量,auto会根据CPU核心数量来定义进程数量

worker_cpu_affinity auto | cpumask;
nginx进程绑定CPU核心参数:

auto用法:
worker_cpu_affinity auto;
auto代表根据Nginx进程数worker_processes自动绑定CPU个数,假如Nginx设置的进程数为8个,就会自动绑定8颗CPU核心,如果设置的进程数多于核心数,auto也只是会绑定系统CPU的个数。

cpumask用法:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
cpumask是根据cpu核心的掩码来绑定的每颗CPU,假设我们有8颗CPU核心那就是8个零,CPU的开始个数是从0-7来计算。
第0颗CPU掩码是:00000001
第1颗CPU掩码是:00000010
第2颗CPU掩码是:00000100
以此类推...
假如我们这台设备上还有其它应用或者进程需要用到CPU,我们可以为Nginx绑定4颗CPU核心
绑定4颗CPU核心可以这样写来绑定前四颗CPU:
worker_cpu_affinity 00000001 00000010 00000100 00001000
当然也可以绑定后四颗CPU或者绑定8颗CPU中的任意四个,比较灵活

worker_priority number;
指定worker进程的nice值,设定worker进程的优先级,值为 [-20,19]
Linux系统中,优先级高的进程会占用更多的系统资源,这里配置的是进程的静态优先级,默认每个应用CPU的优先级都为0,取值范围-20到+19,-20级别最高。因此可以把这个值设置小一点,但不建议比内核进程的值低(通常为-5)
ps axo comm,pid,psr,ni | grep nginx
nginx            8787   1   0
nginx            9323   0   0
nginx            9324   1   0
可以看到nginx的1个主进程和两个子进程的优先级都为0,我下面将nginx使用cpu的优先级调整为-5,重启nginx应用后再次查看CPU优先级
worker_priority -5;
ps axo comm,pid,psr,ni | grep nginx
nginx            8787   1   0
nginx           12709   0  -5
nginx           12710   1  -5
可以看到已经变为了-5

3.日志和PID位置

error_log logs/error.log warn;
pid run/nginx.pid;
error_log:nginx日志路径及错误日志的日志级别,日志级别有 debug | info | notice | warn | error | crit | alert | emerg
pid:定义pid文件存放路径

4.Nginx进程最大打开文件数

worker_rlimit_nofile 65535;
指定Nginx的worker进程所能够打开的最大文件数,此值建议设置为nginx运行用户使用ulimit -n的系统文件打开数一致,这是因为Nginx调度时分配请求到进程并不是那么均衡,此值要大于等于进程数 worker_processes * worker_connections 的乘积,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误,

5.事件驱动events相关配置

events {
    use epoll;
    worker_connections  8192;
    multi_accept on;
    accept_mutex on;
}

use epoll;
参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
epoll模型是Linux内核2.6以上版本中的高性能网络I/O模型,Linux建议epoll,如果Nginx跑在FreeBSD上面,那就建议选用kqueue模型。更多网络I/O模型知识,请移步 IO模型详解:

worker_connections  8192;
单个Nginx进程最大连接数,Nginx的最大连接数=worker_connections * worker_processes
Nginx单个进程最大连接数根据硬件资源调整,需要业务量较大,那就尽量大,但要注意别把CPU跑到太高,也要注意后端应用的压力,否分会返回504、502等

multi_accept on;
开启nginx批量建立新连接设置

accept_mutex on | off;
Nginx处理新的连接请求的方法,on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但
只有一个进程可获得连接,造成“惊群”,影响性能,默认on

HTTP配置段

http {
    ...
}:http/https 协议相关的配置段;

1.资源类型表

include       mime.types;
资源类型对应表,对应表在 nginx/conf/mime.types,这个文件中保存了很多页面类型

default_type application/octet-stream;
默认资源类型,如果访问nginx的资源类型在 mime.types 类型表中不存在,nginx则认为请求是这里设定的默认类型。

下图中我们访问资源可以看到nginx返回的资源类型格式为 mime.types中定义的 test/html 格式

这里可以看到返回资源类型格式为 image/gif 格式

如果访问的格式在 mime.types 中不存在则会返回 application/octet-stream; 格式

2.字符编码

charset utf-8;
指定nginx字符编码

3.Nginx版本隐藏

server_tokens on | off;
nginx默认不隐藏版本信息,这对外来说比较危险
on 开启nginx版本信息
off 关闭nginx版本信息

4.网络连接配置

sendfile on | off;
开启高效文件传输模式,sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime

autoindex on | off;
开启目录列表访问,适合下载服务器,默认关闭

tcp_nopush on | off;
当 sendfile 为 on的情况下,开启此参数才会生效,当sendfile为 off 时,将延迟发送较小的数据报文,合并多个较小请求数据报文后再发送,默认为 on 不延迟发送。

tcp_nodelay on;
不延迟发送较小的数据报文,在keepalived模式才能使用此参数。

keepalive_timeout  65s;
nginx长连接保持时间,设置为0表示nginx服务器处理完请求后立刻断开与客户端的连接,默认为65s;

keepalive_requests 100;
保持长连接的会话数量,默认为100个;

keepalive_disable none | browser ...;
禁用与行为不端的浏览器保持连接,意思为你想禁用某种浏览器使用长链接的时候可以在此写入浏览器的名称,默认为 keepalive_disable msie6

send_timeout 65s; 
设置将响应传输到客户端的超时时间,超时仅在两个连续的写操作之间设置,而不用于传输整个响应。如果客户端在此时间内未收到任何信息,则连接将关闭

types_hash_max_size 2048;
types_hash_max_size影响散列表的冲突率。types_hash_max_size越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升,单位是项或者条目  

reset_timedout_connection on;
开启超时连接复用功能, 服务器在客户端停止发送应答之后关闭连接;允许server在client停止响应以后关闭连接,释放分配给该连接的内存。当有大并发需求时,建议打开。

5.Nginx缓存配置

client_body_buffer_size 128k;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;请求报文body超出此大小时,其将暂存到磁盘上由client_body_temp_path指令所指定的位置,nginx开启了上传功能,并且在往nginx服务器上传文件时在请求报文中才有body。一般为博客等2.0站点,我们在上传文章时,需要开启此功能。

client_body_temp_path temp [level1 [level2 [level3]]]
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
例如:
client_body_temp_path /usr/local/nginx/client_body_temp/ 2 1 1 
1:表示用一位16进制数字表示一级子目录;0-f  2表示256个一级子目录(共有256个一级子目录)
2:表示用2位16进程数字表示二级子目录:00-ff 每个一级子目录下有16个二级子目录(共有256*16个二级子目录)
2:表示用2位16进程数字表示三级子目录:00-ff 每个二级子目录下有16个三级子目录(共有256*16*16个三级子目录)

client_body_timeout 30s;
定义读取客户端请求body的超时时间,超时仅针对两个连续的读操作之间的一段时间设置,而不针对整个请求体的传输。如果客户端在这段时间内没有传输任何内容,则请求将使用408(请求超时)错误终止。

client_max_body_size 10m;
指定允许通过Nginx上传文件的大小

client_header_buffer_size 4096k;
客户端请求头部的缓冲区大小,可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。 

large_client_header_buffers 4 128k;
客户请求头部缓冲区大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。

client_header_timeout 30s;
客户端头部超时时间,如果客户端在这段时间内没有传输整个报头,Nginx则主动关闭连接后返回408错误。

server_names_hash_bucket_size 128;
服务器名字的hash表大小;保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小

6.对客户端限制相关配置

limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,0表示无限制;
                        
limit_except method ... { ... }
除来使用limit_except指定的方法之外的方法进行限制
例如:
只允许192.168.168.1.0/24网段访问请求,但是GET方法排除在外(不接受限制),安全限制访问逻辑,一般只对外开放 GET POST 方法,像 DELETE请求方法是禁止的
limit_except GET {
        allow 192.168.1.0/24;
        deny  all;
}

7.文件操作优化配置

aio on | off | threads[=pool];
是否启用文件系统的aio功能;
    
directio size | off;
在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;

open_file_cache max=65535 inactive=60s;
此参数来为Nginx的打开文件数做缓存,默认未启用,max值指定缓存数量,因为我们在全局配置中指定了Nginx的最大打开数为65535,所以在此的max值也最好一至,"inactive=60s"是指60秒后缓存过的文件没有被访问则被删除
nginx可以缓存以下三种信息:
            (1) 文件的描述符、文件大小和最近一次的修改时间;
            (2) 打开的目录结构;
            (3) 没有找到的或者没有权限访问的文件的相关信息;

open_file_cache_valid 30s;
缓存项有效性的检查频率;默认为60s,主要检查缓存有效信息

open_file_cache_min_uses 1;
open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除

open_file_cache_errors on;
是否打开文件错误信息

8.压缩功能配置

gzip on;
启用gzip压缩输出

gzip_min_length 1k;
最小压缩文件大小为1k

gzip_buffers 16 64K;
支持实现压缩功能时为其配置的缓冲区数量及每个缓存区的大小

gzip_http_version 1.1;
gzip压缩版本,默认1.1,前端如果是squid2.5请使用1.0

gzip_comp_level 6;
设置响应的gzip压缩级别,可接受的值在1到9之间

gzip_types text/plain application/x-javascript text/css application/xml application/javascript;
压缩过滤器,仅对此处设定的文件格式类型启用压缩功能

gzip_vary on;
开启对vary header支持

gzip_proxied any;
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …
nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;off:对代理的请求不启用
no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能

underscores_in_headers on;
在客户端请求头字段中启用下划线;off代表关闭下滑线;禁用下划线时,名称包含下划线的请求头字段将被标记为无效,并受ignore_invalid_headers指令的约束

9.location配置
关于location正则匹配请看站内其文章,这里讲解location中的参数配置

location / {
    root    /data/nginx/html;
    index index.html index.htm index.php;
}

root html;
指定nginx的网页目录,如果匹配到了此location,那么将会到定义root的目录中寻找资源。

index index.html index.htm index.php
指定nginx的网页默认资源,如果匹配到了此location,那么访问请求首先会找 index.html 文件,如果index.html文件找不到,那么会依次寻找 index.htm index.php,如果root指定的地址中,index的资源都不存在,那么将返回404






「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Nginx
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论