前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx调优

nginx调优

作者头像
summerking
发布2022-09-19 11:59:24
4410
发布2022-09-19 11:59:24
举报
文章被收录于专栏:summerking的专栏

运行工作进程数、运行CPU亲和力、最大打开文件数、gzip调优、防盗链、隐藏版本号、隐藏软件名、优化woeker进程数、优化nginx连接超时时间

# 1.优化 Nginx worker 进程数

  • Nginx 有 master 和 worker 两种进程,master 进程用于管理 worker 进程,worker 进程用于 Nginx 服务。
  • worker 进程数默认为 1 。

worker_processes 1; ## worker 进程数应该设置为服务器 CPU 的核数。

代码语言:javascript
复制
[root@summer ~]# grep -c processor /proc/cpuinfo         # 查看CPU核数
2
[root@summer ~]# vim /usr/local/nginx/conf/nginx.conf    # 设置worker进程数
worker_processes  2;

# 2.绑定 Nginx 进程到不同的 CPU 上

  • 默认情况下,Nginx 的多个进程有可能跑在某一个 CPU 或 CPU 的某一核上,导致 Nginx 进程使用硬件的资源不均,因此绑定 Nginx 进程到不同的 CPU 上是为了充分利用硬件的多 CPU 多核资源。
  • 如果超过8核,(最多开启8个,8个以上会不稳定)则worker_processes auto;且不配置worker_cpu_affinity参数。
代码语言:javascript
复制
[root@summer ~]# grep -c processor /proc/cpuinfo    # 查看CPU核数
2
worker_processes  2;         # 2核CPU的配置
worker_cpu_affinity 01 10;
 
worker_processes  4;         # 4核CPU的配置
worker_cpu_affinity 0001 0010 0100 1000;   
 
worker_processes  8;         # 8核CPU的配置
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000;
 
[root@summer ~]# /usr/local/nginx/sbin/nginx -t
[root@summer ~]# /usr/local/nginx/sbin/nginx -s reload

# 3.优化 Nginx 单个进程允许的最大连接数

  • 控制 Nginx 单个进程允许的最大连接数的参数为 worker_connections ,与ulimit -n值保持一致。这个参数是与两个指标有重要关联,一是内存,二是操作系统级别的进程最大可打开文件数
  • 进程的最大连接数受 Linux 系统进程打开的最大文件数的限制,只有执行了 "ulimit -HSn 65535" 之后,worker_connections 才能生效。nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
  • 连接数包括代理服务器的连接、客户端的连接等,**Nginx 总并发连接数 = worker_processes * worker_connections。**这里总数保持在 3w 左右。
代码语言:javascript
复制
worker_processes  2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 65535;
events {
    use epoll;
    worker_connections  15000;
}

# 4.开启高效文件传输模式

  • sendfile 参数用于开启文件的高效传输模式,该参数实际上是激活了 sendfile() 功能,提高文件传输性能。
  • sendfile() 是作用于两个文件描述符之间的数据拷贝函数,这个拷贝操作是在内核之中的,被称为 "零拷贝" 。sendfile 比 read 和 write 函数要高效得多,因为 read 和 write 函数要把数据拷贝到应用层再进行操作。
  • tcp_nopush 参数用于激活 Linux 上的 TCP_CORK socket 选项,**此选项仅仅当开启 sendfile 时才生效,**tcp_nopush 参数可以把 http response header 和文件的开始部分放在一个文件里发布,以减少网络报文段的数量。
代码语言:javascript
复制
http {
   include       mime.types;
   default_type  application/octet-stream;
   
   sendfile      on;    # 开启文件的高效传输模式
   tcp_nopush    on;    # 激活 TCP_CORK socket 选择,sendfile为on时这里也应该设为on,数据包会累积一下再一起传输,可以提高一些传输效率。
   tcp_nodelay   on;    # 小的数据包不等待直接传输
       
   keepalive_timeout  65; # keepalive_timeout 指定了与客户端的 keep-alive 链接的超时时间。服务器会在这个时间后关闭链接。降低这个值,以避免让 worker 过长时间的忙碌。注:后台有导出的话,其中参数keepalive_timeout可设置大些,为 1065
}

