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

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

494次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7971387
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025年11月28日-Cloudflare史诗级事故:一次配置失误,引爆全球宕机

2025 年 11 月 28 日 -Cloudflare 史诗级事故: 一次配置失误,引爆全球宕机 前言 继今...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...
如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装 2026 年最强个人助理 ClawdBot、完整安装教程 一、前言 学不完,根本学不完!近期,一款名...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...