LAMP架構深度優化

轉載地址:https://blog.51cto.com/ucode/1750564

©著作權歸作者所有:來自51CTO博客作者027ryan的原創作品,如需轉載,請註明出處,否則將追究法律責任

1、Apache worker/prefwork模式說明

在linux中,我們可以用httpd-l 查看安裝的模塊是prefork模式還是worker模式

[root@LAMP ~]# /application/apache/bin/apachectl -l|egrep "worker|prefoker"

worker.c

[root@LAMP ~]#

或者

[root@LAMP ~]# /application/apache/bin/apachectl -l |sed -n '/worker|prefork/p'

worker.c

[root@LAMP ~]#

prefork模式(默認):

prefork使用的是多個子進程,而每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接。

工作原理:

控制進程最初建立若干個子進程,爲了不在請求到來時再生成子進程,所以要根據需求不斷的創建新的子進程,最大可以達到每秒32個知道滿足需求爲止。

                    簡單表示爲:  

wKiom1bmCdujtTCJAACsn1GHGLI357.jpg

安裝方法:

在編譯的時候,加入參數--with-mpm=prefork 如果不加也可以,因爲默認的話,會採用prefork模式

優點:效率高,穩定,安全。對於線程調試困難的平臺來說,調試更加容易一些。

缺點:和worker模式相比消耗的資源多

配置參數說明:

<Ifmodule mpm_prefork_module>

StartServers 5 #--->最初建立的子進程

MinSpareServers 5 #--->最小空閒進程數,如果空閒的進程小於設定值,Apache會自動建立進程,如果服務器併發及負載大的話,可以考慮加大。

MaxSpareServers 10 #--->最大空閒進程數,如果空閒的進程大於設定值,Apache會自動kill掉多餘的進程,如果服務器負載大的話,可以考慮加大

MaxClients 150 #--->設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數,就是Apache可以同時處理的請求數,就是說如果有150個用戶在訪問,那麼151個用戶就要等之前的訪問結束後才能訪問

MaxRequestPerChild 0 #---->每個子進程可以處理的請求數。每個子進程在處理了"maxrequestsperchild"個請求後將自動銷燬,0意味着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設成非零頁有兩點好處(1)防止意外的內存泄露(2)在服務器負載下降的時候回自動減少子進程數

</Ifmodule mpm_prefork_module>

提示:在設置參數值的時候,MinSpareServers 與StartServers儘量保持一致,在prefork模式下,MaxClients被認爲是Apache的最大併發數

常用配置參考:

<IfModule mpm_prefork_module>

StartServers          10

MinSpareServers       10

MaxSpareServers       15

ServerLimit          2000

MaxClients           1000

MaxRequestsPerChild   5000

</IfModule>

prefork模式環境下,如何查看Apache的併發連接數(進程數):

具體方法如下:

[root@LAMP ~]# ps -ef|grep http|wc -l

6

[root@LAMP ~]#

worker模式:

worker模式是Apache2.x新引進的模式,是線程與進程的結合,在worker模式下會有多個子進程,每個子進程又會有多個線程。每個線程在某個確定時間只能維持一個連接。

                     簡單表示爲:

wKioL1bmDRXSrfNVAAEUF1hpmF0636.jpg

工作原理:

由主控制進程生成若干個子進程,而每個子進程中又包含固定的線程數,各個線程獨立處理請求,同樣爲了不在請求到來時再生成線程,在配置文件中設置了最小和最大空閒線程數及所有子進程的線程總數,如果現有子進程中的線程總數不能滿足併發負載,控制進程將派生新的子進程。

安裝方法:

在配置編譯的過程中,加入參數--with-mpm=worker,如果不加的話系統會採用默認的prefork模式

優點:內存佔用比prefork模式低,適合高併發高流量的HTTPD服務

缺點:假如一個線程崩潰,整個進程積極會連同其任何線程一起“死掉”。由於線程共享內存空間,所以一個程序在運行時必須被系統識別爲“每個線程都是安全的”。服務穩定性不如prefork模式。

配置說明(prefork模式):

