Nginx一些小优化

本文详细介绍了Nginx的配置优化,包括进程数优化、绑定不同CPU、设置最大打开文件数、事件处理模型优化、调整最大连接数、解决惊群问题、域名散列表大小调整、高效文件传输模式、连接超时设置、上传文件限制、FastCGI参数调优、gzip压缩配置、静态页面缓存和expires缓存策略,以及日志记录缓存和隐藏Nginx版本号的方法,旨在提升Nginx服务性能和稳定性。
摘要由CSDN通过智能技术生成

Nginx配置优化

1 进程数优化
lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2147 root 6u IPv4 16807 0t0 TCP *:http (LISTEN)
nginx 2165 nginx 6u IPv4 16807 0t0 TCP *:http (LISTEN)

这里我们可以看到nginx启动了两个进程,master进程用户是root,Worker进程用户是nginx,master是主进程,Worker是工作进程。可以理解为master是管理员,work是给用户提供服务的.

Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

主进程主要完成如下工作:

  1. 读取并验正配置信息;
  2. 创建、绑定及关闭套接字;
  3. 启动、终止及维护worker进程的个数;
  4. 无须中止服务而重新配置工作特性;
  5. 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
  6. 重新打开日志文件,实现日志滚动;
  7. 编译嵌入式perl脚本;

worker进程主要完成的任务包括:

  1. 接收、传入并处理来自客户端的连接;
  2. 提供反向代理及过滤功能;
  3. nginx任何能完成的其它任务;

cache loader进程主要完成的任务包括:

  1. 检查缓存存储中的缓存对象;
  2. 使用缓存元数据建立内存数据库;

cache manager进程的主要任务:

  1. 缓存的失效及过期检验;

Nginx的配置有着几个不同的上下文:main、http、server、upstream和location(还有实现邮件服务反向代理的mail)。配置语法的格式和定义方式遵循所谓的C风格,因此支持嵌套,还有着逻辑清晰并易于创建、阅读和维护等优势。

查看服务器cup个数
grep pro /proc/cpuinfo |wc -l
2

vim /application/nginx/conf/nginx.conf
worker_processes 4;

修改nginx工作进程,官方推荐nginx工作进程一般为cpu个数或2倍

2 优化绑定不同的Nginx进程到不同的cpu上
worker_cpu_affinity 0001 0010 0100 1000;
#0001表示启用第一个CPU内核,0010表示启用第二个CPU内核,依此类推
#规则设定
#(1)cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭

推荐使用方法
worker_processes auto;
worker_cpu_affinity auto;

3 配置Nginx worker 进程最大打开文件数
worker_rlimit_nofile 65535;
1-3项参数写在nginx全局模块中

4Nginx事件处理模型优化
在events模块中添加
events {
use epoll
}
epoll 属于异步I/O,信号(事件)驱动/IO

5 调整Nginx单个进程允许的客户端最大连接数
在events模块中添加
events {
worker_connections 40480;
}
所以nginx的最大连接数为 worker_connections * worker_processes

6 惊群设置
events {
accept_mutex off;
}
如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」。nginx默认激活.
在对启动了20个worker的nginx进行压力测试的时候发现:如果把配置文件中event配置块中的accept_mutex开关打开(1.11.3版本之前默认开),就会出现worker压力不均,少量的worker的cpu利用率达到了98%,大部分的worker的压力只有1%左右;如果把accept_mutex关掉,所有的worker的压力差别就不大,而且QPS会有大幅提升;
所以建议访问量大的网站关闭.惊群问题在nginx上不是很严重.

7 优化域名散列表大小
http {

server_names_hash_max_size 512;
server_names_hash_bucket_size 128;

}
server_names_hash_max_size 服务器名称哈希表的最大值
server_names_hash_bucket_size 服务器名称哈希表每个页框的大小,这个指令的默认值依赖于cpu缓存

