1. 程式人生 > >Linux運維學習筆記之十七:LNMP的WEB架構深度優化之效能優化

Linux運維學習筆記之十七:LNMP的WEB架構深度優化之效能優化

第二十七章LNMP的WEB架構深度優化之效能優化

一、Nginx效能優化-配置Nginx的worker程序個數

1、worker的作用和初始設定

worker_processes就是worker角色的程序個數,也就是nginx啟動後有多少個worker處理http請求。master程序不處理請求,而是根據相應配置檔案資訊管理worker程序。master程序主要負責對外攬活(即接收客戶端的請求),並將活兒合理的分配給多個worker,每個worker程序主要負責幹活(處理請求)。nginx 程序數,建議按照cpu 數目(個數或核數)來指定,一般擁有幾個邏輯CPU,就設定為幾個worker_processes 為宜,但是 worker_processes 超過8個就沒有多大意義了

2、檢視調整worker程序個數的引數(預設為1)

grep "worker_processes" /application/nginx/conf/nginx.conf

worker_processes  1;

3、檢視CPU核數的方法

(1)方法一:grep "physical id" /proc/cpuinfo | wc –l     #本機為2個

(2)方法二:top  -->  按1  —>  顯示每個CPU的負載,也就知道了CPU的個數了。

4、修改worker程序個數

vi /application/nginx/conf/nginx.conf

worker_processes  2;

5、重啟nginx

/application/nginx/sbin/nginx –s reload

6、檢視worker_process程序

ps -ef | grep nginx

nginx     2510  2509  005:42 ?        00:00:00 nginx: worker process

nginx     2511  2509  005:42 ?        00:00:00 nginx: workerprocess 

二、Nginx效能優化-根據CPU核數對Nginx程序進行優化

1、為什麼要根據CPU核數對Nginx程序進行優化

預設情況下,Nginx的多個程序可能更多的是跑在一顆CPU上,無法充分利用伺服器的多核多CPU,為了充分利用CPU,所以對Nginx程序進行優化,使Nginx不同的程序跑在不同的CPU上。

2、配置Nginx跑在多CPU上的引數(又稱為nginx程序cpu親和力)

worker_cpu_affinity   00010010 0100 1000

這裡的0001 0010 0100 1000是掩碼,分別代表第1、2、3、4顆CPU核心。

3、配置示例
(1)示例1:2核CPU伺服器

vi /application/nginx/conf/nginx.conf

worker_processes  2;

worker_cpu_affinity0001 0010

(2)示例2:4核CPU伺服器

vi /application/nginx/conf/nginx.conf

worker_processes  4;

worker_cpu_affinity0001 0010 0100 1000

(3)示例3:8核CPU伺服器

vi /application/nginx/conf/nginx.conf

worker_processes  8;

worker_cpu_affinity00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

三、Nginx效能優化-配置Nginx事件處理模型及連線數

1、Nginx支援事件處理模型

Nginx支援如下處理連線的方法(I/O複用方法),在linux下面,只有epoll是高效的方法。這些方法可以通過use指令指定:

select– 標準方法。 如果當前平臺沒有更有效的方法,它是編譯時預設的方法。你可以使用配置引數 –with-select_module 和–without-select_module 來啟用或禁用這個模組。

poll– 標準方法。 如果當前平臺沒有更有效的方法,它是編譯時預設的方法。你可以使用配置引數 –with-poll_module 和–without-poll_module 來啟用或禁用這個模組。

kqueue– 高效的方法,使用於 FreeBSD4.1+, OpenBSD 2.9+, NetBSD 2.0 和MacOS X. 使用雙處理器的MacOS X系統使用kqueue可能會造成核心崩潰。

epoll– 高效的方法,使用於Linux核心2.6版本及以後的系統。在某些發行版本中,如SuSE 8.2, 有讓2.4版本的核心支援epoll的補丁。

/dev/poll– 高效的方法,使用於 Solaris

windows使用的是icop。

2、epoll的優點
(1)支援一個程序開啟大數目的socket描述符(FD)

