阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx核心配置深入理解及优化

170次阅读
没有评论

共计 8421 个字符,预计需要花费 22 分钟才能阅读完成。

Nginx 的配置是以模块为单位来组织的,每一个模块包含一个或多个指令,指令是配置文件中的最小配置单元,一切配置项皆为指令。如 http 核心模块中的 include、default_type、sendfile 指令,都属于 http 模块。nginx 所有模块中的指令见官方文档说明:http://nginx.org/en/docs/dirindex.html

注意:以下配置中的“上下文”表示指令可以配置在哪些模块中。main:顶层配置, 约束服务器的行为

1、服务器级别核心配置

指令 上下文 语法 默认值 功能描述
user main user nobody nobyd; nobody 以哪个用户权限运行工作线程
daemon main daemon yes; yes nginx 是否以守护进程运行
worker_processes main worker_processes number; 1 配置工作进程数。传统的 web 服务器(如 apache)都是同步阻塞模型,一请求一进(线)程模式,当进(线)程数增达到一定程度后,更多 CPU 时间浪费在线程和进程切换当中,性能急剧下降,所以负载率不高。Nginx 是基于事件的非阻塞多路复用 (epoll 或 kquene) 模型,一个进程在短时间内就可以响应大量的请求。建议将该值设置 <=cpu 核心数量,一般高于 cpu 核心数量不会带来好处,反而可能会有进程切换开销的负面影响。
worker_connections events worker_connections number; 1024 并发响应能力的关键配置值,表示每个进程允许的最大同时连接数。maxConnection = work_connections * worker_processes;一般一个浏览器会同时开两条连接,如果是反向代理,nginx 到后服务器的连接数量也要占用 2 条连接数,所以,做静态服务器,一般 maxConnection = work_connections * worker_processes / 2; 做反代理服务器时 maxConnection = work_connections * worker_processes / 4;
use events use epoll; 根据不同的平台,选择最高效的连接处理方法 指定处理连接请求的方法。linux 内核 2.6 以上默认使用 epoll 方法,其它平台请参考:http://nginx.org/en/docs/events.html 备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的 linux 内核参数
worker_cpu_affinity main worker_cpu_affinity cpumask …; 将工作进程绑定到特定的 CPU 上,减少 CPU 在进程之间切换的开销。用二进制 bit 位表示进程绑定在哪个 CPU 内核。如 8 内核 4 进程时的设置方法:worker_cpu_affinity 00000001 00000010 00000100 10000000
worker_rlimit_nofile main worker_rlimit_core size; 受 linux 内核文件描述符数量限制 设置 nginx 最大能打开的文件描述符数量。因为 Linux 对每个进程所能打开的文件描述数量是有限制的,默认一般是 1024 个,可通过 ulimit -n FILECNT 或 /etc/securit/limits.conf 配置修改 linux 默认能打开的文件句柄数限制。建议值为:系统最大数量 / 进程数。但进程间工作量并不是平均分配的,所以可以设置在大一些。推荐值为:655350
error_log main, http, mail, stream, server, location error_log 日志文件路径 日志级别; error_log logs/error.log error; 配置错误日志文件的路径和日志级别。日志级别有 debug, info, notice, warn, error, crit, alert 和 emerg 几种。nginx 的日志使用 syslog 输出,所以输出的日志格式是有规律的,系统运维人员可以根据日志规则进行查错或统计分析。更多说明请参考官方文档:http://nginx.org/en/docs/ngx_core_module.html#error_log
pid main pid 守护进程 socket 文件路径; pid logs/nginx.pid 配置 nginx 守护进程 ID 存储文件路径(不是工作进程)

以上是 nginx 的顶层配置,管理服务器级别的行为。更多配置请参考官方文档:http://nginx.org/en/docs/ngx_core_module.html#working_directory

2、HTTP 模块核心配置

nginx 做为一个 HTTP 反向代理服务器,平时接触得最多的应该是针对 http 请求的相关配置了,和 http 模块有关的所有配置都放在 http {...} 配置中。

