nginx优化2

1,Nginx事件处理模型优化

epoll:

epoll库是nginx服务器支持的最高性能的事件驱动库之一。epoll 是 poll 的升级版,但是与poll的效率有很大的区别。epoll 的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核 ,返回的时候再去轮询检查这个表,以判断事件是否发生,epoll epoll 支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大数,同时epoll库的IO效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作

events {
    use epoll;
    multi_accept on;
    worker_connections  65535;
}

2,  Nginx开启高效传输模式sendfile on

 

 

(1)nginx中的“零拷贝”

Linux kernel2.2版本之后出现了一种叫做“零拷贝(zero-copy)”系统调用机制本质上不经过用户态,直接在内核态完成传输,相当于少了几次内存之间的复制,注意:sendfile系统调用是一种文件传输的系统调用和kernel系统调用关系不大

(2)sendfile的参数详解

 

tcp_nopush:该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率'

语法tcp_nopush on|off;
默认值 tcp_nopush off;
位置 http、server、location

 tcp_nodelay:该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的'实时性'

语法tcp_nodelay on|off;
默认值 tcp_nodelay on;
位置 http、server、location

 

"tcp_nopush"和”tcp_nodelay“要将这两个值都打开,因为在linux2.5.9以后的版本中两者是可以兼容的,三个指令都开启的好处是,sendfile可以开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分“填满”, 这大大减少了网络开销,并加快了文件发送的速度。 然后,当它到达最后一个可能因为没有“填满”而暂停的数据包时,Nginx会忽略tcp_nopush参数, 然后,tcp_nodelay强制套接字发送数据。由此可知,TCP_NOPUSH可以与TCP_NODELAY一起设置,它比单独配置TCP_NODELAY具有更强的性能。可以使用如下配置来优化Nginx静态资源的处理

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

 

3. nginx连接超时优化

(1) 举个例子,某饭店请了服务员招待顾客,但是现在饭店不景气,因此要解雇掉一些服务员,这里的服务员就相当于 Nginx 服务建立的连接

(2) 当服务器建立的连接没有接收处理请求时,可以在指定的时间内让它超时自动退出

2. 连接超时的作用

(1) 将无用的连接设置为尽快超时,可以保护服务器的系统资源(CPU、内存、磁盘)

(2) 当连接很多时,及时断掉那些建立好的但又长时间不做事的连接,以减少其占用的服务器资源

(3) 如果黑客攻击,会不断地和服务器建立连接,因此设置连接超时以防止大量消耗服务器的资源

(4) 如果用户请求了动态服务,则 Nginx 就会建立连接,请求 FastCGI 服务以及后端 MySQL 服务,设置连接超时,使得在用户容忍的时间内返回数据

3. 连接超时存在的问题

(1) 服务器建立新连接是要消耗资源的,因此,连接超时时间不宜设置得太短,否则会造成并发很大,导致服务器瞬间无法响应用户的请求

(2) 有些 PHP 站点会希望设置成短连接,因为 PHP 程序建立连接消耗的资源和时间相对要少些

(3) 有些 Java 站点会希望设置成长连接,因为 Java 程序建立连接消耗的资源和时间要多一些,这时由语言的运行机制决定的

4. 设置连接超时

(1) keepalive_timeout :该参数用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接

(2) client_header_timeout :该参数用于设置读取客户端请求头数据的超时时间,如果超时客户端还没有发送完整的 header 数据,服务器将返回 "Request time out (408)" 错误

(3) client_body_timeout :该参数用于设置读取客户端请求主体数据的超时时间,如果超时客户端还没有发送完整的主体数据,服务器将返回 "Request time out (408)" 错误

(4) send_timeout :用于指定响应客户端的超时时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接

(5) tcp_nodelay :默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高 I/O 性能,但是,在每次只发送很少字节的业务场景中,使用 tcp_nodelay 功能,等待时间会比较长