select 最不能忍受的是一個程序所開啟的FD是有一定限制的,由FD_SETSIZE設定,預設值是2048。對於那些需要支援的上萬連線數目的IM伺服器來說顯 然太少了。這時候你一是可以選擇修改這個巨集然後重新編譯核心,不過資料也同時指出這樣會帶來網路效率的下降,二是可以選擇多程序的解決方案(傳統的 Apache方案),不過雖然linux上面建立程序的代價比較小,但仍舊是不可忽視的,加上程序間資料同步遠比不上執行緒間同步的高效,所以也不是一種完美的方案。不過 epoll則沒有這個限制,它所支援的FD上限是最大可以開啟檔案的數目,這個數字一般遠大於2048,舉個例子,在1GB記憶體的機器上大約是10萬左 右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個數目和系統記憶體關係很大。

(2)IO效率不隨FD數目增加而線性下降

傳統的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,不過由於網路延時,任一時間只有部分的socket是”活躍”的,但 是select/poll每次呼叫都會線性掃描全部的集合,導致效率呈現線性下降。但是epoll不存在這個問題,它只會對”活躍”的socket進行操 作—這是因為在核心實現中epoll是根據每個fd上面的callback函式實現的。那麼,只有”活躍”的socket才會主動的去呼叫 callback函式,其他idle狀態socket則不會,在這點上,epoll實現了一個”偽”AIO,因為這時候推動力在os核心。在一些 benchmark中,如果所有的socket基本上都是活躍的—比如一個高速LAN環境,epoll並不比select/poll有什麼效率,相 反,如果過多使用epoll_ctl,效率相比還有稍微的下降。但是一旦使用idle connections模擬WAN環境,epoll的效率就遠在select/poll之上了。

(3)使用mmap加速核心與使用者空間的訊息傳遞。

這點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要核心把FD訊息通知給使用者空間,如何避免不必要的記憶體拷貝就很 重要,在這點上,epoll是通過核心於使用者空間mmap同一塊記憶體實現的。而如果你想我一樣從2.5核心就關注epoll的話,一定不會忘記手工 mmap這一步的。

(4)核心微調

這一點其實不算epoll的優點了,而是整個linux平臺的優點。也許你可以懷疑linux平臺,但是你無法迴避linux平臺賦予你微調核心的能力。比如,核心TCP/IP協 議棧使用記憶體池管理sk_buff結構,那麼可以在執行時期動態調整這個記憶體pool(skb_head_pool)的大小— 通過echoXXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函式的第2個引數(TCP完成3次握手 的資料包佇列長度),也可以根據你平臺記憶體大小動態調整。更甚至在一個數據包面數目巨大但同時每個資料包本身大小卻很小的特殊系統上嘗試最新的NAPI網絡卡驅動架構。

3、指定Nginx使用epoll事件處理模型

預設情況下,nginx是沒有指定事件處理模型,預設就會使用最有效的模型,如果要指定epoll事件處理模型,則要在nginx.conf配置檔案中的events標籤下加入“use epoll;”語句。

4、調整單個程序允許的客戶端最大連線數

引數名稱為worker_connections,預設值為1024.是定義Nginx每個程序的最大連線數,在nginx.conf配置檔案中的events標籤下加入“worker_connections= 要指定最大連線數;”語句。這個引數的數值應該根據伺服器的效能和程式的記憶體使用量來指定(也就是一個程序啟動執行後使用的記憶體)。最大客戶端連線數由worker_processes和worker_connections兩個引數共同決定,即Nginx的客戶端最大連線數Max_client=worker_processes * worker_connections。同時,客戶端最大連線數也受到Linux系統程序的最大開啟檔案數的限制。在執行作業系統命令ulimit –HSn65535或配置相應檔案後worker_connections的設定才能生效。

5、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;   #指定單個程序允許的客戶端最大連線數

use epoll;                    #指定使用epoll事件處理模型

}

