LAMP 架構深度優化記錄

一、Apache worker/prefwork模式說明
javascript


在linux中,咱們能夠用httpd-l 查看安裝的模塊是prefork模式仍是worker模式php

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

  worker.chtml

[root@LAMP ~]#前端

或者java

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

  worker.clinux

[root@LAMP ~]# nginx


prefork模式(默認):
web

   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 ~]# 


二、web防盜鏈技術

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




網站被盜鏈的解決方案:

一、根據http referer實現防盜鏈

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

二、根據cookie處理

三、經過加密變換訪問路徑實現防盜鏈lighttpd有相似的插件mod_secdownload



Apache web服務實現防盜鏈實戰

<VirtualHost *:80>

    ServerAdmin ucode@gmail.com

    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)問架構深度優化---配置文文件#################


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

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


四、修改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


五、事件處理模型優化

  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;

     }


六、調整單個進程容許客戶端最大鏈接數

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

   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的設置才生效


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

   worker_rlimit_nofile 65536;

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


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


八、優化服務器名字的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;


 }


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


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



十、設置鏈接的超時時間


   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將會關閉鏈接。


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

     主配置文件里加入以下參數,具體大小根據你本身的業務作調整。


     client_max_body_size 10m;

十二、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參數時間內的最少使用次數


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


a、隱藏nginx做爲header頭

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

wKioL1bmHYKCPg3EAAAhJff1enM597.png

光標分別移動到如下兩行(4九、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>便可


1四、配置nginx gzip壓縮功能


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

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

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

  一、對應的壓縮參數說明以下:

     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壓縮的數據。


二、完整的配置


   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;

}


1五、nginx expire緩存功能


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


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


企業網站緩存日期案例:

一、51cto 1周

二、sina 15天

三、京東 25年

四、淘寶 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協議是國際互聯網界通行的道德規範,基於如下原則創建:

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

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

固然,若是搜索引擎不遵照約定的Robots協議,那麼經過在網站下增長robots.txt也是不起做用的。(在正式環境中,能夠適當容許搜索引擎抓取收錄)


爬蟲文件robots.txt

wKioL1bmQqbBAt7pAAAl44Fa0pE447.png


1六、nginx日誌相關優化與安全


 nginx沒有相似Apache的cronolog日誌分割處理的功能,可是,能夠經過nginxNginx的信號控制功能或者reload重載,而後利用腳原本實現日誌的自動切割。


  一、配置日誌切割腳本: 

[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 www_access_$(date +%F -d -1day).log

/application/nginx/sbin/nginx -s reload

[root@masterserver scripts]#

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


 二、將這段腳本保存後加入到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]# 



1七、不記錄不須要訪問的日誌

   對於健康檢查的某些(圖片,js,css)的日誌,通常不須要記錄,由於在統計PV時時按照頁面計算,並且日誌寫入頻繁會消耗IO,下降服務性能。具體語法以下:


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


     access_log off;

}


    Apache的處理配置方法:

  一、須要根據訪問日誌統計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


1八、訪問日誌的權限設置


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


chown -R root.root /app/logs

chown -R 700 /app/logs


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


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

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


 安全的權限: 

一、全部站點目錄的用戶和組都應該爲root,

二、全部目錄默認權限是755;

三、全部文件默認權限爲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;


}



2一、禁止訪問指定目錄下的全部的文件和目錄


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


單個目錄:

location ~ ^/(static)/{


     deny all;

}



location ~ ^/static {


     deny all;

}



多個目錄:


location ~ ^ /(static|js){

     deny all;


}



2二、限制來源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


2三、禁止資源目錄解析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>

相關文章
相關標籤/搜索