~阿弥陀佛~

人生能有多少天是按照自己的想法去活着

nginx性能优化详解(cpu,gzip,expire,fastcgi……等)

content:

性能优化

1. 优化nginx进程个数

2. 绑定不同的nginx进程到不同的cpu上

3. 优化nginx事件处理模型

4. 调整nginx单个进程允许的客户端最大连接数

5. 配置nginx worker进程最大打开文件数

6. 开启高效文件传输模式以及设置连接超时时间

7. 调优fastcgi参数

8. 配置gzip压缩

9. 开启expires功能                   

 

 

1. nginx进程个数优化

worker_processes  1; 一般调整到与CPU的颗数相同

查看CPU信息的命令如下

grep processor /proc/cpuinfo|wc -lCPU个数以及核心数或者grep 'physical id' /proc/cpuinfo|sort|uniq|wc -lCPU颗数  

或者top命令按1键即可显示所有的CPU核数

 

2. 绑定不同的nginx进程到不同的cpu上(taskset -c可以分配服务给CPU)

四核CPU配置

worker_processes    4;

worker_cpu_affinity 0001 0010 0100 1000;

0001-1000是掩码,分别代表1234

双核CPU配置

worker_processes    2;

worker_cpu_affinity 0101 1010;

 

3. nginx事件处理模型优化

nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,

*Linux下,nginx使用epoll的I/O多路复用模型

*freebsd使用kqueue的IO多路复用模型

*solaris使用/dev/pool方式的IO多路复用模型

*windows使用的icop

官方说明在不指定事件处理模型时,nginx默认的会自动选择最佳的事件处理模型服务

根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”

events {

    use epoll;

}

###use是个事件模块指令,用来指定nginx的工作模式,nginx支持的工作模式有 select、poll、

kqueue、epoll、rtsig和/dev/poll;其中select和poll都是标准的工作模式,kqueue和epoll是高效

的工作模式,不通的是epoll用在Linux平台上,而kqueue用在BSD系统中。

 

 

4. 调整nginx单个进程允许的客户端最大连接数

events {

    worker_connections  1024;    #一个worker进程的并发

}

总并发= worker_processes* worker_connections

 

 

 

 

5. 配置nginx worker进程最大打开文件数

worker_rlimit_nofile 65535

改变worker processes能打开的最大文件数

cat /proc/sys/fs/file-max查看文件系统最大可打开的文件数量

 ulimit -n 查看程序限制的打开文件数,ulimit  -n  65535 限制设置为最大65535

 

 

6. 开启高效文件传输模式以及设置连接超时时间

sendfile on;

sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。

http {

  sendfile        on;     #放在http,server,location都可以

}

设置参数tcp_nopush;激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量(只有sendfile on开启才生效)

参考配置

    sendfile   on;

    tcp_nopush on;

    tcp_nodelay on;

    server_tokens off;

    server_names_hash_bucket_size 128;

    server_names_hash_max_size 512;

keepalive_timeout  65;

###设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭连接

client_header_timeout 15s;

###设置客户端请求头读取超时时间,如超过这个时间,客户端没有发送任何数据, nginx将返回“request timeout (408)”

client_body_timeout 15s;

##设置客户端请求主体读取超时时间,如超过这个时间,客户端没有发送任何数据, } nginx将返回“request timeout (408)”,默认值是60

    send_timeout 60s;

 

 

7. 调优fastcgi参数

  fastcgi参数是配合nginx向后请求PHP动态引擎服务的相关参数

fastcgi_connect_timeout 240;

###指定连接到后端fastcgi的超时时间       

fastcgi_send_timeout 240;

###fastcgi1传送请求的超时时间,这个值是指已经完成了两次握手后向fastcgi传送请求的超时时间

fastcgi_read_timeout 240;

###指定接收fastcgi应答的超时时间,这个值是指已经完成了两次握手后接收fastcgi应答的超时时间

fastcgi_buffer_size 64k;

### 指定读取fastcgi应答第一部分需要用多大缓冲区,这个值表示将使用1个64kb的缓冲区读取应答的第一部分

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

#fastcgi_temp_path /data/ngx_fcgi_tmp;

fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;

 

8. 配置gzip压缩

开启压缩后可以提升用户访问体验,并且节省带宽

注意:纯文本内容压缩比很高,因此,纯文本的内容最好要压缩被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源

gzip on;                            #表示开启压缩功能

gzip_min_length  1k;                  #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K。如果小于1K可能会越压越大

gzip_buffers     4 32k;                 #压缩缓存区大小

gzip_http_version 1.1;                #压缩版本

gzip_comp_level 9;                  #压缩比率

gzip_types  text/css text/xml application/javascript;  #指定压缩的类型

gzip_vary on;                   #vary header支持

参考配置

nginx.conf  http模块

  gzip on;

  gzip_min_length  1k;

  gzip_buffers     4 32k;

  gzip_http_version 1.1;

  gzip_comp_level 9;

  gzip_types  text/css text/xml application/javascript;

  gzip_vary on;

 

9. 开启expires功能

   expires可以降低网站的带宽,节约成本加快用户访问网站的速度,提升了用户访问体验服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本几乎对于所有web服务来说,这是非常重要的功能之一,apache服务也有此功能。

配置参考1

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${##类型

expires     3650d;

###缓存的天数

    root    html/bbs#指定目录

 

}

location ~ .*\.(js|css)?${

    expires     30d;

    root    html/bbs

}

 

location ~ ^/(bbs|www/blog)/{

#匹配多个目录

    expires 30d;

}

配置参考2

location ~ ^/(images|javascript|js|css|flash|media|static)/ {

    expires 360d;

}

[root@vultr ~]# curl -I http://www.wlxbeijing.com/*.jpg

HTTP/1.1 404 Not Found

Server: nginx

Date: Wed, 29 May 2019 08:13:19 GMT

Content-Type: text/html; charset=UTF-8

Connection: keep-alive

Vary: Accept-Encoding

X-Powered-By: PHP/5.6.36

Vary: Accept-Encoding, Cookie

Expires: Wed, 11 Jan 1984 05:00:00 GMT

##缓存过期时间

Cache-Control: no-cache, must-revalidate, max-age=0

##缓存总时间,单位为秒

Link: <http://www.wlxbeijing.com/wp-json/>; rel="https://api.w.org/"

expire缺点及解决办法:

  当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?

  第一:对于经常需要的变动图片等文件,可以缩短对象缓存时间,例如,百度、谷歌等网站的首页图片经常会换成一些节日的图,这里可以将缓存期修改为1天

  第二:当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序)

  对于网站的图片、附件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是一个新的图片名了

  网站改版升级会修改JS、CSS元素,若改版的时候对这些元素改了名,会使得前端的CDN以及用户端需要重新缓存内容

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Next Post

Previous Post

© 2022 ~阿弥陀佛~

ICP备案号: 京ICP备19038630号

版权所有@ 王力翔

耗时 0.204 秒 | 查询 39 次 | 内存 22.86 MB