指令 上下文 语法 功能描述
types http, server, location types {mime 类型 文件后缀;}; 配置能处理的文件类型。如:text/html html htm shtml;
include any include 文件路径; 将外部文件的内容做为配置拷贝到 nginx.conf 文件中。如:include mime.type; 将当前目录下的 mime.type 配置文件拷贝到 nginx 配置文件中。文件路径可以是相对路径或绝对路径。文件名可以用 * 来表示通配符。
default_type http, server, location default_type mime 类型; 文件名到后缀的映射关系。配置默认的 mime 类型,当在 types 指令中找不到请求的文件类型时,就使用 default_type 指定的类型。默认为 text/plain 类型。
access_log http, server, location, if in location, limit_except access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
关闭或开启访问日志。默认配置为:access_log logs/access.log combined; 表示根据 combined 定义的日志格式,写入 logs/access.log 文件中,combined 是 http 模块默认格式。如果定义了 buffer 和 gzip 其中一个参数,日志默认会先写入缓存中,当缓存满了之后,通过 gzip 压缩缓存中的日志并写入文件,启用了 gzip 压缩必须保证 nginx 安装的时候添加了 gzip 模块。缓存大小默认为 64K。可以配置 gzip 的 1~9 的压缩级别,级别越高压缩效率越大,日志文件占用的空间越小,但要求系统性能也越高。默认值是 1。http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log
log_format http log_format 格式名称 日志格式; 定义 http 访问日志的格式,在日志格式中可以访问 http 模块的内嵌变量,如果变存在的话,会做为日志输出。如:remote a ddr  request 等,更多变量请参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
sendfile http, server, location, if in location sendfile on | off; 启用内核复制模式。作为静态服务器可以提高最大的 IO 访问速度。传统的文件读写采用 read 和 write 方式,流程为:硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >> 协议栈,采用 sendfile 文件读写的流程为:硬盘 >> kernel buffer (快速拷贝到 kernelsocket buffer) >> 协议栈,很明显 sendfile 这个系统调用减少了内核到用户模式之间的切换和数据拷贝次数,直接从内核缓存的数据拷贝到协议栈,提高了很大的效率。这篇文章介绍比较详细:http://xiaorui.cc/?p=1673
tcp_nodelay http, server, location off|on;  
tcp_nopush http, server, location off|on; tcp_nodelay 和 tcp_nopush 这两个参数是配合使用的,启动这两项配置,会在数据包达到一定大小后再发送数据。这样会减少网络通信次数,降低阻塞概率,但也会影响响应及时性。比较适合于文件下载这类的大数据通信场景。
keepalive_timeout http, server, location keepalive_time 65; 客户端到服务器建立连接的超时时长,超过指定的时间服务器就会断开连接。默认为 75 秒。降低每个连接的 alive 时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值
gzip http, server, location, if in location gzip on | off; 开启内容压缩,可以有效降低客户端的访问流量和网络带宽
gzip_min_length http, server, location gzip_min_length length; 单位为 k,默认为 20k。内容超过最少长度后才开启压缩,因为太短的内容压缩效果不佳,且压缩过程还会浪费系统资源。这个压缩长度会作为 http 响应头 Content-Length 字段返回给客户端。建议值:1000
gzip_comp_level http, server, location gzip_comp_level 1~9; 压缩级别,默认值为 1。范围为 1~9 级,压缩级别越高压缩率越高,但对系统性能要求越高。建议值:4
gzip_types http, server, location gzip_types mime-type …; 压缩内容类型,默认为 text/html;。只压缩 html 文本,一般我们都会压缩 js、css、json 之类的,可以把这些常见的文本数据都配上。如:text/plain text/css application/json application/x-Javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache http, server, location open_file_cache off; open_file_cache max=N [inactive=time]; 默认值为 off; 设置最大缓存数量,及缓存文件未使用的存活期。建议值:max=655350(和 worker_rlimit_nofile 参数一致)inactive=20s;
open_file_
cache_min_uses
http, server, location open_file_cache_min_uses number; 默认为 1,有效期内文件最少使有的次数。建议值:2
open_file
_cache_valid
http, server, location open_file_cache_valid time; 默认为 60s,验证缓存有效期时间间隔。表示每隔 60s 检查一下缓存的文件当中,有哪些文件在 20s 以内没有使用超过 2 次的,就从缓存中删除。采用 lru 算法。
server server {…} http HTTP 服务器的核心配置,用于配置 HTTP 服务器的虚拟主机,可以配置多个
listen listen ip[: 端口] server 配置虚拟主机监听的 IP 地址和端口,默认监听本机 IP 地址和 80 或 8000 端口。如果只设置了 IP 没设端口,默认使用 80 端口。如果只设置了端口,没设置 IP 默认使用本机 IP。详细配置请参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
server_name server_name domain_name …; server 配置虚拟主机的域名,可以指定多个,用空格分隔。默认为空
charset http, server, location, if in location charset charset | off; 设置请求编码,和 url 参数乱码问题有关。
location server, location location [= | ~ | ~* | ^~] uri {…}
location @name {…}
http 请求中的一个重要配置项,用于配置客户端请求服务器 url 地址的匹配规则。可以配置多个匹配规则