http {

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent"$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

四、Nginx效能優化-優化伺服器名字的hash表大小

1、伺服器名字的hash表說明

Nginx的配置檔案nginx.conf或其它擴充套件server中server_name儲存在伺服器名字的hash表中。hash表和監聽的埠關聯,每個埠都最多關聯到3張表:確切名字的hash表,以星號“*”開始的萬用字元名字的hash表和以星號“*”結束的萬用字元名字的hash表。Nginx首先搜尋確切名字的hash表;如查沒找到,則搜尋以以星號“*”開始的萬用字元名字的hash表;如果還沒找到,則搜尋以以星號“*”結束的萬用字元名字的hash表。儲存伺服器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。引數hash bucket size總是等於hash表的大小,server_names_hash_bucket_size的預設值可能是32,也可能是64,或其它值,取決於CPU的快取行的長度,但是一路處理器快取大小的倍數。

如果需要在Nginx的配置檔案中定義大量名字或名字非常長,就需要在http標籤中配置server_names_hash_max_size和server_names_hash_bucket_size的值。則否有可能會報could not build the server_names_hash, you should increaseserver_names_hash_bucket_size: 32的錯誤。

2、指定伺服器名字的hash表大小

在nginx.conf配置檔案中的http標籤下加入:

server_names_hash_max_size 512; #預設就是512,單位是Kb

server_names_hash_bucket_size 64;

3、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;   #指定單個程序允許的客戶端最大連線數

use epoll;                    #指定使用epoll事件處理模型

}

http {

    server_names_hash_bucket_size 128; #伺服器名字的hash表大小

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status$body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

五、Nginx效能優化-開啟高效檔案傳輸模式(預設是關閉的)

1、設定引數

(1)設定位置:在http標籤設定

(2)引數:“sendfile on;”,同時將tcp_nopush和tcp_nodelay兩個指令設定為on,用於防止網路阻塞。

2、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;   #指定單個程序允許的客戶端最大連線數

useepoll;                    #指定使用epoll事件處理模型

}

