1. 程式人生 > >LAMP 架構深度優化記錄

LAMP 架構深度優化記錄

蜘蛛 onf man 獨立 ces 主機名 保護 記錄 爬蟲

1、Apache worker/prefwork模式說明

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

[[email protected] ~]# /application/apache/bin/apachectl -l|egrep "worker|prefoker"

worker.c

[[email protected] ~]#

或者

[[email protected] ~]# /application/apache/bin/apachectl -l |sed -n ‘/worker\|prefork/p‘

worker.c

[[email protected] ~]#

prefork模式(默認):

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

工作原理:

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

簡單表示為:

技術分享

安裝方法:

在編譯的時候,加入參數--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的並發連接數(進程數):

具體方法如下:

[[email protected] ~]# ps -ef|grep http|wc -l

6

[[email protected] ~]#

worker模式:

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

簡單表示為:

技術分享

工作原理:

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

安裝方法:

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

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

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

配置說明(prefork模式):

[[email protected] ~]# 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下並發連接數:

[[email protected] ~]# pstree -a|grep httpd|wc -l

84

[[email protected] ~]#

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圖片

原理流程圖:

技術分享

利用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隱藏版本號

[[email protected] ~]# 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

[[email protected] ~]#

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

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默認用直接修改配置文件內容:

[[email protected] ~]# 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服務器的核數的方法:

[[email protected] application]# grep "physical id" /proc/cpuinfo

physical id : 0

physical id : 0

physical id : 1

physical id : 1

[[email protected] 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

技術分享

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

技術分享

這裏改為Web SERVER和Web Server test

技術分享

即修改如下字段:

"Server: nginx" CRLF;

"Server: NGINX_VER"

修改為:

"Server: Web Server" CRLF;

"Server: Web Server test"

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

技術分享

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

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

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

技術分享

修改為:

技術分享

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

技術分享

提示:目前測試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中查找匹配的類型:

[[email protected] conf]# cat mime.types

types {

text/html html htm shtml;

text/css css;

text/xml xml;

image/gif gif;

image/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;

image/png png;

image/tiff tif tiff;

image/vnd.wap.wbmp wbmp;

image/x-icon ico;

image/x-jng jng;

image/x-ms-bmp bmp;

image/svg+xml svg svgz;

image/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 ~^/(images|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

技術分享

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

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

1、配置日誌切割腳本:

[[email protected] conf]# cd

[[email protected]]# mkdir -p /server/scripts/

[[email protected]]# cd /server/scripts/

[[email protected] scripts]# cat cut_nginx_log.sh

cd /application/nginx/logs && \

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

/application/nginx/sbin/nginx -s reload

[[email protected] scripts]#

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

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

[[email protected]]# 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

[[email protected] scripts]#

[[email protected] 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

[[email protected] 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 ~ ^/images/.*\.(php|php5)$

{

|deny all;

}

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

{

deny all;

}

location ~* ^/data/(attachment|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/attachments">

Options FollowSymLinks

AllowOverride None

Order allow,deny

Allow from all

php_flag engine off #註意這行

</Directory>

本文出自 “平平淡淡才是真” 博客,請務必保留此出處http://ucode.blog.51cto.com/10837891/1750564

LAMP 架構深度優化記錄