http {
    keepalive_timeout  65;
    client_header_timeout 15s;
    client_body_timeout 15s;
    send_timeout 60s;

 

 4,FastCGI 相关参数调优

当 LNMP 组合工作时,首先是用户通过浏览器输入域名请求 Nginx Web 服务,如果请求的是静态资源,则由 Nginx 解析返回给用户;如果是动态请求(如 PHP),那么 Nginx 就会把它通过 FastCGI 接口发送给 PHP 引擎服务(即 php-fpm)进行解析,如果这个动态请求要读取数据库数据,那么 PHP 就会继续向后请求 MySQL 数据库,以读取需要的数据,并最终通过 Nginx 服务把获取的数据返回给用户,这就是 LNMP 环境的基本请求流程。 FastCGI 介绍:CGI 通用网关接口,是 HTTP 服务器与其他机器上的程序服务通信交流的一种工具,CGI 接口的性能较差,每次 HTTP 服务器遇到动态程序时都需要重新启动解析器来执行解析,之后结果才会被返回 HTTP 服务器,因此就有了 FastCGI ,FastCGI 是一个在 HTTP 服务器和动态脚本语言间通信的接口,主要是把动态语言和 HTTP 服务器分离开来,使得 HTTP 服务器专一地处理静态请求,提高整体性能,在 Linux 下,FastCGI 接口即为 socket ,这个 socket 可以是文件 socket 也可以是 IP socket

FastCGI各大配置项详解
fastcgi_intercept_errors on; #是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。
fastcgi_connect_timeout 1200; #Nginx服务器和后端FastCGI服务器连接的超时时间
fastcgi_send_timeout 1200; #Nginx服务器允许FastCGI服务器返回数据的超时时间,即在规定的时间内后端服务器必须传完所有的数据,否则Nginx将断开这个连接
fastcgi_read_timeout 1200; #Nginx服务器允许FastCGI服务器读取响应信息的超时时间,表示连接建立成功后,Nginx等待后端服务器的响应时间
fastcgi_buffer_size 512k; #Nginx FastCGI的缓冲区大小,用来读取从FastCGI服务器收到的第一部分响应信息的缓冲区大小
fastcgi_buffers 4 512k; #设定用来读取从FastCGI服务器端收到的响应信息的缓冲区大小和缓冲区数量
fastcgi_busy_buffers_size 512k; #用于设置系统很忙时可以使用的proxy_buffers大小
fastcgi_temp_file_write_size 512k; #FastCGI 临时文件的大小

 

http {
    fastcgi_intercept_errors on;   
    fastcgi_connect_timeout 1200;
    fastcgi_send_timeout 1200;
    fastcgi_read_timeout 1200;
    fastcgi_buffer_size 512k;
    fastcgi_buffers 4 512k;
    fastcgi_busy_buffers_size 512k;
    fastcgi_temp_file_write_size 512k;

 

5,gzip 优化

(1)Gzip压缩作用

将响应报文发送至客户端之前可启用压缩功能,这能够有效地节约贷款,并提高响应至客户端的速度。Gzip压缩可以配置http,server和location模块下

(2)Gzip修改配置

gzip on; #开启gzip压缩功能

gzip_min_length 10k; #设置允许压缩的页面最小字节数;这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小

gzip_buffers 4 16k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存

gzip_http_version 1.1; #压缩版本

gzip_comp_level 2; #设置压缩比率,最小为1,处理速度快,传输速度慢;9位最大压缩比,处理速度慢,传输速度快;这里表示压缩级别,可以是0到9中的任一个,级别越高,压缩就越小,节省了带宽资源,但同时也消耗CPU资源,所以一般折中为6

gzip types text/css text/html application/javascript #制定压缩的类型,线上配置时尽可能配置多的压缩类型

gzip_disable "MSIE [1-6]\." ;#配置禁用gzip条件,支持正则。次数表示ie6及以下版本不启用gzip(因为ie低版本不支持)

gzip vary on; #选择支持vary header;该选项可以让前端的缓存服务器缓存结果gzip压缩的页面;这个可以不写,表示在传输数据时,跟客户端说明我使用了gzip压缩

(3)Gzip注意点

Nginx的gzipgzip压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能

a.图片类型资源(包括视频文件)

b.大文件资源

http {
gzip on; gzip_min_length 10k; gzip_buffers
4 16k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/plain text/css xml/html application/javascript; gzip_disable "MSIE[1-6]\."; gzip_vary on;

 

6,expires缓存优化

(1)expires注意点

nginx的缓存设置可以提高网站性能。对于网站的图片,尤其是新闻站,图片一旦发布,改动的可能性是非常小的,我们希望在用户访问一次后,图片缓存在用户的浏览器端,且时间比较长的缓存可以用到expires设置,nginx中设置过期时间。一般在location里面设置

(2)expires优点

a.expires可以降低带宽,节约成本

b.同时提升用户访问体验

c.减轻服务器的压力,节约服务器的成本,是web服务非常重要的功能

(3)expires缺点

a.被缓存的页面或数据更新了,用户看到的可能还是旧的内容

b.网站流量统计不准确

c.更新频繁的文件

(4)expires设置

格式:

expires 30s;  秒

expires 30m;  分

expires 2h;  时

expires 30d;  天

    server {
        listen       8888;    ## 该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location ~/group[0-9]/~*\.(jpg|gif|jpeg|png|bmp|swf)$ {
            ngx_fastdfs_module;
            expires 30d;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
    }

 最终配置

[root@centos7 nginx]# cat /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  2;
worker_cpu_affinity 0001 0010;
worker_rlimit_nofile 65535;
events {
    use epoll;
    multi_accept on;
    worker_connections  65535;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;
    client_header_timeout 15s;
    client_body_timeout 15s;
    send_timeout 60s;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 10k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css xml/html application/javascript;
    gzip_disable "MSIE[1-6]\.";
    gzip_vary on;
    fastcgi_intercept_errors on;   
    fastcgi_connect_timeout 1200;
    fastcgi_send_timeout 1200;
    fastcgi_read_timeout 1200;
    fastcgi_buffer_size 512k;
    fastcgi_buffers 4 512k;
    fastcgi_busy_buffers_size 512k;
    fastcgi_temp_file_write_size 512k;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       8888;    ## 该端口为storage.conf中的http.server_port相同
        server_name  localhost;
        location ~/group[0-9]/~*\.(jpg|gif|jpeg|png|bmp|swf)$ {
            ngx_fastdfs_module;
            expires 30d;
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
    }
}

 

[root@centos7 ~]# sysctl -p
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_orphans = 16384
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.ip_forward = 1
fs.file-max = 6553560
kernel.pid_max = 65535
net.core.rmem_default = 6291456

 

[root@centos7 nginx]# ps aux |grep nginx | awk '{ print $6/1024 "M" "\t" $0 }'
1.57422M    root       991  0.0  0.0  28280  1612 ?        Ss   09:01   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
28.3047M    nginx     4109  0.0  0.7  55808 28984 ?        S    16:45   0:00 nginx: worker process
28.3047M    nginx     4110  0.0  0.7  55808 28984 ?        S    16:45   0:00 nginx: worker process

 

posted @ 2022-04-14 19:13  gg888666  阅读(73)  评论(0编辑  收藏  举报