http {

    server_names_hash_bucket_size 128; #伺服器名字的hash表大小

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

sendfile on; #開啟高效檔案傳輸模式,

tcp_nopush on; #防止網路阻塞

tcp_nodelay on; #防止網路阻塞

    keepalive_timeout  65;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status$body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

六、Nginx效能優化-設定連線超時時間

1、設定引數
(1)設定位置:在http標籤設定
(2)引數:

keepalive_timeout 60; #設定客戶端連線保持活動的超時時間,在超過這個時間之後伺服器會關閉該連結。

tcp_nodelay on; #防止網路阻塞。只有打開了tcp_nodelaykeepalive_timeout才有效

client_header_timeout 15; #用於設定客戶端請求讀取超時時間,如果超過這個時間,客戶端沒有傳送任何資料,nginx將返回“request timeout (408)”錯誤。

client_body_timeout 15;  #用於設定客戶端請求主體讀取超時時間,預設值為60.如果超過這個時間,客戶端還沒有傳送任何資料,nginx將返回“Request time out(408)”

send_timeout 15; #伺服器超時設定,響應客戶端的超時時間。如果超過這個時間,客戶端還沒有任何活動,nginx將會關閉連線

2、配置示例

vi /application/nginx/conf/nginx.conf

error_log logs/error.log error;

worker_processes  2;

events {

worker_connections  4096;  #指定單個程序允許的客戶端最大連線數

useepoll;                    #指定使用epoll事件處理模型

}

http {

    server_names_hash_bucket_size 128; #伺服器名字的hash表大小

    server_tokens off;

    include       mime.types;

    default_type  application/octet-stream;

sendfile on; #開啟高效檔案傳輸模式,

tcp_nopush on; #防止網路阻塞

tcp_nodelay on; #防止網路阻塞

keepalive_timeout60;

client_header_timeout 15;

client_body_timeout 15;

send_timeout 15;

    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status$body_bytes_sent "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for"';

    include extra/www.conf;

    include extra/bbs.conf;

    include extra/blog.conf;

}

七、Nginx效能優化-配合PHP應用優化fastcgi引數

1、上傳檔案大小限制(動態應用)
(1)設定位置:可在nginx.conf配置檔案的http、server和location標籤中設定
(2)引數:client_max_body_size

設定為0表示不檢查,如果上傳檔案過大,會報413錯誤:Request EntityToo Large。也就是在請求頭內容中的Content-Length的值不能超守該引數設定的值。同時,也受PHP本身設定的限制(PHP本身預設設定了上傳附件大小不能超過2M)

(3)配置示例

http {

    server_tokens off;

include       mime.types;

client_max_body_size 10m;

。。。。。。

}

2、fastcgi調優(配合PHP引擎動態服務)
(1)設定位置:可在nginx.conf配置檔案的location標籤中設定
(2)引數:

a、指定連線到後端fastCGI的超時時間

fastcgi_connect_timeout 300;

b、向fastCGI請求的超時時間,這個值是指已經完成兩次握手後向fastCGI傳送的超時時間

fastcgi_send_timeout 300;

c、接收fastCGI應答的超時時間,這個值已經完成兩次握手後接收fastCGI應答的超時時間

fastcgi_read_timeout 300;

d、指定讀取fastCGI應答第一部分需要用多大的緩衝區,一般第一部分應答不會超過1k,一般設定為64k

fastcgi_buffer_size 64k;

e、指定本地需要用多少和多大的緩衝區來緩衝fastCGI的應答

fastcgi_buffers 4 64k;

f、預設值是fastcgi_buffers的兩倍

fastcgi_busy_buffers_size 128k;

g、在寫入fastcgi_temp_path是用多大的資料塊,預設值是fastcgi_buffers兩倍

fastcgi_temp_file_write_size 128k;

(3)配置示例

cat /application/nginx/conf/extra/www.conf

server {

    listen       80;

    server_name  www.abc.org;

        root  html/www;

        index  index.html index.htm;

        access_loglogs/www_access.log main;

    location ~.*\.(php|php5)?$ {

        fastcgi_pass   127.0.0.1:9000;

fastcgi_connect_timeout300;

fastcgi_send_timeout300;

fastcgi_read_timeout300;

fastcgi_buffer_size64k;

fastcgi_buffers4 64k;

fastcgi_busy_buffers_size128k;

fastcgi_temp_file_write_size128k;

        fastcgi_index  index.php;

        include        fastcgi.conf;

    }

}

八、Nginx效能優化-配置nginx gzip壓縮功能

1、不要壓縮的內容:圖片、視訊、Flash、小檔案
2、設定引數
(1)設定位置:在http或server標籤中設定
(2)引數:

a、開啟gzip壓縮輸出(預設開啟)

gzip on;

b、最小壓縮檔案大小。用於設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭的content-length中獲取。預設值是0,表示不管頁面多大都進行壓縮,建議設定成大於1k的位元組數,小於1k可能會越壓越大

gzip_min_length 1k;

c、表示申請4個單位為16k的記憶體作為壓縮結果流快取,預設值是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果

gzip_buffers 4 16k;

d、壓縮版本(預設1.1,前端如果是squid2.5請使用1.0)

gzip_http_version 1.0;

e、壓縮等級

gzip_comp_level 2;

f、壓縮型別,預設就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。

gzip_types text/plain application/javascript text/cssapplication/xml;

可以通過cat mime.types來檢視所支援的種類寫法。

g、選項可讓前端的快取伺服器快取經過gzip壓縮的頁面,例如,用squid快取經過nginx壓縮的資料。

gzip_vary on;

3、配置示例

http {

    server_tokens off;

include       mime.types;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_comp_level 9;

gzip_types text/plain application/javascript text/cssapplication/xml;

gzip_vary on;

。。。。。。

}

4、重啟服務

/application/nginx/sbin/nginx –s reload

/application/php/sbin/php-fpm restart

九、Apache效能優化-配置壓縮功能mod_deflate

1、引數位置

Apache的mod_deflate模組提供了DEFLATE輸出過濾器,允許Apache伺服器將輸出內容在傳送到客戶端之前根據具體的策略進行壓縮,以節約網路頻寬,提升使用者訪問速度。可以在http.conf或擴充套件conf中設定。

2、檢查Apache是否安裝mod_deflate模組

/application/apache/bin/apachectl -l | grep mod_deflate

  mod_deflate.c  #表示已安裝

在編譯安裝Apache的configure過程時,指定了--enable-deflate引數。

3、mod_deflate模組的DSO安裝方法

如果在編譯時沒有指定--enable-deflate引數,則可以DSO動態模組載入mod_deflate配置。命令如下:

(1)切換到Apache的原始碼安裝包的modules目錄下的filters目錄下

cd /wddg/tools/httpd-2.2.27/modules/filters/

(2)呼叫apache的apxs命令編譯該目錄下的mod_defalte.c檔案

/application/apache/bin/apxs -c -i -a mod_deflate.c

(3)檢視編譯後的生成的so檔案

ll /application/apache/modules/mod_deflate.so

4、設定引數

<ifmodule mod_deflate.c>:開始標籤標記

DeflateCompressionLevel:壓縮級別

SetOutputFilter DEFLATE:啟動壓縮

AddOutputFilterByType DEFLATE:要壓縮的檔案型別

</ifmodule mod_deflate.c>:結束標籤標記

5、配置示例

在httpd.conf最下面加上以下語句:

<ifmodule mod_deflate.c>

DeflateCompressionLevel 6

SetOutputFilter DEFLATE 

AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml

AddOutputFilterByType DEFLATE text/javascript

</ifmodule> 

十、Nginx效能優化-配置expires快取功能

1、expires的作用和優缺點
(1)作用

expires就是在客戶端快取頁面並指定快取時間。主要是快取靜態檔案,如照片、css、js等。一般不快取廣告圖片、頻繁更新的檔案、網站流量統計工具等。

(2)優點

a、降低伺服器壓力

b、降低頻寬,節約成本,同時提升了訪問體驗

(3)缺點

如果被快取的頁面更新,使用者訪問的時候看到的還是舊版本的內容

(4)解決方法

a、縮短快取時間,比如1天

b、修改名稱。

圖片,附件一般不會被使用者修改,如果使用者修改,實際上修改的是檔名重新傳。網站升級一般修改css和js檔案,這樣客戶端就會認為是不同的檔案就會下載。

(5)企業網站快取日期案例

51CTO:1周

Sina:15天

京東:25天

淘寶:10年

2、引數位置:在server下的location標籤中設定
3、配置示例
(1)針對副檔名

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)?$ {

expires 3650d;    #10年

root html/bbs;

}