[root@LAMP ~]# sed -n '43,58p' /application/apache/conf/extra/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 kept spare

#MaxSpareThreads: maximum number of worker threads which are kept spare

#ThreadsPerChild: constant number of worker threads in each server process

#MaxRequestsPerChild: maximum number of requests a server process serves

<IfModule mpm_worker_module>

StartServers          2

MaxClients          150

MinSpareThreads      25

MaxSpareThreads      75

ThreadsPerChild      25

MaxRequestsPerChild   0

</IfModule>

生產場景配置4:

<IfModule mpm_worker_module>

StartServers          3

MaxClients          1600

ServerLimit          25

MinSpareThreads      50

MaxSpareThreads      200

ThreadLimit          200 

ThreadsPerChild      64

MaxRequestsPerChild   0

</IfModule>

worker模式下所能同時處理的請求總數是由子進程總數乘以Threadsperchild值決定的,應該大於等於maxclients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。

提示: 默認最大的子進程總數爲16,如需加大時也需要明顯的申明serverlimit的值(最大值時20000)

查看Apache的worker下併發連接數:

[root@LAMP ~]# pstree -a|grep httpd|wc -l

84

[root@LAMP ~]#

2、web防盜鏈技術

簡單的說,就是某些不法的網站,通過在其自身網站程序裏未經許可非法調用其他網站的資源,然後在自己的網站上顯示這些調用的資源,達到了填充自身網站顯示的效果,但是浪費了調用資源網站的網絡流量,造成其他網站的帶寬及服務壓力吃緊,甚至宕機。

網站被盜鏈的解決方案:

1、根據http referer實現防盜鏈

在HTTP協議中,有一個表頭字段叫referer,使用URL格式來表示從哪裏來的鏈接到當前網頁的資源,通過referer可以檢測到目標訪問的來源網頁,如果是資源文件,可以跟蹤到顯示它的網頁地址,一單檢測出來源不是本站進行阻止或返回指定頁面。 目前Apache,nginx,lighttpd三者都支持根據http referer實現防盜鏈

2、根據cookie處理

3、通過加密變換訪問路徑實現防盜鏈lighttpd有類似的插件mod_secdownload

Apache web服務實現防盜鏈實戰

<VirtualHost *:80>

ServerAdmin [email protected]

DocumentRoot "/var/html/bbs"

ServerName ucode.blog.51cto.com

ServerAlias www.dummy-host.example.com

ErrorLog "logs/bbs-error_log"

CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%Y%m%d.log" combined

RewriteEngine On #開啓防盜鏈

RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC]

RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/$ [NC]

RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC]

RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com$ [NC]

RewriteCond .*\.(gif|jpg|swf)$ http://ucode.blog.51cto.com/img/nolink.jpg [ R,NC]

</VirtualHost>

滿足以上的黑體部分的就會返回:http://ucode.blog.51cto.com/img/nolink.jpg圖片

                    原理流程圖:

wKioL1bmEfrRLihmAAJlqSzFQ3A405.jpg

利用referer和rewrite實現Apache防盜鏈小結

通過判斷referer變量的值,來判斷圖片或資源的引用是否合法,只有在根據配置符合設定需求範圍內的referer,這樣的網站內容,才能調用訪問指定的資源內容,從而實現了資源被網站盜鏈的目的。需要注意的是:是所有的用戶代理(瀏覽器)都會設置referer變量,而且有的還可以手工修改erferer,referer是可以被僞造的,上面的配置只是一種簡單的防護手段。應付一般的盜鏈足矣。

當網站被盜鏈,一般可以採取以下措施:

a、對本站的圖片、視頻、音頻等文件標上自己的站名品牌或者相關水印;

b、設置防火牆,從源頭IP進行控制

c、設置防盜鏈(根據referer機制)

網站被非法盜鏈使用,會導致網站帶寬成本加大以及服務器壓力加大,嚴重時會導致鉅額的網站及正常用戶訪問受到影響。

##############基於LAMP(LNMP)問架構深度優化---配置文文件#################

3、修改配置文件參數實現隱藏版本號

a、nginx隱藏版本號

