nginx调优

6 篇文章 0 订阅
4 篇文章 0 订阅
本文详细介绍了如何优化Nginx的性能,包括隐藏版本号、编译安装、设置CPU亲和力、调整运行进程数和最大打开文件数、修改事件处理模型、配置并发连接数、优化HTTP头部、调整超时时间、FastCGI调优、gzip压缩以及日志切割。通过这些步骤,可以显著提升Nginx服务器的稳定性和效率。
摘要由CSDN通过智能技术生成

隐藏版本号

编辑文件[root@localhost:/usr/local/nginx-1.16.1]# vim src/core/nginx.h,改变以下内容,可自定义。
在这里插入图片描述
防止回显具体版本号:

  1. 修改http头信息中的connection字段,编辑文件:[root@localhost:/usr/local/nginx-1.16.1]# vim src/http/ngx_http_header_filter_module.c
    在这里插入图片描述
  2. 修改 ngx_http_special_response.c 文件定义了 Nginx报 404错误时,不回显版本号。

注: nginx-1.16.1 版本,不再需要修改。nginx1.10以下还需要修改以下内容:

vim src/http/ngx_http_special_response.c

35 static u_char ngx_http_error_tail[] = 
改:36 "<hr><center>nginx</center>" CRLF  
为:36 "<hr><center>XWS</center>" CRLF

编译安装nginx

 ./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx --with-http_ssl_module \
--with-http_realip_module  --with-http_gzip_static_module \
--with-pcre  && make -j 4 && make install 
#启动服务
/usr/local/nginx/sbin/nginx && netstat -lntp|grep 80

测试是否修改成功:

方式1:

curl -I localhost

在这里插入图片描述
方式2:当访问时,出现 404 、403及其它错误时也会返回已经隐藏的版本信息

http://192.168.8.19/asdadas.heml

在这里插入图片描述

设置nginx的cpu亲和力

修改nginx配置文件的运行用户为nginx,然后通过ps aux|grep nginx可以看到以nginx身份运行的worker process 是nginx的工作进程,work进程才是为用户提供服务的 。

修改nginx运行进程个数

  1. nginx运行进程个数一般设置为CPU的核心数或者核心数 2倍。 可以通过top命令按1 查看cpu核心数,然后修改配置文件即可。
  2. 设置 Nginx运行CPU的亲和力

CPU的亲和力就是把nginx每个进程绑定到固定的CPU上,从而减少CPU上下文的切换导致额外的开销。
比如服务器是 4核 4 线程的cpu,修改配置文件配置为如下:

 worker_processes  4;   #在此行下添加
 worker_cpu_affinity 0001 0010 0100 1000; #8核:00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 以此类推

查看CPU亲和力:

pstree -p | grep nginx #拿到进程号
taskset -cp 进程号  #4核cpu配置之前发现0-3说明可以在4个cpu上运行;配置亲和力之后发现1,说明只能在第二个cpu运行,说明cpu绑定已经成功。 

设置nginx最多可以打开文件数:

 worker_cpu_affinity 0001 0010 0100 1000;   #在这一行下面,插入以下内容:
 worker_rlimit_nofile 102400;     #设置woker进程最大打开文件数,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,即:(ulimit -n)/ worker_processes ,但是 nginx分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。

修改nginx事件处理模型

修改nginx事件模型:

events {
    worker_connections  1024;
    use epoll; 使用epoll事件处理模型
}

nginx事件处理模型对比:

select,poll,epoll都是nginx下的IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。epoll 在Linux2.6 内核中正式引入,和 select 和poll 相似,其实都是I/O 多路复用技术。

epoll优势:

1、epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一 般来说这个数目和系统内存关系很大,具体数目可以 cat /proc/sys/fs/file-max查看。
2、 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际 的网络环境中,epoll 的效率就会远远高于select 和poll。
3、epoll在这点上使用了“共享内存”,更省内存,效率更高。

设置单个进程允许客户端最大并发连接数

events {
    worker_connections  102400; 
    use epoll; 
}

worker_connections: 这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受限于,操作系统 ulimit -n 设定的值和nginx 的 worker_connections 的值。一般情况下 系统 ulimit -n、worker_rlimit_nofile 、worker_connections三者的值是一样的。
nginx 服务器实际最大并发值就是:worker_processes*worker_connections 的乘积。
可以用top -u nginx命令RES列查看nginx每个进程使用的内存大小。

ServerName匹配

server模块中的ServerName匹配方式:

  • 精确匹配:www.aa.com
  • 左侧通配符匹配:*.aa.com
  • 右侧通配符匹配:www.*
  • 正则表达式:~ ^.*.aa.com$
  • default_server
  • 服务IP地址

location匹配

location匹配:

= 绝对匹配
^~ URL前半部分匹配,不检查正则
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写
\ 转义
* 匹配任意单个字符
$ 以什么结尾

高效传输模式

在这里插入图片描述
sendfile on; 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile 函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, 以平衡磁盘与网络 I/O处理速度,降低系统的负载。注意: 如果图片显示不正常把这个改成 off。