location ~ .*\.(js|css)?$ {

expires 30d;      #1月

root html/bbs;

}

(2)針對目錄

location ~ ^/(images|javascript|js|flash|media|static)/ {

expires 360d;      #1月

root html/bbs;

}

(3)針對單個檔案

location ~(robots.txt)/ {

expires 7d;

root html/bbs;

}

十一、Apache效能優化-配置expires快取功能

Apache的expires快取時間設定與配置mod_deflate壓縮模組非常相似。也是在configure時要指定,如果沒有指定,則可通過DSO安裝,在modules目錄下生成mod_expires.so檔案。

配置也非常簡單,只需在httpd.conf檔案中或對應虛擬主機VirtualHost標籤下加上如下程式碼即可。httpd.conf則在所有虛擬主機中生效,在VirtualHost標籤下則只能該站點生效。

ExpiresActive on   #開啟expires功能

ExpiresDefault "access plus 12 month"   #預設expires存12個月

ExpiresType text/html "access plus 12 month"  #指定型別

ExpiresType text/css "access plus 12 month"

ExpiresType image/gif "access plus 12 month"

ExpiresType image/jpg "access plus 12 month"

ExpiresType image/jpeg "access plus 12 month"

ExpiresType image/bmp "access plus 12 month"

ExpiresType image/png "access plus 12 month"

ExpiresType application/x-javascript "access plus 12month"

ExpiresType application/x-shockwave-flash "access plus 12month"

ExpiresType application/x-flv "access plus 12 month"

十二、Nginx效能優化-配置防爬蟲(spider)功能

由於爬蟲會影響伺服器效能,尤其是不遵守爬蟲協議的爬蟲,嚴重拖累伺服器。如果不希望網站被網路爬蟲抓取,那麼需要在該網站中申明,有如下方法:

1、方法一:修改nginx.conf,禁止網路爬蟲的ua,返回403