# 5.优化 Nginx 连接的超时时间

  • 连接超时的作用: 将无用的连接设置为尽快超时,可以保护服务器的系统资源(CPU、内存、磁盘) 当连接很多时,及时断掉那些建立好的但又长时间不做事的连接,以减少其占用的服务器资源 如果黑客攻击,会不断地和服务器建立连接,因此设置连接超时以防止大量消耗服务器的资源 如果用户请求了动态服务,则 Nginx 就会建立连接,请求 FastCGI 服务以及后端 MySQL 服务,设置连接超时,使得在用户容忍的时间内返回数据
  • 连接超时存在的问题: 服务器建立新连接是要消耗资源的,因此,连接超时时间不宜设置得太短,否则会造成并发很大,导致服务器瞬间无法响应用户的请求。 有些 PHP 站点会希望设置成短连接,因为 PHP 程序建立连接消耗的资源和时间相对要少些。 有些 Java 站点会希望设置成长连接,因为 Java 程序建立连接消耗的资源和时间要多一些,这是由语言的运行机制决定的。
  • 设置超时时间: keepalive_timeout:用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接。 client_header_timeout:用于设置读取客户端请求头数据的超时时间,如果超时客户端还没有发送完整的 header 数据,服务器将返回 "Request time out (408)" 错误。 client_body_timeout:用于设置读取客户端请求主体数据的超时时间,如果超时客户端还没有发送完整的主体数据,服务器将返回 "Request time out (408)" 错误。 send_timeout:用于指定响应客户端的超时时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接。 tcp_nodelay:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高 I/O 性能,但是,在每次只发送很少字节的业务场景中,使用 tcp_nodelay 功能,等待时间会比较长。
代码语言:javascript
复制
http {
  include       mime.types;
  server_names_hash_bucket_size  512;   
  
  default_type  application/octet-stream;
  sendfile        on;
  tcp_nodelay     on;
  
  keepalive_timeout  65;
  client_header_timeout 15;
  client_body_timeout 15;
  send_timeout 25;
  
  include vhosts/*.conf;
}

# 6.限制上传文件的大小

client_max_body_size 用于设置最大的允许客户端请求主体的大小。

  • 在请求头中有 "Content-Length" ,如果超过了此配置项,客户端会收到 413 错误,即请求的条目过大。
代码语言:javascript
复制
http {
 
    client_max_body_size 8m;    # 设置客户端最大的请求主体大小为 8 M
}

# 7.gzip 压缩

  • Nginx gzip 压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到客户端之前,Nginx 服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。
  • 需要压缩的对象有 html 、js 、css 、xml 、shtml ,图片和视频尽量不要压缩,因为这些文件大多都是已经压缩过的,如果再压缩可能反而变大。
  • 另外,压缩的对象必须大于 1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。
代码语言:javascript
复制
http {
    gzip  on;                    # 开启压缩功能,可以帮助Nginx减少大量的网络传输工作
    gzip_min_length  1k;         # 允许压缩的对象的最小字节
    gzip_buffers  4 32k;         # 压缩缓冲区大小,表示申请4个单位为32k的内存作为压缩结果的缓存
    gzip_http_version  1.1;      # 压缩版本,用于设置识别HTTP协议版本
    gzip_comp_level  9;          # 压缩级别,1级压缩比最小但处理速度最快,9级压缩比最高但处理速度最慢
    gzip_types  text/plain application/x-javascript text/css application/xml;    # 允许压缩的媒体类型
    gzip_vary  on;               # 该选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如用代理服务器缓存经过Nginx压缩的数据
}

# 8.配置 expires 缓存期限

Nginx expires 的功能就是给用户访问的静态内容设定一个过期时间。

  • 当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会去服务器下载了,直到缓存的内容过期或被清除。
  • 不希望被缓存的内容:广告图片、网站流量统计工具、更新很频繁的文件。
  • 缓存期限参考:新浪缓存 15 天,京东缓存 25 年,淘宝缓存 10 年。
代码语言:javascript
复制
server {
    listen       80;
    server_name  www.abc.com abc.com;
    root    html/www;
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$    # 缓存的对象
    {
        expires 3650d;     # 缓存期限为 10 年
    }
}

# 9.配置防盗链

什么是防盗链?

简单地说,就是其它网站未经许可,通过在其自身网站程序里非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,使得被盗链的那一端消耗带宽资源。

通过 HTTP referer 实现防盗链。

代码语言:javascript
复制
#第一种,匹配后缀
location ~ .*\.(gif|jpg|jpeg|png|bm|swf|flv|rar|zip|gz|bz2)$ {    # 指定需要使用防盗链的媒体资源
    access_log  off;                                              # 不记录日志
    expires  15d;                                                 # 设置缓存时间
    valid_referers  none  blocked  *.test.com  *.abc.com;         # 表示仅允许这些域名访问上面的媒体资源
    if ($invalid_referer) {                                       # 如果域名不是上面指定的地址就返回403
        return 403
    }
}
 
#第二种,绑定目录
location /images {  
    root /web/www/img;
    vaild_referers none blocked *.spdir.com *.spdir.top;
    if ($invalid_referer) {
        return 403;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 1.优化 Nginx worker 进程数
  • # 2.绑定 Nginx 进程到不同的 CPU 上
  • # 3.优化 Nginx 单个进程允许的最大连接数
  • # 4.开启高效文件传输模式
  • # 5.优化 Nginx 连接的超时时间
  • # 6.限制上传文件的大小
  • # 7.gzip 压缩
  • # 8.配置 expires 缓存期限
  • # 9.配置防盗链
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档