tcp_nopush on; 必须在 sendfile 开启模式才有效,防止网络阻塞,积极的减少 网络报文段的数量。

连接超时时间

主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,TCP的三次握手四次挥手等,我们一般断掉的是那些建立连接但是不做事,也就是我建立了链接开始,但是后续的握手过程没有进行,那么我们的链接处于等待状态的,全部断掉!
同时希望php建立短连接,资源会占用少一些。
在这里插入图片描述
keepalive_timeout 65; 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
tcp_nodelay on; 也是防止网络阻塞,不过要包涵在keepalived 参数才有效。
client_header_timeout 15; 客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx 将返回request time out的错误。
client_body_timeout 15; 客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错 误提示。
send_timeout 15; 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间, 客户端没有任何活动,nginx 关闭连接。
client_max_body_size 10m; 文件上传大小限制

fastcgi调优

FastCGI 是一种协议,规定了FastCGI应用和支持FastCGI的Web服务器之间的接口。Fastcgi是静态服务和动态服务的一个接口,FastCGI是二进制连续传递的。

fastcgi相关参数的概念:

cache 写入缓存区
buffer 读取缓存区
fastcgi_connect_timeout 300; 指定链接到后端FastCGI 的超时时间。
fastcgi_send_timeout 300; 向FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout 300; 指定接收 FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI 应答的超时时间。
fastcgi_buffer_size 64k; 指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示 将使用1个 64KB的缓冲区读取应答的第一部分(应答头),可以设置为 gastcgi_buffers 选项指定的缓冲区大小。
fastcgi_buffers 4 64k; 指定本地需要用多少和多大的缓冲区来缓冲 FastCGI的应答请求,如果一 个php 脚本所产生的页面大小为256KB,那么会分配 4 个 64KB的缓冲区来缓存,如果页面大小大于 256KB,那么大于 256KB 的部分会缓存到 fastcgi_temp 指定的路径中,但是这并不是好方法,因为内 存中的数据处理速度要快于磁盘。一般这个值应该为站点中 php脚本所产生的页面大小的中间值,如果站 点大部分脚本所产生的页面大小为 256KB,那么可以把这个值设置为“8 16K”、“4 64k”等。
fastcgi_busy_buffers_size 128k; 建议设置为fastcgi_buffer 的两倍,繁忙时候的buffer。
fastcgi_temp_file_write_size 128k; 在写入磁盘时fastcgi_temp_path时将用多大的数据库容 量,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报 502Bad Gateway。
fastcgi_cache gnix; 表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降 低CPU的负载,并且防止 502的错误发生,但是开启缓存也可能会引起其他问题,要很据具体情况选择。
fastcgi_cache_valid 200 302 1h; 用来指定状态码的缓存时间,实例中的值表示将 200 和302 应答缓存一小时,要和fastcgi_cache 配合使用。
fastcgi_cache_valid 301 1d; 将301应答缓存一天。
fastcgi_cache_valid any 1m; 将其他应答缓存为 1分钟。
fastcgi_cache_min_uses 1; 请求的数量。用了一次我不缓存
fastcgi_cache_path 定义缓存的路径。

gzip调优

使用gzip压缩功能,可能为我们节约带宽,加快传输速度,提高用户的体验,也为我们节约成本。要使用压缩模块在编译时指定ngx_http_gzip_module模块,一般要压缩的内容有:文本,js,html,css,对于图片,视频,flash 什么的不压缩,同时也要注意,我们使用gzip的功能是需要消耗 CPU 的!

gzip相关参数的概念:

gzip on; 开启压缩功能。
gzip_min_length 1k; 设置允许压缩的页面最小字节数,页面字节数从 header头的 Content-Length(内容长度)中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于 1K,如 果小与 1K可能会越压越大。
gzip_buffers 4 32k; 压缩缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存, 默认值是申请与原始数据大小相同的内存空间来存储 gzip压缩结果。
gzip_http_version 1.1; 压缩版本(默认1.1,前端为 squid2.5 时使用1.0)用于设置识别HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP解压,使用默认即可。
gzip_comp_level 9; 压缩比例,用来指定 GZIP压缩比,1 压缩比最小,处理速度最快,9压缩比 最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; 用来指定压缩的类型,‘text/html’ 类型总是会被压缩。
gzip_vary on; vary header 支持,该选项可以让前端的缓存服务器缓存经过 GZIP压缩的页面, 例如用 Squid缓存经过nginx 压缩的数据。

expire缓存调优

缓存,主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我 们完全可以设置图片在浏览器本地缓存 365天,css,js,html 可以缓存个10来天,这样用户第一次打开 加载慢一点,第二次,就非常快了!

配置expires缓存:

location ~ ^/(image|javascript|js|css|flash|media|static)/ {
                expires 360d; //缓存365天
        }

expires缓存的优点:

(1)expires可以降低网站购买的带宽,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是 web服务非常重要的功能

expires缓存的缺点: 被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。 解决办法:减少缓存时间、对缓存的对象改名。不推荐缓存的内容:广告图片、网站流量统计工具、频繁更新的文件。

日志切割优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值