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的狀態碼

相關文章
相關標籤/搜索