syntax server_tokens on|off;

在nginx配置文件中加入“server_token off;”

http

{

   .........

   server_tokens off;

   .........

}

b、Apache隱藏版本號

[root@LAMP ~]# egrep "Server|ServerS" /application/apache/conf/extra/httpd-default.conf

#This configuration file reflects default settings for Apache HTTP Server.

#ServerName directive.

#ServerTokens

#This directive configures what you return as the Server HTTP response

ServerTokens Full

#Set to "EMail" to also include a mailto: link to the ServerAdmin.

ServerSignature On

[root@LAMP ~]#

其中黑體部分改分別改爲如下:

ServerTokens Prod

ServerSignature Off

4、修改nginx/Apache的默認用戶及用戶組nobody

a、啓動nginx服務,使用的默認用戶爲nobody:

爲了防止***猜到這個用戶,我們需要更改下特殊的用戶名,提供nginx服務用。

b、更改默認用戶的方法有兩種,第一種爲:

user:nginx nginx;

設置Nginx Worker進程運行的用戶以及用戶組

useradd nginx -s /sbin/nologin -M <==不需要有系統登錄權限,應該禁止其登錄,相當於Apache裏的用戶一樣

c、更改默認用戶的方法有兩種,第一種如上面所說,第二種爲:

./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 --with-http_stub_status_module --with-http_ssl_module

提示:其實在前面編譯nginx服務時,我們就這樣帶着參數編譯的。

d、Apache默認用直接修改配置文件內容:

[root@LAMP ~]# egrep "User|Group" /application/apache/conf/httpd.conf

#User/Group: The name (or #number) of the user/group to run httpd as.

User www

Group www

補充知識:

配置nginx worker進程個數

在高併發場景,我們需要事先啓動更多的nginx進程以保證快速響應並處理用戶的請求。具體的配置參數如下:

worker_processes 8 <===指定了Nginx需要開啓的進程數,建議指定和CPU的數量相等或者乘2的進程數

work_processes 參數開始的設置可以等於cpu的個數或者核數(work_cpu_affinity參數中的配置可以指定第一個到最後一個進程分別使用的哪個cpu),進程多一些,其實提供服務就不會臨時啓動新進程提供服務,減少了系統開銷,提升了服務速度。特殊場合也可以考慮提高至CPU*2 的進程數,具體情況要跟根據實際的業務來選擇,因爲這個參數,除了CPU核數的影響外,和硬盤存儲的數據以及負載也有關。

查看linux服務器的核數的方法:

[root@LNMP application]# grep "physical id" /proc/cpuinfo

physical id : 0

physical id : 0

physical id : 1

physical id : 1

[root@LNMP application]#

可以按照physical數量設置,或者將目前數量*2

5、事件處理模型優化

nginx的連接處理機制在於不同的操作系統採用不同的IO模型,在linux使用epoll的IO多路複用模型,在FreeBSD使用kqueue的IO多路複用模型,在Solaris使用/dev/poll方式的IO多路複用模型,在Windows中使用的是icop等等。

根據系統類型不同選擇不同use[kqueue|rtsig|epoll|/dev/poll|select|poll];該參數結合系統使用,不同系統使用參數不同,我們使用的是Centos6.5,因此我們調整爲epoll模型

具體參數配置如下:

events   <====envents指令是設定nginx的工作模式及連接數上限

{

 use epoll;

 }

6、調整單個進程允許客戶端最大連接數

這個值根據根據具體服務器性能和程序的內存使用量來制定(一個進程啓動使用的內存根據程序確定)

events <====指令設定Nginx的工作模式及連接數上限

{

worker_connections 20480;

}

worker_connections也是個模塊指令,用於定義Nginx每個進程的最大連接數,默認是1024,客戶端最大連接數由worker_processes和worker_connections決定,即Max_client=worker_processes * worker_connections,進程的最大連接數受linux系統進程的最大打開文件數限制,在執行操作系統命令“umilited -HSn 65535”或者配置相應的文件後,worker_connections的設置才生效

7、配置每個進程最大文件打開數

worker_rlimit_nofile 65536;

