---
title: Nginx调优
description: "通过调优Nginx的配置文件，可以有效地提高Nginx服务的性能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcdns/ecosystemEnable/tngg/kunpengcdn_05_0017.html
sourcePath: /source/zh/kunpengcdns/ecosystemEnable/tngg/kunpengcdn_05_0017.html
indexId: 54178714991042866c81f3c5f270c420f36018cc4f8cfcfd393f8978fdab45c567
---
# Nginx调优

#### 目的

通过调优Nginx的配置文件，可以有效地提高Nginx服务的性能。


#### 方法

1. 根据测试的业务核数，修改nginx.conf中的worker_processes和worker_cpu_affinity配置。
  配置说明如表1所示。

  调优原则：以压满业务核为前提，用尽量少的中断核，配合配置网卡中断绑核中的中断脚本使用。

2. 将Nginx的master进程绑定在core上。
  1 taskset -c N /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  N为使用的核的编号，例如0-2，表示使用core0到core2。 绑定策略：跟自己的业务core绑在同一个node或者CPU上。

3. 配置reuseport防止socket瓶颈。
4. 在配置server的时候，增加reuseport配置，调用内核的SO_REUSEPORT特性，建立足够数量的socket，避免由于socket不够导致资源争抢，如下述标粗信息所示。
  1 2 3 4 server { listen 10000 reuseport; server_name localhost; }


#### Nginx.conf配置文件示例

本节以负载均衡场景下，HTTP短连接场景的4core用例的nginx.conf为例：

```
user  root;
worker_processes 2;
worker_cpu_affinity
1
10;
error_log /dev/null;
worker_rlimit_nofile 102400;
events {
worker_connections  102400;
multi_accept on;
use epoll;
accept_mutex off;
}
http {
include       mime.types;
default_type  application/octet-stream;
access_log /dev/null;
sendfile        on;
tcp_nopush     on;
tcp_nodelay     on;
sendfile_max_chunk 512k;
keepalive_timeout  65;
keepalive_requests 2000;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
server_names_hash_bucket_size 128;
client_max_body_size 100m;
open_file_cache max=102400 inactive=40s;
open_file_cache_valid 50s;
open_file_cache_min_uses 1;
open_file_cache_errors on;
upstream test{
server 192.168.1.75:10000  ;
server 192.168.2.75:11000  ;
server 192.168.1.72:10000 ;
server 192.168.2.72:11000 ;
keepalive 300;
}
server {
listen       10000 reuseport;
server_name  localhost;
access_log off;
location / {
root   html;
index  index.html index.htm;
proxy_pass http://test;
proxy_connect_timeout 75;
proxy_read_timeout 300;
proxy_send_timeout 300;
proxy_buffer_size 4k;
proxy_buffers   4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
}
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
}
# HTTPS server
server {
listen       20000 ssl ;
server_name  localhost;
ssl_certificate      /usr/local/nginx/server_2048.crt;
ssl_certificate_key  /usr/local/nginx/server_2048.key;
ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  5m;
ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers  "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
ssl_prefer_server_ciphers  on;
location / {
root   html;
index  index.html index.htm;
}
}
}
```

Nginx的配置是区块型的，包括全局配合（如user、worker_processes等）和模块配置（其中events为events模块，http为http模块），每个模块配置中又分为各个区块，如http模块中有server区块，server有location区块。

Nginx基本配置与参数说明如表1所示。


**表1 Nginx基本配置与参数说明**