如果定义了大量名字,或者定义了非常长的名字,那可能需要在http配置块中使用server_names_hash_max_size和server_names_hash_bucket_size指令进行调整。server_names_hash_bucket_size的默认值可能是32,或者是64,或者是其他值,取决于CPU的缓存行的长度。如果这个值是32,那么定义“too.long.server.name.example.org”作为虚拟主机名就会失败,而nginx显示下面错误信息:
could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32
出现了这种情况,那就需要将指令的值扩大一倍:

http {
server_names_hash_bucket_size 64; #该数值是32的倍数为宜。

如果定义了大量名字,得到了另外一个错误:

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32
那么应该先尝试设置server_names_hash_max_size的值差不多等于名字列表的名字总量。如果还不能解决问题,或者服务器启动非常缓慢,再尝试提高server_names_hash_bucket_size的值。

8 开启高效文件传输模式
http模块中

http {
	...
	     sendfile on;
         tcp_nopush on;     
                                                              
         #tcp_nodelay on;     
         #keepalive_timeout 60;                   
	...
       }

sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据,减少cpu的占用.
激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量,传输bits效率上的优化,防止网络阻塞,(将多个包一次发送,用于提升网络传输效率,大文件推荐打开,需要开启sendfile)

激活tcp_nodelay,禁用Nagle算法,允许小包的发送。对于延时敏感型,同时数据传输量比较小的应用,开启 (提高网络传输实时性,需要开启keepalive)

tcp_nopush与tcp_nodelay不要同时开启

9 优化Nginx连接超时
http { } 模块中
keepalive_timeout 60;
client_header_timeout 15;
client_body_timeout 15;
send_timeout 25;
reset_timedout_connection on;

keepalive_timeout 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
client_header_timeout 设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout 设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示
send_timeout 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接
reset_timedout_connection 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间

10 上传文件打小的限制
这行默认如果没有添加到http { } server location范围内
client_max_body_size 8m; #设置最大的允许的客户端请求主体,如果超过此配置值,客户端会报413错误

PHP也有上传文件大小限制
vim /etc/php.ini
upload_max_filesize = 2M

11 FastCGI 相关参数调优
http {
fastcgi_connect_timeout 240; #Nginx服务器和后端Fastcgi服务器的连接超时时间
fastcgi_send_timeout 240; #Nginx允许Fastcgi服务器端返回数据的超时时间
fastcgi_read_timeout 240; #Nginx从Fastcgi服务器端读取响应信息的超时时间
fastcgi_buffer_size 64K; #Nginx Fastcgi的缓冲区大小
fastcgi_buffers 4 64K; #设定用来读取从Fastcgi服务器收到响应信息的缓冲区数量和大小
fastcgi_busy_buffers_size 128K; #设置系统忙时可使用fastcgi_buffers大小,一般为fastcgi_buffers值的2倍
fastcgi_temp_file_write_size 128k; #写入缓存文件使用多大的数据块,默认值是fastcgi_buffer值的2倍
#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; #缓存目录 缓存空间名字 用多少内存 多长时间内没有访问删除 磁盘缓存大小
}

server {         
fastcgi_cache ngx_fcgi_cache;     #表示开启fastcgi缓存并为其制定一个名称,必须加fastcgi_cache_key
fastcgi_cache_key $request_method://$host$request_uri;       #定义fastcgi_cache的key注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空
        fastcgi_cache_valid 200 302 1h;                                  #制定应答代码的缓存时间,200 302应答缓存一小时
        fastcgi_cache_valid 301 1d;                                         #301应答缓存一天
        fastcgi_cache_valid any 1m;                                        #其他应答缓存一分钟
        fastcgi_cache_min_uses 1;                                          #设置请求几次之后相应将被缓存,1表示一次即被缓存
        fastcgi_cache_use_stale error timeout invalid_header http_500;   #定义在哪些情况下使用过期缓存
                  }
在以往的经历中Fastcgi优化后会出现莫名其妙的问题,故此不推荐在生产上直接使用,可先在测试环境进行测试。

12 配置Nginx gzip 压缩
http {
gzip on; #开启gzip压缩功能
gzip_min_length 1k; #设置允许压缩页面最小的字节数
gzip_buffers 4 16k; #压缩缓冲区大小,表示申请4个单位为16k的内存作为压缩结果流缓存
gzip_http_version 1.1; #压缩版本
gzip_comp_level 9; #压缩级别,级别分为1~9
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; #用来指定压缩的类型,可打开下面文件查看
gzip_vary on; #根据客户端的HTTP头来判断,是否需要压缩. vary header支持
gzip_disable “MSIE[1-6].(?!.*SV1)”; #针对IE1-6禁用gzip
}
#vim /application/nginx/conf/mime.types #查看文件对应类型

13 Nginx静态页面缓存Cache
http{
open_file_cache max=65535 inactive=60s; #max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 80s; #这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1; #open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
open_file_cache_errors off; #缓存不要报错信息
}
open_file_cache 相关配置可以缓存静态文件的元信息,在这些静态文件被频繁访问时可以显着提升性能。
这个问题的关键是 sendfile
Nginx 在 serve 静态文件的时候用的是 sendfile, 当然前提是你配置了 sendfile on, sendfile 直接在 kernel space 内传输数据,对比使用 read/write省去了两次 kernel space 与 user space 之间的数据拷贝。而同时这些被频繁读取的静态文件的内容会被 OS 缓存到 kernel space。在这样的机制下,我们缓存中有文件的 fd 和 size,直接调用 sendfile 就可以了。

如果要 Nginx 连内容一起缓存,那就需要每次文件变化都要用 read将数据从 kernel space 复制到 user space,然后放在 user space,每次应答请求的时候再从 user space 复制到 kernel space 然后写入 socket。比起前面的方式,这样的方式毫无优点。

14 配置Nginx expires 缓存
location内容一般放到虚拟主机配置中,即server{ }标签中
#范例1
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 3650d;
}
#该范例的意思是当用户访问网站URL结尾的文件扩展名为上述指定类型时,设置缓存3650天。