server {

listen 80;

server_name 127.0.0.1;

#新增如下內容即可防止爬蟲

if ($http_user_agent ~*"qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|

Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo!Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou webspider|MSNBot|ia_archiver|Tomato Bot")

{

return 403;

}

。。。。。。

}

2、方法2:網站站點根目錄下增加Robots.txt

在http://tool.chinaz.com/robots/站點可以針對現在的搜尋引擎按照想要的規則生成robots.txt檔案。

3、知識擴充套件:robots.txt爬蟲(機器人)協議

robots.txt是搜尋引擎中訪問網站的時候要檢視的第一個檔案。robots.txt檔案告訴蜘蛛程式在伺服器上什麼檔案是可以被檢視的。

當一個搜尋蜘蛛訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜尋機器人就會按照該檔案中的內容來確定訪問的範圍;如果該檔案不存在,所有的搜尋蜘蛛將能夠訪問網站上所有沒有被口令保護的頁面。百度官方建議,僅當您的網站包含不希望被搜尋引擎收錄的內容時,才需要使用robots.txt檔案。如果您希望搜尋引擎收錄網站上所有內容,請勿建立robots.txt檔案。

Robots協議是國際網際網路界通行的道德規範,基於以下原則建立:

(1)搜尋技術應服務於人類,同時尊重資訊提供者的意願,並維護其隱私權;

(2)網站有義務保護其使用者的個人資訊和隱私不被侵犯。

當然,如果搜尋引擎不遵守約定的Robots協議,那麼通過在網站下增加robots.txt也是不起作用的。(在正式環境中,可以適當允許搜尋引擎抓取收錄)

4、知識擴充套件:禁止指定的瀏覽器訪問

server {

listen 80;

server_name 127.0.0.1;

if ($http_user_agent ~*"Firefox|MSIE 8.0")  #禁止Firefox或IE8.0訪問

{

return 403;   #也可以跳到指定的頁面

}

......

}

十三、Nginx效能優化-日誌相關優化

Nginx沒有Apache的cronolog日誌分割處理的功能,預設情況是隻寫入一個日誌檔案。但可以通過nginx的訊號控制功能或reload過載功能,同進利用指令碼實現日誌的自動切割。

1、編寫指令碼實現Nginx的日誌輪詢(就是將日誌檔案改名後重啟nginx)

mkdir -p /server/scripts

cd /server/scripts

cat >>cut_nginx_log.sh <<EOF

cd /application/nginx/logs && \

/bin/mv www_access.log www_access_$(date +%F -d -1day).log

EOF

/application/nginx/sbin/nginx -s reload

2、將指令碼加入crontab每天0時定時執行

crontab -e

  #every day 0:00 exec cutngnix log

  00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh>/dev/null 2>&1

3、不記錄不需要的日誌
(1)原因

對於健康檢查或某些圖片、js、css等的日誌,一般是不需要記錄的。因為在統計PV時,是按照頁面計算,而且日誌寫入頻繁會消耗磁碟IO,降低服務效能。

(2)引數位置:在server下的location標籤中設定
(3)配置示例

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)?$ {

access_log off;

root html/www;

}

十四、Apache效能優化-不記錄不需要的日誌

1、設定位置

在httpd.conf檔案或httpd-vhosts.conf檔案中設定

2、配置示例

<FilesMatch “\.(ico|gif|jpg|swf)">

SetEnv IMAG 1   #打個標記

</FilesMatch>

CustomLog logs/access_log combinedenv=!IMAG

3、配置說明
(1)第一行中,括號中加粗的部分為檔案型別,可以自由指定,用豎線“|”隔開。
(2)第四行中,刪除線部分為日誌檔案所在路徑,根據實際情況設定;斜體為apache日誌4種記錄方式(common、combined、referer、agent)之一,根據實際需要選擇。
(3)env=!IMAG一定要加在最後。

十五、Apache效能優化-prefork模式優化

1、prefork模式和worker模式的區別

Apache一般使用worker和prefork(預設)兩種模式。worker模式是生成一個主程序和多個執行緒,由執行緒對外提供服務。prefork是生成多個程序,由程序對外提供服務。程序方式安全,但費資源。

2、prefork模式的原理

prefork使用的是多個子程序,而每個子程序只有一個執行緒,每個程序在某個確定的時間只能維持一個連線。控制程序最初建立若干個子程序,為了不在請求到來時再生成子程序,所以要根據需求不斷的建立新的子程序,最大可以達到每秒32個,直到需求為止。

3、安裝方法

在編譯過程中,加入引數--with-mpm=prefork,如果不加也可以,預設就是prefork模式。

4、檢視Apache使用的模式
(1)通過apachectl -V命令顯示編譯引數

/application/apache/bin/apachectl –V

Server version: Apache/2.2.27 (Unix)

Architecture:   32-bit

Server MPM:    Worker

...

(2)通過編譯控制檔案config.nice檢視編譯的引數

cat /application/apache/build/config.nice  #用這個檢視編譯的引數

......

