nginx調優(二)

nginx調優(一)

(1).Fastcgi調優javascript

  FastCGI全稱快速通用網關接口(FastCommonGatewayInterface),能夠認爲FastCGI是靜態服務和動態服務的一個接口。FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一次(這是CGI最爲人詬病的fork-and-execute 模式)。它還支持分佈式的運算, 即 FastCGI 程序能夠在網站服務器之外的主機上執行而且接受來自其它網站服務器來的請求。php

  FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。衆所周知,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠提供良好的性能、伸縮性、Fail- Over特性等等。css

  通用網關接口(Common Gateway Interface,CGI)是Web 服務器運行時外部程序的規範,按CGI 編寫的程序能夠擴展服務器功能CGI 應用程序能與瀏覽器進行交互,還可經過數據API與數據庫服務器等外部數據源進行通訊,從數據庫服務器中獲取數據。格式化爲HTML文檔後,發送給瀏覽器,也能夠將從瀏覽器得到的數據放到數據庫中。幾乎全部服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、VB 和Delphi 等。CGI分爲標準CGI和間接CGI兩種。標準CGI使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通訊採用標準輸入輸出方式。間接CGI又稱緩衝CGI,在CGI程序和CGI接口之間插入一個緩衝程序,緩衝程序與CGI接口間用標準輸入輸出進行通訊。html

  FastCGI模塊官方文檔:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html前端

  這裏的buffer是讀取緩存區,cache是寫入緩存區。而且FastCGI能夠定義全局的(定義在http{}下),也能夠定義局部的(定義在location{}下)。經常使用參數以下:java

fastcgi_connect_timeout 300;  #指定連接到後端FastCGI的超時時間。
fastcgi_send_timeout 300;  #向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。
fastcgi_read_timeout 300;  #指定接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。
fastcgi_buffer_size 64k;  #指定讀取FastCGI應答第一部分須要用多大的緩衝區,這個值表示將使用1個64KB的緩衝區讀取應答的第一部分(應答頭),能夠設置爲fastcgi_buffers選項指定的緩衝區大小。
fastcgi_buffers 4 64k;  #指定本地須要用多少和多大的緩衝區來緩衝FastCGI的應答請求,若是一個php腳本所產生的頁面大小爲256KB,那麼會分配4個64KB的緩衝區來緩存,若是頁面大小大於256KB,
那麼大於256KB的部分會緩存到fastcgi_temp指定的路徑中,可是這並非好方法,由於內存中的數據處理速度要快於磁盤。通常這個值應該爲站點中php腳本所產生的頁面大小的中間值,
若是站點大部分腳本所產生的頁面大小爲256KB,那麼能夠把這個值設置爲「8 16K」、「4 64k」等。
fastcgi_busy_buffers_size 128k;  #建議設置爲fastcgi_buffer的兩倍,繁忙時候的buffer。
fastcgi_temp_file_write_size 128k;  #在寫入fastcgi_temp_path時將用多大的數據庫,默認值是fastcgi_buffers的兩倍,設置上述數值設置小時若負載上來時可能報502Bad Gateway。
fastcgi_temp_path [地址] [目錄層級,最高3級,例如2層則爲'1 2'];  #定義臨時文件的路徑,目錄層級間使用空格隔開
fastcgi_cache ngnix;  #表示開啓FastCGI緩存併爲其指定一個名稱。開啓緩存很是有用,能夠有效下降CPU的負載,而且防止502的錯誤發生,可是開啓緩存也可能會引發其餘問題,要很據具體狀況選擇。
fastcgi_cache_valid 200 302 1h;  #用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一小時,要和fastcgi_cache配合使用。
fastcgi_cache_valid 301 1d;  #將301應答緩存一天。
fastcgi_cache_valid any 1m;  #將其餘應答緩存爲1分鐘。
fastcgi_cache_min_uses 1;  #請求的數量。
fastcgi_cache_path  #定義緩存的路徑和其餘參數。

  詳細說明下fastcgi_cache_path:nginx

    fastcgi_cache_psth [緩存地址] [levels=levels(目錄層級)] [use_temp_path=on|offkeys_zone=name:size(定義緩存名稱和大小) [inactive=time(不活躍數據緩存時間)] [max_size=size(全部緩存的最大總和)] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];數據庫

    緩存的響應首先被寫入一個臨時文件,而後對該文件進行重命名操做。從0.8.9版本開始,臨時文件和緩存文件能夠放在不一樣的文件系統中,不過此時再也不是重命名操做,而是文件跨兩個文件系統的複製操做。所以建議緩存(fastcgi_cache_path)和臨時文件(fastcgi_temp_path)的目錄都放在同一文件系統上。若是省略use_temp_path或其值爲on,則使用fastcgi_temp_path給定的目錄(存放cache第一步生成的臨時文件);若是其值爲off,則臨時文件放入緩存目錄。vim

    levels設置目錄層級,最多三層,層級之間使用冒號隔開。第一層目錄名取fastcgi_cache_key md5的最後一個字符,第二層目錄名取倒數2-3字符,第三次目錄名取倒數4-6字符。例如:fastcgi_cache_key md5爲b7f54b2df7773722d382f4809d65029c時,若是levels=1:2,那麼c/29/b7f54b2df7773722d382f4809d65029c;若是levels=1:2:3,那麼c/29/650/b7f54b2df7773722d382f4809d65029c。後端

  定義全局的FastCGI,並在location{}中調用。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_cache_path /data/ngx_fcgi_cache levels=1:2 keys_zone=ngx_fcgi_cache:10m inactive=1d max_size=40g;
    server{
......
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;  //將進入到該location的uri請求看作cgi程序,發送到9000端口給php-fpm處理
            fastcgi_index  index.php;
//動態添加一行fastcgi配置,配置SCRIPT_FILENAME,告知管理進程cgi腳本名稱。
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;  //導入fastcgi配置文件
            fastcgi_cache ngx_fcgi_cache;  //調用fastcgi緩存配置
            fastcgi_cache_valid 200 302 1h;  //狀態碼爲200、302保存一個小時
            fastcgi_cache_valid 301 1d;  //狀態碼爲301保存一天
            fastcgi_cache_valid any 1m;  //其餘狀態碼保存1分鐘
            fastcgi_cache_min_uses 1;  //1次請求後緩存,默認爲1
            fastcgi_cache_use_stale error timeout invalid_header http_500;  //若是出現錯誤、超時、空或無效的頭、狀態碼500,容許使用陳舊的緩存
            fastcgi_cache_key http://$host$request_uri;  //定義緩存的key樣式
        }
