Nginx性能优化配置(三)

 本文主要介绍Nginx的性能优化配置,文章的层次架构如图所示。

Nginx性能优化配置(三)_第1张图片

1.Nginx的工作进程优化

 1.worker_processes

    作用:worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;auto表示根据CPU的物理核心数自动调整工作进程数。使用lscpu或或者cat /proc/cpuinfo | grep 'processor' | wc -l 可以查看CPU的物理核心数。

    配置:worker_processes auto;

    配置段:main

 2.worker_cpu_affinity cpumask 

    作用:使用这个指令可以绑定到具体那颗CPU。如果你有4颗CPU,可以这么配置

    配置:worker_processes    4;

        worker_cpu_affinity 0001 0010 0100 1000;

    配置段:main

 3.worker_priority number;

    作用:指定worker进程的nice值,设定worker进程优先级;[-20,20] 

    配置: worker_priority 0;

    配置段:main

 4.worker_rlimit_nofile number;

    作用:worker进程所能够打开的文件数量上限;

    配置:worker_rlimit_nofile 20960;

    配置段:main

 5.accept_mutex

    作用:如果你有多个workers,那么还要配置影响worker的相关指令。accept_mutex指令将使进程worker逐个接受新连接。默认为on,如果为off会导致惊群现象,即每秒重复多次连接,产生过多的上下文切换,降低服务器的性能。

    配置:accept_mutex on;

    配置段:events

 6.accept_mutex_delay

    作用:acceppet_mutex开启时才有效,这表示只有一个互斥的worker进程接受连接,其他的在延迟世间内轮流等待新的连接。

    配置: accept_mutex_delay 500ms;

    配置段:events

 7.worker_connections

    作用:指明worker进程的最大连接数。

    配置:worker_connections 10240;

    配置段:events

 8.multi_accept

    作用:worker进程是否同时接受连接所有新请求。默认为off,表示一次只接受一个新的请求。

    配置:multi_accept off;

    配置段:events

2.I/O优化

 1.Sendfile

    作用:数据直接在内核空间完成文件描述符之间的复制而不经由应用层,这使得操作系统资源的利用率提高。

    配置:sendifile on;

    配置段:http,server和location代码块

 2.直接I/O(directio)

    作用:操作系统内核通常尝试优化和缓存任何读/写请求,但是对于一些较大的数据或者说缓存命中率较差的数据,我们却不期望缓存在高速缓存中,我们应该按需加载。直接I/O就提供这么一个功能,它让应用数据直接从磁盘中进行I/O请求。这样一来能够更好地利用CPU周期和提高缓存命中率。

    配置:directio 4m;#任何大于4m的文件将由直接I/O加载。

      directio_alignment 512; #设置数据传输的块大小。

    配置段:http,server和location代码块

 3.异步I/O(aio)

    作用:异步I/O允许进程进行不受阻塞或者不需要等待I/O完成的I/O操作。

    配置:aio off;#按需配置,在linux上需要启动direction

    配置段:http,server和location代码块

3.TCP优化

 http使用tcp传输数据,数据以tcp分组的形式传递。Nginx提供了改变底层TCP栈行为的指令,这些属性能够更改单个套接字连接的属性。

 1.TCP_NODELAY

    作用:TCP/IP传输时存在大量的小包问题。启用这个指令表示在keepalived模式中不缓存,不延迟小文件而把小文件快速发出去。

    配置: tcp_nodelay on;

    配置段:http,server和location代码块

 2.TCP_CORK

    作用:它不把小文件发出去,而是打包发出去。

    配置:tcp_nopush off;

    配置段:http,server和location代码块

4.buffer优化

在接受请求时,nginx提供可可以将请求数据写入请求缓存区的功能。这些缓存区的数据可以作为Nginx的变量使用。缓存区大小与请求的数据大小相比,若小于请求的数据,则将数据写入磁盘文件中。

 1.client_body_buffer_size

    作用:此指令设置请求主体的缓冲区大小。 如果主体超过缓冲区大小,则完整主体或其一部分将写入临时文件。

    配置:client_body_buffer_size 16k;

    配置段:http,server和location代码块

 2.client_max_body_size

    作用:此指令设置NGINX能处理的最大请求主体大小。 如果请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。

    配置: client_max_body_size 2m;

    配置段:http,server和location代码块

 3.client_body_in_file_only

    作用:此指令禁用NGINX缓冲区并将请求体存储在临时文件中。

    配置:client_body_in_file_only off;

    配置段:http,server和location代码块

 4.client_body_in_single_buffer

    作用:该指令设置NGINX将完整的请求主体存储在单个缓冲区中。默认off,启用能够优化读取$request_body变量涉及的I/O操作。

    配置:client_body_in_single_buffer off;

    配置段:http,server和location代码块

 5.client_header_buffer_size

    作用:它为请求头分配一个缓冲区。 如果请求头大小大于指定的缓冲区,则使用large_client_header_buffers指令分配更大的缓冲区。

    配置:client_header_buffer_size 1m;

    配置段:http, server

 6.large_client_header_buffers

    作用:此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。当在默认的缓存区不足时按需分配,如果请求转入长连接则释放缓存区。

    配置: large_client_header_buffers 4 8k;

    配置段:http, server