該參數的意思爲每個進程打開的最大文件數,可以設置爲系統優化受的ulimit -HSn的結果,在第一章系統安裝時調整文件描述符和這個處理的一個問題。

詳細查閱:http://nginx.org/en/docs/ngx_core_module.html

8、優化服務器名字的hash表大小

確切名字和通配符名字存儲在哈希表中。哈希表和監聽端口關聯,每個端口都最多關聯三張表:確切的名字的哈希表,以星號()起始的通配符名字的哈希表和以星號結束的通配符名字的哈希表。哈希表的尺寸在配置階段進行了優化,可以以最小的CPU緩存命中失敗來找到名字。nginx首先搜索切確名字的的哈希表,如果沒有找到,則搜索以星號()其實的通配符名字的哈希表,如果還是沒有找到,繼續搜索以星號結束的通配符名字的哈希表。因爲名字是按照域名的節點來搜索的。所以搜索通配符名字的哈希表比搜索確切名字的哈希錶慢。注意:nginx.org存儲在通配符名字的哈希表中,而不在確切名字的哈希表中。正則表達式是一個一個串行的測試,所以是最慢的,而且不可擴展。由於上述原因,我們一般儘可能的使用確切的名字。比如如果使用nginx.org和www.nignx.org來訪問服務器是最頻繁的,那麼我們明確的定義出來對訪問搜索域名的速度效率來說更有效:

如果定義了大量名字,或者定義了非常長的名字,那就需要在php配置模塊中調整server_names_hash_max_size和server_names_hash_bucket_size的值。

server_names_hash_bucket_size的默認值可能是32,或者是64,或者是其他值,取決於CPU的緩存行的長度。如果這個值是32,那麼定義“too.long.server.name.nginx.org”作爲虛擬機主機名就會失敗,顯示如下錯誤信息:

could not build the server_names_hash,

you should increase server_names_hash_bucket_size;32

出現這種情況,那就需要設置值擴大一倍:

http{

server_names_hash_bucket_size 64;

}

9、開啓高效的文件傳輸模式

sendfile on; <====sendfile參數用戶開啓文件高效傳輸模式,同時將tcp_nopush和tcp_nodelay兩個指令設置爲on用於防止網絡阻塞。

10、設置連接的超時時間

php服務,建議希望短連接;java建議長連接

keepalive_timeout 60; 

<==設置客戶端保持會話的超時時間,超過這個時間,服務器會關閉連接。

tcp_nodelay on;

<==打開tcp_nodelay,包含了keepalive參數纔有效

client_header_timeout 15;

<==設置客戶端請求讀取超時時間,如果超過這個時間,客戶端還沒發送任何數據,Nginx將返回“Rquest timeout (408)”錯誤.

client_body_timeout 15;

<==設置客戶端請求主體讀取超時時間,如果超過這個時間,客戶端還沒發送任何數據,Nginx將返回“Request time out(408)”錯誤,默認值是60.

send_timeout 15;

<==指定響應客戶端的超時時間,這個超時時間僅限於兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連接。

11、上傳文件大小限制(動態應用)

 主配置文件里加入如下參數,具體大小根據你自己的業務做調整。

 client_max_body_size 10m;

12、fastcgi調優(配合PHP引擎動態服務)

fastcgi_connect_timeout 300;

<==指定連接到後端FastCGI的超時時間

fastcgi_send_timeout 300;

<==向Fastcgi傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。

fastcgi_read_timeout 300;

<==指定接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間

fastcgi_buffer_size 64k;

<==指定讀取FastCGI應答第一部分需要用多大的緩衝區,這個值表示將使用1個64k的緩衝區讀取應答的第一部分(應答頭),可以設置爲fastcgi_buffers 選項指定的緩衝區大小。

fastcgi_buffers 4 64k;

<==指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求,如果一個PHP腳本產生的頁面大小爲256K,那麼會爲其分配4個64KB的緩衝區來緩存;如果頁面大小大於256KB,那麼大於256KB的部分會緩存到Fastcgi_temp指定的路徑中,但是這並不是好方法;因爲內存中的數據處理速度要快於硬盤,一般這個值應該爲站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本產生的頁面大小爲256KB,那麼可以把這個值設置爲“16 16K”、“4 64K”等。