| 配置模块 | 参数 | 说明 |
| --- | --- | --- |
| 配置全局 | user root; | 定义Nginx运行的用户和用户组。 |
| 配置全局 | worker\_processes 3; | Nginx进程数，建议设置为等于CPU总核心数。 |
| 配置全局 | worker\_cpu\_affinity 1 10 100; | 通过worker\_cpu\_affinity给每个worker进程绑定一个CPU， 1表示启用core0，10表示启用core1，100表示启动core2，依次类推，100000表示启用core5，1后面有n个0就表示启动core n。 |
| 配置全局 | error\_log /dev/null; | 错误日志文件路径，/dev/null表示关闭Nginx日志。 |
| 配置全局 | worker\_rlimit\_nofile 102400; | 指定一个Nginx进程打开的最多文件描述符数目，受系统进程的最大打开文件数量（ulimit\-n）限制。 |
| 配置events模块 | worker\_connections 102400; | 定义每个进程的最大连接数，受系统进程的最大打开文件数量限制，并发总数是worker\_processes 和 worker\_connections 的乘积。 |
| 配置events模块 | multi\_accept on; | 设置一个进程是否同时接受多个网络连接，如果multi\_accept被禁止了，Nginx一个工作进程只能同时接受一个新的连接。 |
| 配置events模块 | use epoll; | 设置工作模式为epoll，除此之外还有select,poll,kqueue,rtsig和/dev/poll模式。 |
| 配置events模块 | accept\_mutex on; | 打开accept\_mutex，避免了worker争夺资源造成的上下文切换以及try\_lock的锁开销。 |
| 配置HTTP模块 | include mime.types; | 文件扩展名与文件类型映射表。 |
| 配置HTTP模块 | default\_type application/octet\-stream; | 默认文件类型。 |
| 配置HTTP模块 | access\_log /dev/null; | Nginx访问日志路径，/dev/null表示关闭访问日志。 |
| 配置HTTP模块 | sendfile on; | 开启高效文件传输模式，获取文件跨过用户态；gzip压缩器需要在用户态进行，因此无法和sendfile共存。 |
| 配置HTTP模块 | tcp\_nopush on; | 开启防止网络阻塞，返回数据的首个数据包会携带从sendfile中获取大块的数据后才会被发送。 |
| 配置HTTP模块 | tcp\_nodelay on; | 开启防止网络阻塞。 |
| 配置HTTP模块 | sendfile\_max\_chunk 512k; | 限制最大sendfile的文件大小，防止过大的文件占据整个工作进程默认为“无限制”。 |
| 配置HTTP模块 | keepalive\_timeout 65; | 设置客户端连接保存活动的超时时间。 |
| 配置HTTP模块 | keepalive\_requests 2000; | 设置一个keep\-alive连接上可以服务的请求的最大数量。当最大请求数量达到时，连接被关闭。 |
| 配置HTTP模块 | client\_header\_buffer\_size 4k; | 客户端请求头部的缓冲区大小，这个可以根据你的系统分页大小来设置，一般一个请求的头部大小不会超过1k，不过由于一般系统分页都要大于1k，所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。 |
| 配置HTTP模块 | large\_client\_header\_buffers 4 32k; | 设置客户端请求的Header头缓冲区大小：4为个数，32k为大小，表示申请4个32k。默认会用client\_header\_buffer\_size这个buffer来读取header值，如果header过大，它会使用large\_client\_header\_buffers来读取。 |
| 配置HTTP模块 | server\_names\_hash\_bucket\_size 128; | 保存服务器名字的hash表的大小。 |
| 配置HTTP模块 | client\_max\_body\_size 100m; | 控制全局nginx所有请求报文大小，100M。 |
| 配置HTTP模块 | open\_file\_cache max=102400 inactive=40s; | max设置缓存中的最大元素数，在缓存溢出时，删除最近最少使用（LRU）的元素；inactive定义一个时间，如果在此期间未访问该元素，则从该缓存中删除该元素。 |
| 配置HTTP模块 | open\_file\_cache\_valid 50s; | 多长时间检查一次缓存的有效信息。也就是说即使我一直访问这个文件，50s后会检查此文件的更改信息是否变化，发现变化就更新。 |
| 配置HTTP模块 | open\_file\_cache\_min\_uses 1; | open\_file\_cache指令中的inactive参数时间内文件的最少使用次数，如果超过这个数字，文件更改信息一直是在缓存中打开的。 |
| 配置HTTP模块 | open\_file\_cache\_errors on; | 启用文件查找错误的缓寸。 |
| 配置反向代理服务器组test（Nginx会根据配置，将请求分发给组里的某一台服务器。） | server 192.168.1.75:10000 ; server 192.168.2.75:11000; server 192.168.1.73:10000; server 192.168.2.73:11000; | 配置处理最终请求的服务器IP及端口。 |
| 配置反向代理服务器组test（Nginx会根据配置，将请求分发给组里的某一台服务器。） | keepalive 300; | 设置连接超时时间。 |
| 设定主机配置 | listen 10000 reuseport; | 侦听10000端口，http短连接场景建议打开reuseport，长连接可复用。 |
| 设定主机配置 | server\_name localhost; | 定义使用localhost访问。 |
| 设定主机配置 | access\_log off; | 关闭本虚拟主机的访问日志。 |
| 默认请求 | root html; | 定义服务器的默认网站根目录位置，root是web根目录。 |
| 默认请求 | index index.html index.htm; | 定义首页索引文件的名称及顺序。 |
| 默认请求 | proxy\_pass http://test; | 表示将所有请求转发到服务器组test配置的服务器中。 |
| 默认请求 | proxy\_connect\_timeout 75; | 设置后端服务器的连接超时时间。 |
| 默认请求 | proxy\_read\_timeout 300; | 设置Nginx与后端服务器建立连接后，等待后端服务器的响应时间。 |
| 默认请求 | proxy\_send\_timeout 300; | 指定请求转移到后端服务器的超时时间，超时Nginx将关闭连接。 |
| 默认请求 | proxy\_buffer\_size 4k; | 设置用于保存用用户的头部信息的代理缓冲区大小。 |
| 默认请求 | proxy\_buffers 432k; | 设置缓冲区的数目和大小。 |
| 默认请求 | proxy\_busy\_buffers\_size 64k; | 用于当系统负载较大，缓冲区不够用时，可以设置更大的proxy\_buffers。 |
| 默认请求 | proxy\_temp\_file\_write\_size 64k; | 用于指定缓存临时文件的大小。 |
| 默认请求 | proxy\_http\_version 1.1; | 设置Nginx服务器提供代理服务的http协议版本1.1。 |
| 默认请求 | proxy\_set\_header Connection ""; | 允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。 |
| 默认请求 | proxy\_headers\_hash\_max\_size 51200; | 存放http报文头的哈希表容量上限。 |
| 默认请求 | proxy\_headers\_hash\_bucket\_size 6400; | nginx服务器申请存放http报文头的哈希表容量大小。 |
| 默认请求 | error\_page 500 502 503 504 /50x.html; location = /50x.html { root html; } | 定义错误提示页面。 |
| 配置SSL加密 | listen 20000 ssl; | 侦听20000端口。 |
| 配置SSL加密 | server\_name localhost; | 定义使用localhost访问。 |
| 配置SSL加密 | ssl\_certificate /usr/local/nginx/server\_2048.crt; | ssl\_certificate证书是公钥，它会被发送到连接服务器的每个客户端。 |
| 配置SSL加密 | ssl\_certificate\_key /usr/local/nginx/server\_2048.key; | ssl\_certificate\_key 私钥 是用来解密的，所以它的权限要得到保护但nginx的主进程能够读取。当然私钥和证书可以放在一个证书文件中，这种方式也只有公钥证书才发送到client。 |
| 配置SSL加密 | ssl\_session\_cache shared:SSL:1m; | 设置ssl会话缓存的类型和大小，shared:SSL:1m表示我所有的nginx工作进程共享ssl会话缓存，1M可以存放约4000个sessions。 |
| 配置SSL加密 | ssl\_session\_timeout 5m; | 客户端可以重用会话缓存中ssl参数的过期时间，5分钟。 |
| 配置SSL加密 | ssl\_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; | 用于启动特定的加密协议。 |
| 配置SSL加密 | ssl\_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; | 选择加密套件。 |
| 配置SSL加密 | ssl\_prefer\_server\_ciphers on; | 设置协商加密算法时，优先使用我们服务端的加密套件，而不是客户端浏览器的加密套件。 |
| 配置SSL加密 | location / { root html; index index.html index.htm; } | \#默认请求。 \#定义服务器的默认网站根目录位置，root是web根目录。 \#定义首页索引文件的名称及顺序。 |