5.静态内容缓存优化

 使用open_file_cache进一步提高性能, NGINX缓存将最近使用的文件描述符和相关元数据(如修改时间,大小等)存储在缓存中。 缓存不会存储所请求文件的内容。

 1.open_file_cache

    作用:缓存文件描述符的元数据,如大小,修改时间,权限等等。缓存清理使用LRU算法。

    配置:open_file_cache max=1000 inactive=20s;

    配置段:http,server和location代码块

 2.open_file_cache_valid

    作用:检验缓存中元素有效性的频率;默认为60s。

    配置:open_file_cache_valid 30s;

    配置段:http,server和location代码块

 3.open_file_cache_min_uses

    作用:NGINX将在非活动时间段之后从高速缓存中清除元素。在非活动时长访问的次数超过了指定次数,则不淘汰;否则淘汰。

    配置:open_file_cache_min_uses 4;

    配置段:http,server和location代码块

 4.open_file_cache_errors

    作用:NGINX可以缓存在文件访问期间发生的错误。

    配置: open_file_cache_errors off;

    配置段:http,server和location代码块

6.FastCGI缓存优化

 1.启用缓存fastcgi_cache_path

    作用:定义fastcgi的缓存;缓存位置为磁盘上的文件系统,由path所指定路径来定义。levels=levels:指定缓存目录的层级数量,以及每一级的目录数量。keys_zone=name:size,指定k/v映射的内存空间的名称及大小。inactive=time,指定非活动时长。max_size=size,磁盘上用于缓存数据的缓存空间上限。

    配置:fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

      fastcgi_cache_key $request_method://$host$request_uri;

    配置段:http,server和location代码块


 2.fastcgi_cache 

    作用:调用指定的缓存空间来缓存数据

    配置:fastcgi_cache off;

    配置段;http,server和location代码块

 3.fastcgi_cache_key string;

    作用:定义缓存项的key的字符串。

    配置:fastcgi_cache_key localhost:9000$request_uri;

    配置段;http,server和location代码块

 4.fastcgi_cache_methods

    作用:为哪些请求方法使用缓存。

    配置:fastcgi_cache_methods GET HEAD;

    配置段;http,server和location代码块

 5.fastcgi_cache_min_uses 

    作用:缓存空间中的缓存项在非活动时间内至少要被访问到此处所指定的次数方可被认作活动项;

    配置:fastcgi_cache_min_uses 4;

    配置段;http,server和location代码块

 6.fastcgi_cache_valid

    作用:指定缓存的响应码和各自的缓存时长。

    配置:fastcgi_cache_valid 200 302 10m;

    配置段:http,server和location代码块

 7.fastcgi_keep_conn

    作用:指定FastCGI服务是否开启长连接。默认为off。

    配置:fastcgi_keep_conn off;

    配置段:http,server和location代码块

 8.FastCGI缓存示例

 示例:

http {
    ...
    fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2:1 keys_zone=fcgi:20m inactive=120s;
    ...
    server {
    ...
        location ~* \.php$ {
    ...
            fastcgi_cache fcgi;
            fastcgi_cache_key $request_uri;
            fastcgi_cache_valid 200 302 10m;
            fastcgi_cache_valid 301 1h;
            fastcgi_cache_valid any 1m;
    ...
        }
    ...
    }
    ...
}

7.proxy缓存优化

 1.proxy_pass

    作用:指明代理的路径

    配置:proxy_pass http://localhost:8000/uri/;

    配置段:location, if in location, limit_except

 2. proxy_set_header

    作用:设定发往后端主机的请求报文的请求首部的值。

    配置:proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;

    配置段:http,server和location代码块

 3.proxy_cache_path

    作用:设置缓存的路径以及其他的相关属性

    配置:proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

    配置段:http

 4. proxy_cache

    作用:调用的缓存的名称,或禁用缓存;

    配置:proxy_cache off;

    配置段:http,server和location代码块

 5.proxy_cache_key

    作用:缓存条目的键

    配置:proxy_cache_key "$host$request_uri $cookie_user";

    配置段:http,server和location代码块

 6. proxy_cache_valid

    作用:定义各类响应码的缓存时长;

    配置:proxy_cache_valid 200 302 10m;

    配置段;http,server和location代码块

8.memcached缓存优化

 Memcache是一个通用的内存缓存系统,通常用于web加速。nginx提供许多memcached的指令,从而使得可以直接访问memcached提供的内容,避免对上游服务器的影响。

$memcached_key变量,用于执行高速缓存查找。如果要使用Memcached进行查找操作,必须给$memcached_key设置一个值,该值根据URL确定。

 1.memcached_pass

    作用:此指令用于指定memcached服务器的位置。可以使用三种方式指定:(1)域名或IP,以及可选端口(2)unix套接字(3)upstream创建的一组服务器

     配置:set $memached_key $uri;

        memcached_pass localhost:11211;

     配置段:location, if in location

 2.memcached_connect_timeout 

    作用:指定连接超时时长

    配置:memcached_connect_timeout 30s;

     配置段:http,server和location代码块

 3.memcached_ send_timeout

    作用:指定请求写入memcached服务器的超时时长

     配置:.memcached_ send_timeout 30s;

     配置段:http,server和location代码块

 4.memcached_read_timeout

     作用:指定从memcached服务器读取响应的超时超时。

     配置:memcached_read_timeout 30s;

     配置段;http,server和location代码块

 5.memcached_bind

     作用:将服务器的IP与memcached服务器绑定。默认为关闭,但会自动为服务器自动选择一台服务器的IP连接memcached。

 示例:
   server{
       location /python/css/ {
           alias "/code/location/css/";
       }
       location /python/ {
           set $memcached_key "$request_method$request_uri";
           charset utf-8;
           memcached_pass 127.0.0.1:11211;
           error_page 404 502 504 = @pythonfallback;
           default_type text/html;
       }
       location @pythonfallback {
           rewrite ^/python/(.*) /$1 break;
     
           proxy_pass http://127.0.0.1:5000;
           proxy_set_header X-Cache-Key "$request_method$request_uri";
       }
       # Rest NGINX configuration omitted for brevity
}