nginx服务调优

                                    nginx调优javascript

nginx 配置文件模块:php

main全局设置:css

 

events   stream四层代理模块html

             upstream  负载均衡设置:后端主机前端

             serverjava

http模块  gzip 压缩做用node

server模块    主机设置:portlinux

   localtion  匹配页面位置,每一个页面在什么位置上nginx

   localtion  URL特定匹配设置web

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的状态码

相关文章
相关标签/搜索