......
    }
}

  注意:在整個網絡請求的過程當中php是一個cgi程序的角色,因此採用名爲php-fpm的進程管理程序來對這些被請求的php程序進行管理。fastcgi_pass(發給php-fpm處理)、fastcgi_param(添加動態fastcgi配置)、include(導入fastcgi配置文件)是必不可少的。

(2).gzip壓縮網頁調優

  使用gzip壓縮功能能夠節約帶寬,加快傳輸速率,可是會佔用CPU資源。通常須要壓縮的內容有:文本、JS、html、CSS,而對於圖片、視頻、flash不壓縮。

  gzip壓縮功能定義在http{}塊下,經常使用參數有以下:

gzip on;  #開啓壓縮功能。
gzip_min_length 1k;  #設置容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length(內容長度)中獲取,默認值是0,無論頁面多大都進行壓縮,建議設置成大於1K,若是小與1K可能會越壓越大。
gzip_buffers 4 32k;  #壓縮緩衝區大小,表示申請4個單位爲32K的內存做爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
gzip_http_version 1.1;  #壓縮版本(默認1.1,前端爲squid2.5時使用1.0)用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認便可。
gzip_comp_level 9;  #壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,可是處理慢,也比較消耗CPU資源。
gzip_types text/css text/xml application/javascript;  #用來指定壓縮的類型,‘text/html’類型老是會被壓縮。
gzip_vary on;  #vary header支持,該選項可讓前端的緩存服務器緩存通過GZIP壓縮的頁面,例如用Squid緩存通過nginx壓縮的數據。

  定義gzip壓縮

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types text/css text/xml application/javascript;
    gzip_vary on;
......
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -t  //檢查配置文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

  可使用YSLOW查看壓縮情況。

(3).expires緩存調優

  expires緩存主要針對於圖片、css、JS等更改機會較少的部分使用,特別是圖片,佔用帶寬大,徹底能夠設置圖片緩存365d。

  expires緩存定義在location{}中,經過location{}來篩選。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {緩存圖片文件
            expires 365d;
        }
        location ~ .*\.(js|css)$ {  //緩存.js和.css文件
            expires 10d;
        }
        location ~ ^/(images|javasdript|js|css|flash|media|static){  //緩存目錄下全部文件
            expires 365d;
        }
        location ~(rebots.txt) {  //緩存爬蟲協議文件
            expires 7d;
            break;
        }
    }
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -t 
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

  expires優勢:下降網站帶寬,節約成本,提高用戶訪問體驗,減輕服務器壓力。

  expires缺點:被緩存的網頁或數據更新時,用戶還會使用舊的緩存。

  缺點處理辦法:縮短緩存時間;或更改緩存對面名稱。

  注意:廣告圖片、網站流量統計工具(監控)、更新頻繁的文件不要緩存,或縮短緩存時間。

  注意:將expires緩存放在一個server{}的最後,不然有可能會出現問題。

  使用YSLOW能夠看到緩存日期

 

