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