fastcgi_busy_buffers_size 128k;

<==建議爲fastcgi_buffers 的兩倍

fastcgi_temp_file_write_size 128k;

<==在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍,設置上述數值設置太小時若負載上來時能報 502 Bad Gateway

fastcgi_cache  ucode_nginx;

<==表示開啓FastCGI緩存併爲其指定一個名稱,開啓緩存非常有用,可以有效降低CPU的負載,並且防止502錯誤的發生,但是開啓緩存也可能會引起其他問題,要根據具體情況選擇。

fastcgi_cache_valid 200 302 1h;

<==用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一個小時。

fastcgi_cache_valid 301 1d;

<==將301應答緩存1天

fastcgi_cache_valid any 1m;

<==將其他應答緩存爲1分鐘

fastcgi_cache_min_uses 1;

<==緩存在fastcgi_cache_path指令inactive參數時間內的最少使用次數

13、修改nginx源碼文件進行優化:具體優化避免顯示header爲nginx和錯誤提示顯示nginx關鍵字和版本號

a、隱藏nginx作爲header頭

修改nginx源碼文件中的vim src/http/ngx_http_header_filter_module.c

wKioL1bmHYKCPg3EAAAhJff1enM597.png

光標分別移動到以下兩行(49、50)修改紅色部分關鍵字爲其他內容:

wKioL1bmHeihXyhaAAAl5p2V7x8024.png

這裏改爲Web SERVER和Web Server test

wKioL1bmL-KBIsyLAAAhojLtWy8378.png

即修改如下字段:

"Server: nginx" CRLF;

"Server: NGINX_VER"

修改爲:

"Server: Web Server" CRLF;

"Server: Web Server test"

重新編譯安裝nginx,然後啓動,通過curl -I 10.0.0.10 查看結果:

wKioL1bmKy2wLepxAAA36abgfjc198.png

b、隱藏錯誤信息避免爆出關鍵字nginx及其版本號

修改錯誤頁面信息修改文件路徑爲:

vim nginx-1.7.10/src/http/ngx_http_special_response.c

wKioL1bmN6Pi17xOAAAkm_jdyzY573.png

修改爲:

wKioL1bmN63x5cHOAAAehyhdw6A174.png

然後重新編譯、安裝、啓動nginx

wKioL1bmOD-SHJdhAAA0eWXUH6c880.png

提示:目前測試nginx版本是nginx-1.7.10,對於nginx其他版本可以根據需要修改對應參數,一般修改參數爲:

static u_char ngx_http_error_full_tail[] =

"<hr><center>"NGINX_VER"</center>" CRLF

"</body>" CRLF

"</html>" CRLF

;

static u_char ngx_http_error_tail[] =

"<hr><center>nginx</center>" CRLF

"</body>" CRLF

"</html>" CRLF

;

對應nginx-1.6版本只需要修改<center>nginx</center>即可

14、配置nginx gzip壓縮功能

nginx gzip 壓縮模塊提供了對文件內容壓縮的功能,允許nginx服務器將輸出內容在發送之到客戶端之前根據具體的策略進行壓縮,以節約網站帶寬,同時提升用戶體驗。

此功能同Apache的mod_deflate壓縮功能,依賴ngx_http_gzip_module模塊,默認已安裝,我們已經詳細介紹過壓縮功能。

常見要壓縮的的內容,如所有程序文件(js,css,html);而圖片、視頻、flash文件等文件不進行壓縮。

1、對應的壓縮參數說明如下:

 gzip on;

<==開啓gzip壓縮功能。

gzip_min_length 1k;

<==設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取,默認值是0,不管頁面多大都進行壓縮,建議設置成大於1K,如果小於1K可能會越壓縮越大。(即:大於1k才壓縮,小於1k不壓縮)

gzip_buffers 4     16k;

<==壓縮緩衝區大小。表示申請4個單位爲16k的內存作爲壓縮結果流緩存,默認值是與原始數據大小相同的內存空間來存儲gzip壓縮結果。

