nginx服务调优
Posted Leonardo-li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx服务调优相关的知识,希望对你有一定的参考价值。
nginx调优 |
nginx 配置文件模块: main全局设置:
events stream四层代理模块 upstream 负载均衡设置:后端主机 server http模块 gzip 压缩作用 server模块 主机设置:port localtion 匹配页面位置,每个页面在什么位置上 localtion URL特定匹配设置 server模块
server继承main的设置 localtion 继承server upstream不会继承,也不会被继承
nginx配置文件调优: vim /usr/local/nginx/conf/nginx.conf main全局设置 user nginx; //用户 group nginx; //组
worker_processes 2; //进程数量,每个进程占12-15MB的内存,如果多核,建议和cpu数量一样
error_log logs/error.log; //开启日志级别 #error_log logs/error.log notice; #error_log logs/error.log info;
日志级别:debug\\info\\notice\\warn\\error\\crit
worker_rlimit_nofile 65535; //nginx进程可以打开做多文件描述数量 注意: ulimit -n 65535 //生效文件描述,默认是1024
stat nginx.conf //查看描述文件, 单个文件最大权限666,当是一个程序的时候才是777,目录的最大权限是777,目录没有执行权的时候,打不开目录文件的描述信息,只能看到目录名,看不到具体的物理位置,
events { use epoll; //多路复用,可以大并发的处理文件, 1.select/poll/ 标准模式,常规工作模式 2.kqueue/epoll/rtsig 高效模式:BSD:kqueue linux:epoll 很少用:rtsig worker_connections 65535; } //每个值的最大连接数量,默认1024 1.max_client=worker_processes * worker_connections 2.反向代理:max_client=worker_processes * worker_connections/4
注意:这两个必须用这个启动ulimit -n 65535: 临时生效: worker_rlimit_nofile 65535; worker_connections 65535;
永久生效: vim /etc/rc.local 添加:ulimit -n 65535
************************ 第二个模块: http的模块
http { include mime.types; //包含的另外的配置文件,简化主配置文件
default_type application/octet-stream; //应用层的二进制流,没有定义文件类型的时候,使用二进制流,php-fpm启动失败了,然后就会出现下载的php文件
#log_format main //日志格式,自己喜欢的格式access_log logs/access.log main; client_max_body_size 20m; //客户端请求的最大的单个文件字节数,默认2m,公司最大的文件字节数 client_header_buffer_size 32k; //用来指定客户端缓冲区大小,是软件申请的内存空间,操作系统无法管理大小,静态页面1k足够,动态cookie,cookie越大这个值越大,128k large_client_header_buffers 4 32k; //客户端请求较大的消息头部,最大值和大小 4 32k=128k,最大缓存就是128k/或者是4 128k=256k
添加: Dertypage:cpu处理完成要往硬盘里写的数据 buffer :缓冲区 内存处理一个数据大概100ns,硬盘是s秒
sendfile on; //开启高效传输模式,这个开,下边两个才生效, tcp_nopush on;//不要重传 tcp_nodelay on;//不要延迟,数据进来不禁列队,直接进来。 //这两个参数合起来防止网络拥塞
TCP封装格式: URG 数据的优先级,
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,TCP,建立连接,然后ack,进行数据传输,UDP,给一个数据,一个ack
PSH表示有 DATA数据传输,
RST表示连接重置。
TCP的流控机制:
滑动窗口:表示本地接受的字节数。
TCP差错控制: 要多少传多少
1.重传计时器: 发出的每一个包都开启一个计时器,3600s,然后等待对方回应,如果没有回应,然后在传一个,并重新开启一个计时器,然后最大10次以后彻底断开。
2.坚持计时器: 为了防止0窗口锁死状态,第一就是在超时前如果回应了,继续发消息,如果丢掉了,就会发送探测数据段,用来测试是否在线,
3.保活计时器: 确认关系后,客户端不给服务器发数据,然后服务器进行探测数据的10个的发送。也是3600s
4.时间等待计时器: 发一个FIN,然后等待最后一个ack超时,然后断开连接,就是在断开的时候进行等待,然后3600后彻底断开。
UDP 一个data,一个ack
# keepalive_timeout 0; keepalive_timeout 60; //保活计时器,客户端保活的时间 client_header_timeout 10; //客户端请求头部的超时时间,超时返回408错误, client_body_timeout 10; //主体读取超时时间,返回408错误 send_timeout 10; //响应客户端的超时时间,关闭连接
添加模块: cd /usr/src/nginx-1.11.1/ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-stream --with-http_gzip_static_module && make
cd /usr/local/nginx/sbin/ mv nginx nginx.bak cd /usr/src/nginx-1.11.1/objs/ cp nginx /usr/local/nginx/sbin/ nginx -V
注意: 只需要make—— 替换二进制文件 不要make install
**************************** 压缩模块: gzip on;开启 gzip_min_length 1k; //允许压缩页面的最小字节数,Content_Length,大于1k压缩,否则不压缩 gzip_buffers 4 16k; //4个16k,作为压缩结果缓存,默认与原数据相同小大空间 gzip_http_version 1.1; //http压缩支持的版本 gzip_comp_level 2; //【1-9】小:压缩比例小,速度快,大反之 gzip_types text/plain application/x-javascript text/css ap plication/xml; //指定压缩的类型, gzip_vary on; 注意:可以让前端缓存服务器经过gzip的缓存页面,务必打开
*****************************
轮询模块: upstream licluster { //什么都不写,按照时间顺序 ip_hash: // //按照请求访问ip的hash结果分配范围,解决动态网站的session共享问题 fair; //按照页面大小的加载时间长短,根据后端服务器响应时间来分配,第三方模块,自己下载一个upstream_fair模块 url_hash; //按照url的hash结果分配,每个url定向到同一个后端服务器,提高后端缓存服务器的效率,需要按装nginx hash模块, server 192.168.117.100:80 weight=6;
server 192.168.117.101:80 down; //down不参与轮询,backup备份机,全部非backup主机不可访问是才生效。 server 192.168.117.102:8008 max_fails=3 fail_timeout=20s; //max_fails 允许请求失败的次数,默认值是1,proxy_next_upstream定义错误模,fail_timeout 失败后暂停服务的时间,这两个一定是连用的。 server 192.168.117.103:8080; //当负载均衡调度算符是ip_hash的时候后端服务器在负载均衡调度中的状态不能是weight和backup,weight和backeup的优先级高,同时存在ip_hash失效。
******************************* 主机模块: server { listen 80; server_name www.baidu.com; //域名
charset gb2312; //字符集
access_log logs/www.li.com.access.log main //定义日志 index.html index.jsp //定义页面文件 root /var/www/html/www.li.com //定义网站的保存路径。
****************************** 代理模块: location / { root html; index index.html index.htm; }
添加: location ~ .*\\.(gif|jpg|jpen|png|bmp|swf)$ { //图片服务器代理 root /var/www/html/www.li.com/img //存放位置 expires 30d; //过期时间为30天 }
location ~ ^/(upload|html)/ { //静态页面 root /var/www/html/www.li.com/img expires 10d; //过期时间为10天 }
location ~ .*.jsp$ { //解析jsp脚本 index index.jsp; proxy_pass http://localhost:8080; }
location / { proxy_pass http://licluster; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
include /usr/local/nginx/conf/proxy.conf; 注意:将下边的代理都写到上边的proxy.conf这个文件中,可以简化主配置文件
proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for; client_body_buffer_size 128k; //暂时缓存到本地,然后在转给客户端,客户端请求的主体缓冲区的的大小。 proxy_connect_timeout 90; //后端服务器连接的超时时间发起握手等候响应的超时时间 proxy_send_timeout 90; //后端服务器的数据回传时间,规定时间内后端服务器必须回传完成所有的数据,否则断开连接。 proxy_send_timeout 90; //设置nginx从代理的后端服务器获取信息的时间,表示建立连接后,nginx等待后端服务器的响应时间。 proxy_buffer_size 4k; //设置缓冲区的大小。默认等于buffers的大小 proxy_buffers 4 32k; //设置缓冲区的数量和大小,nginx从后端获取的响应信息放到缓存中去 proxy_busy_buffers_size 64k; //用于设置系统繁忙是可以临时开启的大小,是上一条的2倍 proxy_temp_file_write_size 64k; //指定proxy缓存临时文件的大小。 }
location ~* \\.(gif|jpg|png|flv|wma|avi|wmv|mp3|zip|rar)$ { //遇到这些后缀的时候进行防盗链
valid_referers none blocked *.li.com li.com; //只能让这两个网站进行访问 if ($invalid_referer) { rewrite ^/ http://www.li.com/img/error.gif; #return 403; } } location /images { root /var/www/html/www.li.com/img if ($invalid_referer) { rewrite ^/ http://www.li.com/img/error.gif; #return 403; } }
日志切割: 一般日志到了1G就进行切割
wc -w 单词 wc -c 字节数
1.原日志文件的位置: cd /usr/local/nginx/logs/ ls access.log error.log
2.查找PID文件位置, cat /usr/local/nginx/logs/nginx.pid
3.编辑日志切割的脚本 vim /etc/init.d/nglog #!/bin/bash savepath_log=\'/home/nginx/logs/\' nglogs=\'/usr/local/nginx/logs\' mkdir -p $savepath_log/$(date +%Y)/$(date +%m) mv $nglogs/access.log $savepath_log/$(date +%Y)/$(date +%m)/access.$(date +%Y%m%d).log mv $nglogs/error.log $savepath_log/$(date +%Y)/$(date +%m)/error.$(date +%Y%m%d).log kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
chmod +x /etc/init.d/nglog 启动日志文件 /etc/init.d/nglog start
*********************调整内核参数************************
这么调的目的是,将TCP连接无限接近UDP,让连接更快,节省连接的时间,达到调优的目的。
vim /etc/sysctl.conf
kernel.shmall = 4294967296
添加:
net.ipv4.tcp_max_tw_buckets = 6000
//timewait的数量,默认180,000
net.ipv4.ip_local_port_range = 1024 65000,默认的区间是32768-65535
//允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1
//开启timewait快速回收,快速断开
net.ipv4.tcp_tw_reuse = 1
//允许timewait sockets重新建立tcp连接
net.ipv4.tcp_syncookies = 1
//当sys等待列队溢出时,启动cookies来存放溢出的值
net.core.somaxconn = 262144
//默认值为128,调整系统同时发起的tcp连接数,在高并发状态下可能会导致超时或者重传,所以一般要结合并发请求来调节
net.core.netdev_max_backlog = 262144
//当网卡接受的数据包的速率比内核处理这些包的速度快时,允许列队等待的数据包的最大数目
net.ipv4.tcp_max_orphans = 262144
//有多少个tcp套接字不被关联到任何一个用户文件的句柄上,可以防止简单的DOS攻击
net.ipv4.tcp_max_syn_backlog = 262144
//记录尚未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_synack_retries = 1
//内核放弃连接前的SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1
//内核放弃链接前的发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1
//保持最后一个finwait时间。默认值时60,在集群环境中最好改为1,集群切换速度更快
net.ipv4.tcp_keepalive_time = 30
//配置文件启动keepaive时候,tcp发送keepalive消息的频度,默认时2,(单位是小时)
sysctl -p
***********************FastCGI模块**********************
vim /usr/local/nginx/conf/nginx.conf
(1)FastCGI:
根据CGI演变过来的,可伸缩的,高速的,在HTTP server和动态脚本语言间的接口
高并发
apache 、nginx 、lighttpd
C/S架构:把http server和脚本解释服务器(php-fpm)分开,让每一层服务都独立形式存在,
传统CGI:
性能特别差,导致不可高并发,安全性差,
(2)nginx + fastcgi运行原理:
1.nginx 不支持对外部程序直接调用或者解析,所有的程序全部都走fastCGI
2.fastcgi 在linux的表现形式为socket(可以是文件,也可以是IPsocket)
3.wrapper 用于启动另外一个程序的启动程序,类似于父进程
(3)工作工程+配图:
首先客户端向nginx发送一个请求 然后nginx并不处理这个请求而是把这个请求交给了socket
socket交给了FastCGI(每个程序都有一个CGI 交给你这个服务的CGI) 然后去找wrapper wrapper去找application然后启动服务。返回的效果也是一样
(4)fastcgi调优:
nginx必须借助php-fpm来做,然后才能解析php语言
php-fpm:第三方的fastcgi的管理器,是php的一个补丁,必须依赖php源码,处理性能更加优秀
fastcgi相关的参数需要http这一个模块进行调整,
调优位置:
在http模块下的server模块里,在连接php的参数下边
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
//缓存文件存放路径,目录机构等级,关键字区域的存储的时间,非活动删除时间,后边时间不可以大于前边的时间。
fastcgi-connect_timeout 300;
//连接后端fastcgi的超时时间
fastcgi_send_timeout 300;
//向fastcgi发送请求的超时时间,两次握手之后的
fastcgi_read_timeout 300;
//接收fastcgi应答的超时时间,完成两次握手之后的
fastcgi_buffer_size 64k;
//数据的应答头的大小为64k缓冲区大小
fastcgi_buffers 4 64k;
//本地需要多少和多大的缓冲区来缓冲fastcgi的应答请求,例如:一个页面所产生的大小为256k,那么会为其分配4个64k的缓冲区,如果超过256k,那么直接会缓存到缓存路径中去。
fastcgi_busy_buffers_size 128k;
//fastcgi_buffers * 2
fastcgi_temp_file_write_size 128k;
//写入缓存是使用的数据库大小 fastcgi_buffers * 2
fastcgi_cache TEST;
//给缓存起个名,开启缓存,防止502错误发生 #这个名字与上边的key_zone=TEST相同
fastcgi_cache_valid 200 302 1h;
//指定应答代码的缓存时间。200、302的缓存一小时
fastcgi_cache_valid 301 1d;
//301缓存一天
fastcgi_cache_valid any 1m;
//其他缓存1分钟,必须知道web的状态码
|
|
以上是关于nginx服务调优的主要内容,如果未能解决你的问题,请参考以下文章