3、核心配置优化


# nginx 不同于 apache 服务器,当进行了大量优化设置后会魔术般的明显性能提升效果
# nginx 在安装完成后,大部分参数就已经是最优化了,我们需要管理的东西并不多

#user  nobody;

# 阻塞和非阻塞网络模型:
# 同步阻塞模型,一请求一进(线)程,当进(线)程增加到一定程度后
# 更多 CPU 时间浪费到切换一,性能急剧下降,所以负载率不高
#Nginx 基于事件的非阻塞多路复用 (epoll 或 kquene) 模型
# 一个进程在短时间内可以响应大量的请求
# 建议值 <= cpu 核心数量,一般高于 cpu 数量不会带好处,也许还有进程切换开销的负面影响
worker_processes 4;

# 将 work process 绑定到特定 cpu 上,避免进程在 cpu 间切换的开销
worker_cpu_affinity 0001 0010 0100 1000 
#8 内核 4 进程时的设置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000

# 每进程最大可打开文件描述符数量(linux 上文件描述符比较广义,网络端口、设备、磁盘文件都是)
# 文件描述符用完了,新的连接会被拒绝,产生 502 类错误
# linux 最大可打开文件数可通过 ulimit -n FILECNT 或 /etc/security/limits.conf 配置
# 理论值 系统最大数量 / 进程数。但进程间工作量并不是平均分配的,所以可以设置的大一些
worker_rlimit_nofile 65535; 

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;


events {# 并发响应能力的关键配置值
    # 每个进程允许的最大同时连接数,work_connectins * worker_processes = maxConnection;
    # 要注意 maxConnections 不等同于可响应的用户数量,
    # 因为一般一个浏览器会同时开两条连接,如果反向代理,nginx 到后端服务器的连接也要占用连接数
    # 所以,做静态服务器时,一般 maxClient = work_connectins * worker_processes / 2
    # 做反向代理服务器时 maxClient = work_connectins * worker_processes / 4

    # 这个值理论上越大越好,但最多可承受多少请求与配件和网络相关, 也可最大可打开文件,最大可用 sockets 数量(约 64K)有关
    worker_connections  65535;

    # 指明使用 epoll 或 kquene (*BSD)
    use epoll;

    # 备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的 linux 内核参数
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local]"$request" '
    #                  '$status $body_bytes_sent"$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    # 关闭此项可减少 IO 开销,但也无法记录访问信息,不利用业务分析,一般运维情况不建议使用
    access_log off
    # 只记录更为严重的错误日志,可减少 IO 压力
    error_log logs/error.log crit;
    #access_log  logs/access.log  main;

    # 启用内核复制模式,应该保持开启达到最快 IO 效率
    sendfile        on;

    # 简单说,启动如下两项配置,会在数据包达到一定大小后再发送数据
    # 这样会减少网络通信次数,降低阻塞概率,但也会影响响应及时性
    # 比较适合于文件下载这类的大数据包通信场景
    #tcp_nopush     on; 在 
    #tcp_nodelay on|off on 禁用 Nagle 算法 

    #keepalive_timeout  0;

    # HTTP1.1 支持持久连接 alive
    # 降低每个连接的 alive 时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值
    keepalive_timeout  30s;

    # 启动内容压缩,有效降低网络流量
    gzip on;    
    # 过短的内容压缩效果不佳,压缩过程还会浪费系统资源
    gzip_min_length 1000;
    # 可选值 1~9, 压缩级别越高压缩率越高,但对系统性能要求越高
    gzip_comp_level 4;
    # 压缩的内容类别
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    # 静态文件缓存
    # 最大缓存数量,文件未使用存活期
    open_file_cache max=65535 inactive=20s;
    # 验证缓存有效期时间间隔
    open_file_cache_valid 30s;
    # 有效期内文件最少使用次数
    open_file_cache_min_uses 2;

    server {listen       80;
        server_name  localhost;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {root   html;}

        ...
    }

    ...

}

下面关于 Nginx 的文章您也可能喜欢,不妨参考下:

CentOS 7.2 下编译安装 PHP7.0.10+MySQL5.7.14+Nginx1.10.1  http://www.linuxidc.com/Linux/2016-09/134804.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

Nginx 的 500,502,504 错误解决方法 http://www.linuxidc.com/Linux/2015-03/115507.htm

CentOS 7 编译安装 Nginx1.10.2 脚本启动失败解决思路 http://www.linuxidc.com/Linux/2017-01/139794.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140427.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计8421字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中