Nginx的配置优化

31 阅读4分钟

前言

Nginx通过其高效的事件驱动架构,能极致地优化海量并发连接的处理,直接提升网站的速度与吞吐量。作为反向代理和负载均衡核心,它优化了流量分发,保障了后端服务的高可用性与可扩展性。此外,其强大的静态内容处理与缓存能力显著减少了应用服务器负载,从而降低延迟并大幅节约成本。同时,集中式的SSL/TLS管理也优化了安全性能与运维效率。Nginx作为接入层网关,其吞吐量量至关重要。

二、优化解析

2.1 静态资源配置

请在nginx.conf中添加如下配置

location ~ .*.(gif|jpg|jpeg|png|bmp|ico)$ {
    root /www/; #即图片存在的根路径
    expires 30d;#缓存时间
}

location ~ .*.(js|css)?$ {
    root /www/;  #即图文件存在的根路径
    expires 10h; #缓存时间
}

2.2 进程数的优化

一般nginx中,进程数一般设置为服务器cpu核数的倍数,

例如:CPU为双核,则设置进程数目为4或者8,每个nginx进程消耗的内存约10M

worker_processes 8;

2.3 将进程分配给制定CPU

绑定工作进程的CPU,避免上下文切换导致的性能损耗。

假如是8核 cpu 分配如下:

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

2.4 Nginx最大打开文件数

当使用linux时,最大文件打开数是有限制的。在linux中可使用ulimit –n来查看最大文件打开数,一般设置值为系统最大文件打开数除以最大进程数,但是大多数都是除不尽,导致资源分配不均匀,所以最好与最大进程数一致

worker_rlimit_nofile 655350;

2.5 Nginx的事件模型

使用epoll 的I/O 模型

use epoll;

补充说明:

与apache相类,nginx针对不同的操作系统,有不同的事件模型

A)标准事件模型

Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

B)高效事件模型

Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD2.0 和 MacOSX.

使用双处理器的MacOSX系统使用kqueue可能会造成内核崩溃。

Epoll: 使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+(eventport), IRIX 6.5.15+ 和 Tru64UNIX 5.1A+。

Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题,有必要安装安全补丁。

2.6 最大连接数

每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

worker_connections 65535;

2.7 超时时间

设置超时时间,默认的是60s,Nginx会自动踢出超时的连接,保持可用性。

keepalive_timeout 30;

2.8 客户端请求头部缓冲区大小

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

在Linux中,使用getconf PAGESIZE 来获得,并设置给nginx

client_header_buffer_size4k;

打开文件缓存大小

这个默认是没有开启的,此参数将为打开文件指定缓存大小

open_file_cachemax=65535 inactive=60s;

open_file_cachemax为最大缓存大小,inactive为缓存多久没使用就进行回收

2.9 检查缓存有效信息时间

open_file_cache_valid 80s;
open_file_cache_min_uses 1;

open_file_cache 指令中的inactive参数时间内文件的最少使用次数,

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

2.10 开启gzip

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css
application/xml;
gzip_vary on;

2.11 负责均衡

nginx的5种负载均衡算法请根据自身业务需要选择

三、Nginx的核心配置文件

nginx.conf

user  root;
## 优化1、调整工作进程数 auto或指定
worker_processes  8;
## 配合worker_processes使用,配置参数来充分利用多核cpu的性
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    ## 优化2、epoll 使用事件通知机制,而不是轮询机制,因此可以处理大量的并发连接
    use epoll;  
    ## 优化3、增加连接数
    worker_connections  65535;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    include       /etc/nginx/mime.types;
    #default_type  application/octet-stream;
    default_type text/html;


    access_log  /var/log/nginx/access.log  main;

 ## 优化点4、减少内核、用户态的内存拷贝,加快传输消息 
    sendfile       on;
 ## 优化点5、 对于较小的数据包,累积包,可以减少TCP包的数量。  
    tcp_nopush     on;
 ## 优化点6: 禁用 Nagle 算法可以避免不必要的延迟 
    tcp_nodelay     on;
 ## 优化点7:保持连接  
    keepalive_timeout  60s;
    client_body_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_connect_timeout 300s;
    client_body_buffer_size 1024k;
## 优化点8:启动文件压缩    
    gzip  on;
    gzip_min_length 10k;
    gzip_buffers 4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    gzip_vary on;
    server_names_hash_max_size      1024;
    server_names_hash_bucket_size   512;
    client_max_body_size 1024m;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*/*.conf;
}

stream {
    include /etc/nginx/stream-enabled/*/*.conf;

     upstream back{
        server 192.168.6.142:30466;
     }
     server {
        listen 8443;
        proxy_connect_timeout 5s;
        proxy_timeout 300s;
        proxy_pass back;
    }

}

单个服务的配置案例

upstream gateway.com {
    server  192.168.6.159:8080;
}
server {
    listen       443 ssl;
    server_name  api.gateway.com;
    access_log  /var/log/nginx/gateway.access.log  main;
    ssl_certificate /etc/nginx/cert/123.co.pem;
    ssl_certificate_key /etc/nginx/cert/123.co.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    client_max_body_size 0;

    location / {

        proxy_pass http://gateway.com/;
        proxy_redirect off;
        proxy_cookie_path / /;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }


    location ~* \.(jps|jpeg|png|css|js)$ {
     ## 优化点 启动静态资源的缓存
       expires 1d; 
    }     

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       80;
    server_name api.gateway.com;
    return 301  https://$server_name$request_uri;
}