"--with-mpm=worker" \

......

5、引數說明

sed -n '30,43p' httpd-mpm.conf 

# prefork MPM

# StartServers: number of server processes to start

# MinSpareServers: minimum number of server processes which are keptspare

# MaxSpareServers: maximum number of server processes which are keptspare

# MaxClients: maximum number of server processes allowed to start

# MaxRequestsPerChild: maximum number of requests a server processserves

<IfModule mpm_prefork_module>

    StartServers          5        # 服務啟動時,啟動的程序數

    MinSpareServers       5       # 最小程序數,一般要與StartServers一樣

    MaxSpareServers      10       # 最大空閒程序數

    MaxClients          150         # 最大連線數,一般就認為是Apache的最大併發數

    MaxRequestsPerChild   0       # 最大請求數,0表示不限制

</IfModule>

6、常用參考優化引數

StartServers           10

MinSpareServers        10

MaxSpareServers        15

ServerLimit             2000

MaxClients              1000

MaxRequestsPerChild   5000

7、prefork模式檢視併發數

ps -ef | grep http | wc -l

十六、Apache效能優化-worker模式優化

1、worker模式的原理

worker模式是Apache2.x新引入的模式,是執行緒與程序的結合。在worker模式下使用的是多個子程序,每個子程序有多個執行緒,每個執行緒在某個確定的時間只能維持一個連線。控制程序最初建立若干個子程序,每個子程序中以包含固定的執行緒數,各個執行緒獨立處理請求,為了不在請求到來時再生成子程序,所以要根據需求不斷的建立新的子程序。

2、安裝方法

在編譯過程中,加入引數--with-mpm=worker,如果不加預設是prefork模式。

3、引數說明

sed -n '43,59p' httpd-mpm.conf     

# worker MPM

# StartServers: initial number of server processes to start

# MaxClients: maximum number of simultaneous client connections

# MinSpareThreads: minimum number of worker threads which are keptspare

# MaxSpareThreads: maximum number of worker threads which are keptspare

# ThreadsPerChild: constant number of worker threads in each serverprocess

# MaxRequestsPerChild: maximum number of requests a server processserves

<IfModule mpm_worker_module>

    StartServers          2        # 服務啟動時,啟動的程序數

    MaxClients          150        # 併發的客戶端數

    MinSpareThreads      25      # 最小執行緒數

    MaxSpareThreads      75       # 最大空閒執行緒數

    ThreadsPerChild      25      #每個子程序所包含的執行緒

    MaxRequestsPerChild   0      #一個子程序的最大請求數,0表示不限制

</IfModule>

4、常用參考優化引數
(1)生產場景配置1

StartServers          3

MaxClients           2000

ServerLimit           25

MinSpareThreads      50

MaxSpareThreads      200

TreadLimit            200

ThreadsPerChild      100

MaxRequestsPerChild   0

(2)生產場景配置2

StartServers          5

MaxClients           9600

ServerLimit           64

MinSpareThreads      25

MaxSpareThreads      500

TreadLimit            200

ThreadsPerChild      150

MaxRequestsPerChild   0

(3)生產場景配置3

StartServers          2

MaxClients           500

ServerLimit           25

MinSpareThreads      25

MaxSpareThreads      75

TreadLimit            200

ThreadsPerChild      25

MaxRequestsPerChild   0

(4)生產場景配置4

StartServers          3

MaxClients           1600

ServerLimit           25

MinSpareThreads      50

MaxSpareThreads      200

TreadLimit            200

ThreadsPerChild      64

MaxRequestsPerChild   0

5、worker模式檢視併發數

pstree -a | grep httpd | wc -l

6、worker模式注意事項

worker模式下所能同時處理的請求總數是由子程序總數乘以Threadsperchild的值所決定的,應該大於或等於maxclients。

預設最大子程序總數為16,如果需要加大時,就需要顯示宣告serverlimit的值(該值最大為20000)。

如果顯示聲明瞭serverlimit,那麼它乘以Threadsperchild的值必須大於或等於maxclients,而且maxclients的值必須是Threadsperchild的整數倍,否則Apache將會自動調節到一個相應的值(可能是一個非期望的值)。

數學表示式:

maxclients <= serverlimit * Threadsperchild

maxclients % Threadsperchild = 0