(4).日誌切割

  nginx日誌切割通常使用腳本文件和計劃任務組合來實現的。

  作一個按天存放,超過10天刪除的日誌切割計劃任務。

[root@youxi1 ~]# vim /usr/local/nginx/logs/nginx_cutlog.sh
#!/bin/bash
date=$(date +%F -d -1day)
cd /usr/local/nginx/logs
if [ ! -d cut ] ; then  //確認是否存在cut目錄
    mkdir cut
fi
mv access.log cut/access_$(date +%F -d -1day).log
mv error.log cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -jcvf cut/$date.tar.bz2 cut/*  //打包壓縮,注意這裏生成在/usr/local/nginx/logs目錄下
rm -rf cut/access* && rm -rf cut/error*
find -type f -mtime +10 | xargs rm -rf  //刪除超過十天的文件
[root@youxi1 ~]# crontab -e
0 0 * * * /bin/sh /usr/local/nginx/logs/nginx_cutlog.sh > /dev/null 2>&1
[root@youxi1 ~]# chmod +x /usr/local/nginx/logs/nginx_cutlog.sh

(5).日誌優化

  健康檢查的日誌,不用輸入到log中,由於這些日誌沒有意義,咱們分析的話只須要分析訪問日誌,看看一些頁面連接,如200,301,404的狀態碼,在SEO中很重要,並且咱們統計PV是頁面計算,這些都沒有意義,反而消耗了磁盤IO,下降了服務器性能,咱們能夠屏蔽這些如圖片,js,css這些不宜變化的內容。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
#能夠在以前的緩存location中添加
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 365d;
            access_log off;
        }
        location ~ .*\.(js|css)$ {
            expires 10d;
            access_log off;
        }
#也能夠另外創建一個location
#        location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf)$ {
#            access_log off;
#        }
    ......
    }
}

  另外啓用日誌格式優化

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
......
}

說明:

  $remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;

  $remote_user:用來記錄客戶端用戶名稱;

  $time_local:用來記錄訪問時間與時區;

  $request:用來記錄請求的url與http協議;

  $status:用來記錄請求狀態,功是200;

  $body_bytes_s ent:記錄發送給客戶端文件主體內容大小;

  $http_referer:用來記錄從哪一個頁面連接訪問過來的;

  $http_user_agent:記錄客戶端瀏覽器的相關信息;

  日誌文件修改所屬主和所屬組,777權限須要看狀況而定。

[root@youxi1 ~]# chown -R root.root /usr/local/nginx/logs/
[root@youxi1 ~]# chmod -R 777 /usr/local/nginx/logs/

(6).目錄文件訪問控制和來源訪問控制

  這是location下的兩個參數allow和deny的使用,前者容許,後者拒絕。

  例如,配置/usr/local/nginx/html/images下的.php、.php五、.sh、.py、.pl結尾的文件禁止訪問。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
        location ~ ^/images/.*\.(php|php5|sh|py|pl)$ {
            deny all;
        }
...... } } [root@youxi1 ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload [root@youxi1 ~]# mkdir /usr/local/nginx/html/images [root@youxi1 ~]# echo "<?php phpinfo();?>" > /usr/local/nginx/html/images/index.php

  注意:因爲同優先級的location自上而下執行,因此不容許要在容許以前,不然不會生效。expires緩存放在一個server{}的最後。

  Windows查看

   配置只容許192.168.5.1訪問/usr/local/nginx/html/images下的.php結尾的文件

[root@youxi1 nginx]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
        location ~ ^/images/.*\.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
            allow 192.168.5.1;
            deny all;
        }
        location ~ \.php$ {
        ......
        }
    ......
    }
}
[root@youxi1 nginx]# /usr/local/nginx/sbin/nginx -s reload

  使用IP地址爲192.168.5.1的Windows訪問

 

  使用IP地址爲192.168.5.102的Linux訪問

[root@youxi2 ~]# curl 192.168.5.101/images/index.php
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>IIS/7.0.0</center>
</body>
</html>

  注意:allow和deny優先級相同,誰在上面誰先執行。若是隻想指定IP、網段、IP段訪問,須要allow和deny配合使用。

(7).rewrite和return

  rewrite的四個重要參數,break、last、redirect、permanent。

  rewrite break - url重寫後,直接使用當前資源,再也不執行location裏餘下的語句,完成本次請求,地址欄url不變;

  rewrite last - url重寫後,立刻發起一個新的請求,再次進入server塊,重試location匹配,超過10次匹配不到報500錯誤,地址欄url不變;

  rewrite redirect – 返回302臨時重定向,地址欄顯示重定向後的url,爬蟲不會更新url(由於是臨時);

  rewrite permanent – 返回301永久重定向, 地址欄顯示重定向後的url,爬蟲更新url。

  break;能夠單獨做爲一行,再也不執行location裏餘下的語句,完成本次請求,地址欄url不變。

 1)禁止使用IP訪問網站

  這實際上是加在http{}最後的server{},在確保域名配置完成後,將全部非指定域名的請求重寫,或直接返回錯誤。

  例如,返回403錯誤

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
    server{
        listen 80;
        server_name www.you.com
    ......
    }
......
    server{
        listen 80 default_server;
        server_name default_server;
        return 403;
    }
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

  再例如,將IP訪問(或非指定域名)重寫爲指定域名訪問(能夠保留uri,也能夠不保留)

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
    server{
        listen 80;
        server_name www.you.com
    ......
    }
......
    server{
        listen 80 default_server;
        server_name default_server;
//permanent返回301永久重定向,地址欄顯示重定向後的URL,爬蟲更新URL
        rewrite ^/(.*)$ http://www.you.com/$1 permanent;
    }
}
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

--------->

 2)防盜鏈

  防止別人直接從你網站引用圖片等連接,消耗了你的資源和網絡流量。

   能夠直接返回一個404或網站小圖片。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
        location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)${
            valid_referers none blocked *.you.com you.com;
            if ($invalid_referer) {  //若是無效,將會執行
                #return 404;
                rewrite ^/ http://www.you.com/img/nolink.png;
            }
        }
......
}

  valid_referers [none|blocked|server_names] 該指令會根據Referer Header頭的內容分配一個值爲0或1給變量$invalid_referer。若是Referer Header頭不符合valid_referers指令設置的有效Referer,變量$invalid_referer將被設置爲1。

  none表示沒有Referer的請求訪問資源;blocked表示不是http://開頭的,不帶協議的請求訪問資源;server_name表示一個或多個主機名或IP或域名,從0.5.33版開始可使用通配符*。

 3)目錄訪問控制也可使用rewrite或return

(8).自定義錯誤頁面

  開啓server塊裏的error_page既能夠本身編輯錯誤頁面了。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
        error_page  404              /404.html;
    ......
    }
}

(9).開啓認證功能

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    server{
    ......
        location ~ /test/ {
            auth_basic "username";
            auth_basic_user_file /usr/local/nginx/conf/passwd;
        }
    ......
    }
}
[root@youxi1 ~]# yum -y install httpd-tools  //爲了使用htpasswd命令
[root@youxi1 ~]# htpasswd -cb /usr/local/nginx/conf/password user1 123456  //只有第一次建立使用-c選項
Adding password for user user1
[root@youxi1 ~]# chmod 400 /usr/local/nginx/conf/password
[root@youxi1 ~]# chown nginx /usr/local/nginx/conf/password
[root@youxi1 ~]# /usr/local/nginx/sbin/nginx -s reload

  無論有沒有這個文件,它都會先認證。

(10).防DDOS攻擊

  經過使用limit_conn_zone進行控制單個IP或者域名的訪問次數。

[root@youxi1 ~]# vim /usr/local/nginx/conf/nginx.conf
http{
......
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
......
    server{
    ......
        location / {
        ......
            limit_conn perip 1;
            limit_rate 500k;
            limit_rate_after 50m;
        ......
    }
......
}

說明:

  $binary_remote_addr針對同IP;$server_name針對同主機名。

  zone=[做用域名稱]:[總帶寬]。

  limit_conn [做用域名稱] [鏈接數],限制做用域的鏈接數量。若是做用域是針對同IP,那麼就是一個IP地址只能創建一個鏈接(當前location);若是做用域是針對同主機名,那麼就是一個主機只能創建一個鏈接(當前location)。

  limit_rate [帶寬],限速單個鏈接的帶寬。

  limit_rate_after [下載的文件大小],和limit_rate配合使用,表示當下載總量達到設置的文件大小後,開啓限速效果(逐漸降速),針對當個鏈接。

補充:阻止DDOS攻擊和CC攻擊nginx防止DDOS攻擊配置

參考:http://www.javashuo.com/article/p-chendryu-p.html

   nginx如何調用php

   https://blog.csdn.net/zhanlanmg/article/details/49684803

   http://blog.sina.com.cn/s/blog_94c21e8f0101qfjr.html

   https://www.jianshu.com/p/0de3e5faea0d

   https://www.cnblogs.com/nat-zhu/p/7093797.html?utm_source=itdadao&utm_medium=referral

相關文章
相關標籤/搜索