gzip_http_version 1.0;

<==壓縮版本(默認1.1,前端squid2.5時使用1.0)用戶設置識別http協議版本,默認是1.1,默認大部分瀏覽器已經支持GZIP

解壓,使用默認即可

gzip_comp_level 2;

<==壓縮比率。用來指定GZIP壓縮比,1壓縮比最小,處理速度最快;9壓縮比例最大,傳輸速度最快,但處理最慢,也比較消耗cpu資源。

gzip_types text/plain application/x-javascript text/css application/xml;

<==用來指定壓縮類型,“text/hmtl”類型總是會被壓縮。

gzip_vary on;

<==veray header 支持。該選項可以讓前端的緩存服務器緩存經過GZIP壓縮的頁面,例如使用squid緩存經過nginx壓縮的數據。

2、完整的配置

gzip on;

gzip_min_length 1;

gzip_buffers 4 32k;

gzip_http_version 1.1;

gzip_comp_level 9;

#gzip_types text/plain application/x-javascript text/css application/xml;

gzip_types text/html text/css text/xml application/javascript;

gzip_vary on;

更多官方資料http://nginx.org/en/docs/http/ngx_http_gzip_module.html

提示:gzip_types類型不同的版本可能會不同,對應的版本類型到文件mimes.types中查找:

在該路徑下查看當前nginx的安裝目錄下的mimes.types中查找匹配的類型:

[root@LNMP conf]# cat mime.types

types {

text/html                             html htm shtml;

text/css                              css;

text/xml                              xml;

p_w_picpath/gif                             gif;

p_w_picpath/jpeg                            jpeg jpg;

application/javascript                js;

application/atom+xml                  atom;

application/rss+xml                   rss;

text/mathml                           mml;

text/plain                            txt;

text/vnd.sun.j2me.app-descriptor      jad;

text/vnd.wap.wml                      wml;

text/x-component                      htc;

p_w_picpath/png                             png;

p_w_picpath/tiff                            tif tiff;

p_w_picpath/vnd.wap.wbmp                    wbmp;

p_w_picpath/x-icon                          ico;

p_w_picpath/x-jng                           jng;

p_w_picpath/x-ms-bmp                        bmp;

p_w_picpath/svg+xml                         svg svgz;

p_w_picpath/webp                            webp;

application/font-woff                 woff;

application/java-archive              jar war ear;

application/json                      json;

application/mac-binhex40              hqx;

application/msword                    doc;

application/pdf                       pdf;

application/postscript                ps eps ai;

application/rtf                       rtf;

application/vnd.apple.mpegurl         m3u8;

application/vnd.ms-excel              xls;

application/vnd.ms-fontobject         eot;

application/vnd.ms-powerpoint         ppt;

application/vnd.wap.wmlc              wmlc;

application/vnd.google-earth.kml+xml  kml;

application/vnd.google-earth.kmz      kmz;

application/x-7z-compressed           7z;

application/x-cocoa                   cco;

application/x-java-archive-diff       jardiff;

application/x-java-jnlp-file          jnlp;

application/x-makeself                run;

application/x-perl                    pl pm;

application/x-pilot                   prc pdb;

application/x-rar-compressed          rar;

application/x-redhat-package-manager  rpm;

application/x-sea                     sea;

application/x-shockwave-flash         swf;

application/x-stuffit                 sit;

application/x-tcl                     tcl tk;

application/x-x509-ca-cert            der pem crt;

application/x-xpinstall               xpi;

application/xhtml+xml                 xhtml;

application/xspf+xml                  xspf;

application/zip                       zip;

application/octet-stream              bin exe dll;

application/octet-stream              deb;

application/octet-stream              dmg;

application/octet-stream              iso img;

application/octet-stream              msi msp msm;

application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;

application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

audio/midi                            mid midi kar;

audio/mpeg                            mp3;

audio/ogg                             ogg;

audio/x-m4a                           m4a;

audio/x-realaudio                     ra;

video/3gpp                            3gpp 3gp;

video/mp2t                            ts;

video/mp4                             mp4;

video/mpeg                            mpeg mpg;

video/quicktime                       mov;

video/webm                            webm;

video/x-flv                           flv;

video/x-m4v                           m4v;

video/x-mng                           mng;

video/x-ms-asf                        asx asf;

video/x-ms-wmv                        wmv;

video/x-msvideo                       avi;

}

