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服务调优的主要内容,如果未能解决你的问题,请参考以下文章

Nginx下载服务生产服务器调优

Nginx 调优

NginxNginx服务器配置调优

nginx调优参数整理总结

nginx调优参数整理总结

Nginx性能调优