#范例2
location ~ .*.(js|css)?$
{
expires 30d;
}
#该范例的意识是当用户访问网站URL结尾的文件扩展名为上述指定类型时,设置缓存30天。

#范例3
location ~ ^/(images|javascript|js|css|flash|media|static)/
{
expires 360d;
}
#该范例的意思是当用户访问网站URL中包含上述路径时,设置缓存360天

#范例4
location ~(robots.txt)
{
expires 7d;
break;
}
#上面的命令会给robots.txt机器人文件设置过期时间7天,在这7天并不记录404错误日志。

在访问量比较大的网站中,利用客户端来缓存网站上不经常变更的文件,是给服务器减压的一个很方便且实用的做法
比如,网站的 logo, 企业上传的 各种资格证书的图片,甚至有些商品的效果大图,只是不是经常变更的,大都可以让其存在客户端,提高访问速度,节省带宽,减小服务器的压力

304 也是一种很好的缓存手段
原理是: 服务器响应文件内容是,同时响应etag标签(内容的签名,内容一变,他也变), 和 last_modified_since 2个标签值
浏览器下次去请求时,头信息发送这两个标签, 服务器检测文件有没有发生变化,如无,直接头信息返回etag,last_modified_since
浏览器知道内容无改变,于是直接调用本地缓存.这个过程,也请求了服务器,但是传着的内容极少.

如果开发代码没有正式上线,静态文件不希望缓冲
location ~ .*.(css|js|swf|json|mp4|htm|html)$ {
add_header Cache-control no-store;
add_header Pragma no-cache;
}

15 include功能优化nginx配置文件易读性
mkdir /application/nginx/conf/extra
[root@web01 conf]# vim nginx.conf
http {
include extra/www.conf; #添加这个两行 指定目录下的网站配置文件 或include extra/*.conf;一条即可
include extra/bbs.conf;
}

16 nginx日志记录缓存优化
access_log logs/access_www.log main buffer=32k flush=5s;

17 安装后隐藏Nginx版本号
vim /application/nginx/conf/nginx.conf
在http{……}标签内添加
server_tokens off;
重启生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值