15、nginx expire緩存功能

在網站開發和運營中,對於圖片,CSS,JS等元素更改機會較少,特別是圖片,這時可以將圖片設置在瀏覽器本地緩存365天或者更長,CSS,JS,hmtl等代碼緩存10天,這樣用戶第一次打開頁面後,會在本地的瀏覽器緩存相應的上述內容,這樣緩存可以提高下次用戶打開類似頁面的加速度,並節省服務器端大量的帶寬。此功能同Apache的expire,這裏通過location的功能,將需要緩存的擴展名列出來,然後指定緩存時間。

1、根據文件擴展名進行判斷,添加expire功能範例

企業網站緩存日期案例:

1、51cto 1周

2、sina 15天

3、京東 25年

4、淘寶 10年

一般不希望被緩存的內容:

1)廣告圖片

2)網站流量統計工具

3)更新頻繁的文件(google的logo)

配置示例:

location ~.*.(gif|jpg|jpeg|png|bpm|swf)$

{

 expires  365d;

}

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

{

 expires  30d;

}

location標籤要配到server標籤裏

location ~^/(p_w_picpaths|javascript|js|css|flash|media|static)/

{

 expire 360d;

}

Nginx防蜘蛛爬蟲處理

假定一個場景:某個網站它可能不希望被網絡爬蟲抓取,例如測試環境不希望被抓取,以免對用戶造成誤導,那麼需要在該網站中申明,本站不希望被抓取。有如下方法:

方法一:修改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 web spider|MSNBot|ia_archiver|Tomato Bot")

{

return 403;

}

方法2:網站更目錄下增加Robots.txt,放在站點根目錄下。

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

知識擴展:

   robots.txt是搜索引擎中訪問網站的時候要查看的第一個文件。robots.txt文件告訴蜘蛛程序在服務器上什麼文件是可以被查看的。

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

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

1、搜索技術應服務於人類,同時尊重信息提供者的意願,並維護其隱私權;

2、網站有義務保護其使用者的個人信息和隱私不被侵犯。

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

爬蟲文件robots.txt

wKioL1bmQqbBAt7pAAAl44Fa0pE447.png

16、nginx日誌相關優化與安全

nginx沒有類似Apache的cronolog日誌分割處理的功能,但是,可以通過nginxNginx的信號控制功能或者reload重載,然後利用腳本來實現日誌的自動切割。

1、配置日誌切割腳本:

[root@masterserver conf]# cd

[root@masterserver]# mkdir -p /server/scripts/

[root@masterserver]# cd /server/scripts/

[root@masterserver scripts]# cat cut_nginx_log.sh

cd /application/nginx/logs && \

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

/application/nginx/sbin/nginx -s reload

[root@masterserver scripts]#

提示:實際上腳本的功能很簡單,就是更名日誌,然後重新加載nginx,重新生成文件記錄日誌

2、將這段腳本保存後加入到Linux的crontab守護進程,讓此腳本在每天凌晨0點執行,就可以實現日誌的每天分割功能了,操作結果如下:

[root@masterserverscripts]# crontab -l |tail -2

#cut nginx log on 00:00 everynight

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

[root@masterserver scripts]#

[root@masterserver logs]# ll

total 40

-rw-r--r-- 1 root root 1119 Mar 14 11:59 access.log

-rw-r--r-- 1 root root 1000 Mar 14 11:59 error.log

-rw-r--r-- 1 root root 6 Mar 14 11:57 nginx.pid

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-07.log

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-08.log

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-09.log

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-10.log

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-11.log

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-12.log

-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-13.log

[root@masterserver logs]#

17、不記錄不需要訪問的日誌

對於健康檢查的某些(圖片,js,css)的日誌,一般不需要記錄,因爲在統計PV時時按照頁面計算,而且日誌寫入頻繁會消耗IO,降低服務性能。具體語法如下:

 location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)${

 access_log off;

}

Apache的處理配置方法:

1、需要根據訪問日誌統計pv時

  因爲統計pv時,一個頁面纔算一個PV圖片,JS,CSS等只是圖片的元素,如果記錄了,日誌計算PV就不準確了。

配置方法:

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

    SetEnv IMAG 1

</FilesMatch>

日誌配置:

 CustomeLog "|/usr/local/sbin/cronolog /app/logs/%Y%/%m/access_%Y%m%d.log" combined env=!IMAG

 CustomeLog "|/usr/local/sbin/cronolog /app/logs/%Y%/%m/%d/%Haccess_%Y%m%d.log" combined env=!IMAG

18、訪問日誌的權限設置

假如日誌目錄爲/app/logs,則授權方法

chown -R root.root /app/logs

chown -R 700 /app/logs

nginx、Apache主進程都是用root用戶啓動,所以不給權限也可以寫入,即700程序可以往裏面寫入數據

19、根據擴展名限制程序和文件的訪問題(同樣適用於nginx)

爲了保證Apache的網站不遭受**上傳及修改文件。

安全的權限:

1、所有站點目錄的用戶和組都應該爲root,

2、所有目錄默認權限是755;

3、所有文件默認權限爲644;

注意:網站服務的用戶不能用root,

以上權限的設置可以做到防止上傳,以及修改站點文件,但是,合理的用戶上傳內容也被拒之門外了,那麼如何解決可以讓合法的用戶上傳文件又不至於被利用呢?

這就是對業務進行分離,在比較好的網站業務架構中,應該把資源文件,包括用戶上傳的圖片,附件等的服務和程序

大多數公司的不安全的授權如下:

1)chmod -R 777 /sitedir(最不安全)

2) chmod -R apache.apache /sitedir(最不安全)

如果大多數公司授權一般的授權,會給網站帶來最大的安全隱患。

20、nginx站點目錄及文件URL訪問控制

nginx下禁止訪問資源目錄下的php程序文件,配置方法如下:

範例1:nginx配置限制指定目錄下的php程序被解析

location ~ ^/p_w_picpaths/.*.(php|php5)$

{

   |deny all;

}

location ~ ^/static/.*.(php|php5)$

{

    deny all;

}

location ~ ^/data/(p_w_upload|avatar)/..(php|php5)$

{

   deny all;

}

這些目錄的限制必須寫在以下配置的前面:

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

{

fastcgi_pass 127.0.0.1:9000

fastcgi_index index.php

include fcgi.conf

}

範例2:nginx下配置禁止訪問*.txt文件

location ~* .(txt|doc)${

if (-f $request_filename){

root /data/www/www;

#rewrite ...可以重定向到某個URL

break

}

}

location ~*.(txt|doc){

root /data/www/www;

deny all;

}

21、禁止訪問指定目錄下的所有的文件和目錄

範例1:配置禁止訪問指定的單個或多個目錄

單個目錄:

location ~ ^/(static)/{

 deny all;

}

location ~ ^/static {

 deny all;

}

多個目錄:

location ~ ^ /(static|js){

 deny all;

}

22、限制來源IP訪問

使用ngx_http_acces_module限制ip訪問

範例1:禁止某目錄讓外界訪問,但允許某IP訪問該目錄,且支持PHP解析

location ~ ^ /oldboy/{

   allow 202.111.12.121;

   deny all;

}

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

}

範例2限制及指定IP或者ip段訪問

location / {

deny 192.168.1.1;

allow 192.168.1.0/24;

allow 10.1.1.0/16;

deny all;

}

參考:http://nginx.org/en/docs/http/ngx_http_access_module.html

23、禁止資源目錄解析PHP程序

方法1:提示下載不解析(針對APACHE的設置)

<Directory ~ "/application/www/etiantian/bbs/p_w_uploads">

Options FollowSymLinks

AllowOverride None

Order allow,deny

Allow from all

php_flag engine off #注意這行

</Directory>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章