青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Nginx工作原理和優(yōu)化、漏洞 (轉(zhuǎn))

(peakflys注:本篇文章轉(zhuǎn)自http://blog.csdn.net/hguisu/article/details/8930668)

1.  Nginx的模塊與工作原理

Nginx由內(nèi)核和模塊組成,其中,內(nèi)核的設(shè)計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用于URL匹配),而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應(yīng)的工作。

Nginx的模塊從結(jié)構(gòu)上分為核心模塊、基礎(chǔ)模塊和第三方模塊:

核心模塊:HTTP模塊、EVENT模塊和MAIL模塊

基礎(chǔ)模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,

第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。

用戶根據(jù)自己的需要開發(fā)的模塊都屬于第三方模塊。正是有了這么多模塊的支撐,Nginx的功能才會如此強大。

Nginx的模塊從功能上分為如下三類。

Handlers(處理器模塊)。此類模塊直接處理請求,并進行輸出內(nèi)容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。

Filters (過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內(nèi)容進行修改操作,最后由Nginx輸出。

Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務(wù)比如FastCGI等進行交互,實現(xiàn)服務(wù)代理和負載均衡等功能。

圖1-1展示了Nginx模塊常規(guī)的HTTP請求和響應(yīng)的過程。


                       圖1-1展示了Nginx模塊常規(guī)的HTTP請求和響應(yīng)的過程。

Nginx本身做的工作實際很少,當它接到一個HTTP請求時,它僅僅是通過查找配置文件將此次請求映射到一個location block,而此location中所配置的各個指令則會啟動不同的模塊去完成工作,因此模塊可以看做Nginx真正的勞動工作者。通常一個location中的指令會涉及一個handler模塊和多個filter模塊(當然,多個location可以復(fù)用同一個模塊)。handler模塊負責(zé)處理請求,完成響應(yīng)內(nèi)容的生成,而filter模塊對響應(yīng)內(nèi)容進行處理。

Nginx的模塊直接被編譯進Nginx,因此屬于靜態(tài)編譯方式。啟動Nginx后,Nginx的模塊被自動加載,不像Apache,首先將模塊編譯為一個so文件,然后在配置文件中指定是否進行加載。在解析配置文件時,Nginx的每個模塊都有可能去處理某個請求,但是同一個處理請求只能由一個模塊來完成。 

在工作方式上,Nginx分為單工作進程和多工作進程兩種模式。在單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;在多工作進程模式下,每個工作進程包含多個線程。Nginx默認為單工作進程模式。

2.  Nginx+FastCGI運行原理

1、什么是 FastCGI

FastCGI是一個可伸縮地、高速地在HTTP server和動態(tài)腳本語言間通信的接口。多數(shù)流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,F(xiàn)astCGI也被許多腳本語言支持,其中就有PHP。

FastCGI是從CGI發(fā)展改進而來的。傳統(tǒng)CGI接口方式的主要缺點是性能很差,因為每次HTTP服務(wù)器遇到動態(tài)程序時都需要重新啟動腳本解析器來執(zhí)行解析,然后將結(jié)果返回給HTTP服務(wù)器。這在處理高并發(fā)訪問時幾乎是不可用的。另外傳統(tǒng)的CGI接口方式安全性也很差,現(xiàn)在已經(jīng)很少使用了。

FastCGI接口方式采用C/S結(jié)構(gòu),可以將HTTP服務(wù)器和腳本解析服務(wù)器分開,同時在腳本解析服務(wù)器上啟動一個或者多個腳本解析守護進程。當HTTP服務(wù)器每次遇到動態(tài)程序時,可以將其直接交付給FastCGI進程來執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專一地處理靜態(tài)請求或者將動態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個應(yīng)用系統(tǒng)的性能。

2、Nginx+FastCGI運行原理

Nginx不支持對外部程序的直接調(diào)用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調(diào)用。FastCGI接口在Linux下是socket(這個socket可以是文件socket,也可以是ip socket)。

wrapper:為了調(diào)用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發(fā)送給這個socket的時候,通過FastCGI接口,wrapper接收到請求,然后Fork(派生)出一個新的線程,這個線程調(diào)用解釋器或者外部程序處理腳本并讀取返回數(shù)據(jù);接著,wrapper再將返回的數(shù)據(jù)通過FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數(shù)據(jù)(html頁面或者圖片)發(fā)送給客戶端。這就是Nginx+FastCGI的整個運作過程,如圖1-3所示。

       


      所以,我們首先需要一個wrapper,這個wrapper需要完成的工作:

  1. 通過調(diào)用fastcgi(庫)的函數(shù)通過socket和ningx通信(讀寫socket是fastcgi內(nèi)部實現(xiàn)的功能,對wrapper是非透明的)
  2. 調(diào)度thread,進行fork和kill
  3. 和application(php)進行通信

3、spawn-fcgi與PHP-FPM

       FastCGI接口方式在腳本解析服務(wù)器上啟動一個或者多個守護進程對動態(tài)腳本進行解析,這些進程就是FastCGI進程管理器,或者稱為FastCGI引擎。 spawn-fcgi與PHP-FPM就是支持PHP的兩個FastCGI進程管理器。因此HTTPServer完全解放出來,可以更好地進行響應(yīng)和并發(fā)處理。
       
       spawn-fcgi與PHP-FPM的異同:
       1)spawn-fcgi是HTTP服務(wù)器lighttpd的一部分,目前已經(jīng)獨立成為一個項目,一般與lighttpd配合使用來支持PHP。但是ligttpd的spwan-fcgi在高并發(fā)訪問的時候,會出現(xiàn)內(nèi)存泄漏甚至自動重啟FastCGI的問題。即:PHP腳本處理器當機,這個時候如果用戶訪問的話,可能就會出現(xiàn)白頁(即PHP不能被解析或者出錯)。
       2)Nginx是個輕量級的HTTP server,必須借助第三方的FastCGI處理器才可以對PHP進行解析,因此其實這樣看來nginx是非常靈活的,它可以和任何第三方提供解析的處理器實現(xiàn)連接從而實現(xiàn)對PHP的解析(在nginx.conf中很容易設(shè)置)。nginx也可以使用spwan-fcgi(需要一同安裝lighttpd,但是需要為nginx避開端口,一些較早的blog有這方面安裝的教程),但是由于spawn-fcgi具有上面所述的用戶逐漸發(fā)現(xiàn)的缺陷,現(xiàn)在慢慢減少用nginx+spawn-fcgi組合了。

       由于spawn-fcgi的缺陷,現(xiàn)在出現(xiàn)了第三方(目前已經(jīng)加入到PHP core中)的PHP的FastCGI處理器PHP-FPM,它和spawn-fcgi比較起來有如下優(yōu)點:

       由于它是作為PHP的patch補丁來開發(fā)的,安裝的時候需要和php源碼一起編譯,也就是說編譯到php core中了,因此在性能方面要優(yōu)秀一些;

同時它在處理高并發(fā)方面也優(yōu)于spawn-fcgi,至少不會自動重啟fastcgi處理器。因此,推薦使用Nginx+PHP/PHP-FPM這個組合對PHP進行解析。

      相對Spawn-FCGI,PHP-FPM在CPU和內(nèi)存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監(jiān)控,而PHP-FPM則沒有這種煩惱。
       FastCGI 的主要優(yōu)點是把動態(tài)語言和HTTP Server分離開來,所以Nginx與PHP/PHP-FPM經(jīng)常被部署在不同的服務(wù)器上,以分擔(dān)前端Nginx服務(wù)器的壓力,使Nginx專一處理靜態(tài)請求和轉(zhuǎn)發(fā)動態(tài)請求,而PHP/PHP-FPM服務(wù)器專一解析PHP動態(tài)請求。

4、Nginx+PHP-FPM

      PHP-FPM是管理FastCGI的一個管理器,它作為PHP的插件存在,在安裝PHP要想使用PHP-FPM時在老php的老版本(php5.3.3之前)就需要把PHP-FPM以補丁的形式安裝到PHP中,而且PHP要與PHP-FPM版本一致,這是必須的)

   PHP-FPM其實是PHP源代碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。
   PHP5.3.3已經(jīng)集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內(nèi)存和進程、可以平滑重載PHP配置,比spawn-fcgi具有更多優(yōu)點,所以被PHP官方收錄了。在./configure的時候帶 –enable-fpm參數(shù)即可開啟PHP-FPM。

      fastcgi已經(jīng)在php5.3.5的core中了,不必在configure時添加 --enable-fastcgi了。老版本如php5.2的需要加此項。

      當我們安裝Nginx和PHP-FPM完后,配置信息:

     PHP-FPM的默認配置php-fpm.conf
     listen_address  127.0.0.1:9000 #這個表示php的fastcgi進程監(jiān)聽的ip地址以及端口
      start_servers
      min_spare_servers
      max_spare_servers

      Nginx配置運行php: 編輯nginx.conf加入如下語句:
      location ~ \.php$ {
            root html;   
            fastcgi_pass 127.0.0.1:9000; 指定了fastcgi進程偵聽的端口,nginx就是通過這里與php交互的
            fastcgi_index index.php;
            include fastcgi_params;
             fastcgi_param SCRIPT_FILENAME   /usr/local/nginx/html$fastcgi_script_name;
    }
    Nginx通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理,而這里的IP地址和端口就是FastCGI進程監(jiān)聽的IP地址和端口。
   
     其整體工作流程:
     1)、FastCGI進程管理器php-fpm自身初始化,啟動主進程php-fpm和啟動start_servers個CGI 子進程。
           主進程php-fpm主要是管理fastcgi子進程,監(jiān)聽9000端口。
           fastcgi子進程等待來自Web Server的連接。
     2)、當客戶端請求到達Web Server Nginx是時,Nginx通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理,即Nginx通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理。
      3)FastCGI進程管理器PHP-FPM選擇并連接到一個子進程CGI解釋器。Web server將CGI環(huán)境變量和標準輸入發(fā)送到FastCGI子進程。
      4)、FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關(guān)閉連接時,請求便告處理完成。
      5)、FastCGI子進程接著等待并處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。
 

3.   Nginx的IO模型

     首先nginx支持的事件模型如下(nginx的wiki):

       Nginx支持如下處理連接的方法(I/O復(fù)用方法),這些方法可以通過use指令指定。

  • select – 標準方法。 如果當前平臺沒有更有效的方法,它是編譯時默認的方法。你可以使用配置參數(shù) –with-select_module 和 –without-select_module 來啟用或禁用這個模塊。
  • poll – 標準方法。 如果當前平臺沒有更有效的方法,它是編譯時默認的方法。你可以使用配置參數(shù) –with-poll_module 和 –without-poll_module 來啟用或禁用這個模塊。
  • kqueue – 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的MacOS X系統(tǒng)使用kqueue可能會造成內(nèi)核崩潰。
  • epoll – 高效的方法,使用于Linux內(nèi)核2.6版本及以后的系統(tǒng)。在某些發(fā)行版本中,如SuSE 8.2, 有讓2.4版本的內(nèi)核支持epoll的補丁。
  • rtsig – 可執(zhí)行的實時信號,使用于Linux內(nèi)核版本2.2.19以后的系統(tǒng)。默認情況下整個系統(tǒng)中不能出現(xiàn)大于1024個POSIX實時(排隊)信號。這種情況 對于高負載的服務(wù)器來說是低效的;所以有必要通過調(diào)節(jié)內(nèi)核參數(shù) /proc/sys/kernel/rtsig-max 來增加隊列的大小。可是從Linux內(nèi)核版本2.6.6-mm2開始, 這個參數(shù)就不再使用了,并且對于每個進程有一個獨立的信號隊列,這個隊列的大小可以用 RLIMIT_SIGPENDING 參數(shù)調(diào)節(jié)。當這個隊列過于擁塞,nginx就放棄它并且開始使用 poll 方法來處理連接直到恢復(fù)正常。
  • /dev/poll – 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
  • eventport – 高效的方法,使用于 Solaris 10. 為了防止出現(xiàn)內(nèi)核崩潰的問題, 有必要安裝這個 安全補丁。

        在linux下面,只有epoll是高效的方法

        下面再來看看epoll到底是如何高效的
       Epoll是
Linux內(nèi)核為處理大批量句柄而作了改進的poll。 要使用epoll只需要這三個系統(tǒng)調(diào)用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。它是在2.5.44內(nèi)核中被引進的(epoll(4) is a new API introduced in Linux kernel 2.5.44),在2.6內(nèi)核中得到廣泛應(yīng)用。

        epoll的優(yōu)點

  • 支持一個進程打開大數(shù)目的socket描述符(FD)

        select 最不能忍受的是一個進程所打開的FD是有一定限制的,由FD_SETSIZE設(shè)置,默認值是2048。對于那些需要支持的上萬連接數(shù)目的IM服務(wù)器來說顯 然太少了。這時候你一是可以選擇修改這個宏然后重新編譯內(nèi)核,不過資料也同時指出這樣會帶來網(wǎng)絡(luò)效率的下降,二是可以選擇多進程的解決方案(傳統(tǒng)的 Apache方案),不過雖然linux上面創(chuàng)建進程的代價比較小,但仍舊是不可忽視的,加上進程間數(shù)據(jù)同步遠比不上線程間同步的高效,所以也不是一種完 美的方案。不過 epoll則沒有這個限制,它所支持的FD上限是最大可以打開文件的數(shù)目,這個數(shù)字一般遠大于2048,舉個例子,在1GB內(nèi)存的機器上大約是10萬左 右,具體數(shù)目可以cat /proc/sys/fs/file-max察看,一般來說這個數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大。

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

         傳統(tǒng)的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,不過由于網(wǎng)絡(luò)延時,任一時間只有部分的socket是”活躍”的,但 是select/poll每次調(diào)用都會線性掃描全部的集合,導(dǎo)致效率呈現(xiàn)線性下降。但是epoll不存在這個問題,它只會對”活躍”的socket進行操 作—這是因為在內(nèi)核實現(xiàn)中epoll是根據(jù)每個fd上面的callback函數(shù)實現(xiàn)的。那么,只有”活躍”的socket才會主動的去調(diào)用 callback函數(shù),其他idle狀態(tài)socket則不會,在這點上,epoll實現(xiàn)了一個”偽”AIO,因為這時候推動力在os內(nèi)核。在一些 benchmark中,如果所有的socket基本上都是活躍的—比如一個高速LAN環(huán)境,epoll并不比select/poll有什么效率,相 反,如果過多使用epoll_ctl,效率相比還有稍微的下降。但是一旦使用idle connections模擬WAN環(huán)境,epoll的效率就遠在select/poll之上了。

  • 使用mmap加速內(nèi)核與用戶空間的消息傳遞。

        這 點實際上涉及到epoll的具體實現(xiàn)了。無論是select,poll還是epoll都需要內(nèi)核把FD消息通知給用戶空間,如何避免不必要的內(nèi)存拷貝就很 重要,在這點上,epoll是通過內(nèi)核于用戶空間mmap同一塊內(nèi)存實現(xiàn)的。而如果你想我一樣從2.5內(nèi)核就關(guān)注epoll的話,一定不會忘記手工 mmap這一步的。

  • 內(nèi)核微調(diào)

         這一點其實不算epoll的優(yōu)點了,而是整個linux平臺的優(yōu)點。也許你可以懷疑linux平臺,但是你無法回避linux平臺賦予你微調(diào)內(nèi)核的能力。比如,內(nèi)核TCP/IP協(xié) 議棧使用內(nèi)存池管理sk_buff結(jié)構(gòu),那么可以在運行時期動態(tài)調(diào)整這個內(nèi)存pool(skb_head_pool)的大小— 通過echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函數(shù)的第2個參數(shù)(TCP完成3次握手 的數(shù)據(jù)包隊列長度),也可以根據(jù)你平臺內(nèi)存大小動態(tài)調(diào)整。更甚至在一個數(shù)據(jù)包面數(shù)目巨大但同時每個數(shù)據(jù)包本身大小卻很小的特殊系統(tǒng)上嘗試最新的NAPI網(wǎng)卡驅(qū)動架構(gòu)。

    (epoll內(nèi)容,參考epoll_互動百科)

 

4.   Nginx優(yōu)化

1. 編譯安裝過程優(yōu)化

1).減小Nginx編譯后的文件大小

在編譯Nginx時,默認以debug模式進行,而在debug模式下會插入很多跟蹤和ASSERT之類的信息,編譯完成后,一個Nginx要有好幾兆字節(jié)。而在編譯前取消Nginx的debug模式,編譯完成后Nginx只有幾百千字節(jié)。因此可以在編譯之前,修改相關(guān)源碼,取消debug模式。具體方法如下:

在Nginx源碼文件被解壓后,找到源碼目錄下的auto/cc/gcc文件,在其中找到如下幾行:

 

  1. # debug  
  2. CFLAGS=”$CFLAGS -g” 

注釋掉或刪掉這兩行,即可取消debug模式。

2.為特定的CPU指定CPU類型編譯優(yōu)化

在編譯Nginx時,默認的GCC編譯參數(shù)是“-O”,要優(yōu)化GCC編譯,可以使用以下兩個參數(shù):

 

  1. --with-cc-opt='-O3' 
  2. --with-cpu-opt=CPU  #為特定的 CPU 編譯,有效的值包括:
    pentium, pentiumpro, pentium3, # pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64 

要確定CPU類型,可以通過如下命令:

 

  1. [root@localhost home]#cat /proc/cpuinfo | grep "model name" 

2. 利用TCMalloc優(yōu)化Nginx的性能

TCMalloc的全稱為Thread-Caching Malloc,是谷歌開發(fā)的開源工具google-perftools中的一個成員。與標準的glibc庫的Malloc相比,TCMalloc庫在內(nèi)存分配效率和速度上要高很多,這在很大程度上提高了服務(wù)器在高并發(fā)情況下的性能,從而降低了系統(tǒng)的負載。下面簡單介紹如何為Nginx添加TCMalloc庫支持。

要安裝TCMalloc庫,需要安裝libunwind(32位操作系統(tǒng)不需要安裝)和google-perftools兩個軟件包,libunwind庫為基于64位CPU和操作系統(tǒng)的程序提供了基本函數(shù)調(diào)用鏈和函數(shù)調(diào)用寄存器功能。下面介紹利用TCMalloc優(yōu)化Nginx的具體操作過程。

1).安裝libunwind庫

可以從http://download.savannah.gnu.org/releases/libunwind下載相應(yīng)的libunwind版本,這里下載的是libunwind-0.99-alpha.tar.gz。安裝過程如下:

 

  1. [root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz  
  2. [root@localhost home]# cd libunwind-0.99-alpha/  
  3. [root@localhost libunwind-0.99-alpha]#CFLAGS=-fPIC ./configure  
  4. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC  
  5. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC install 

2).安裝google-perftools

可以從http://google-perftools.googlecode.com下載相應(yīng)的google-perftools版本,這里下載的是google-perftools-1.8.tar.gz。安裝過程如下:

 

  1. [root@localhost home]#tar zxvf google-perftools-1.8.tar.gz  
  2. [root@localhost home]#cd google-perftools-1.8/  
  3. [root@localhost google-perftools-1.8]# ./configure  
  4. [root@localhost google-perftools-1.8]#make && make install  
  5. [root@localhost google-perftools-1.8]#echo "/usr/
    local/lib" 
    > /etc/ld.so.conf.d/usr_local_lib.conf  
  6. [root@localhost google-perftools-1.8]# ldconfig 

至此,google-perftools安裝完成。

3).重新編譯Nginx

為了使Nginx支持google-perftools,需要在安裝過程中添加“–with-google_perftools_module”選項重新編譯Nginx。安裝代碼如下:

 

  1. [root@localhostnginx-0.7.65]#./configure \  
  2. >--with-google_perftools_module --with-http_stub_status_module  --prefix=/opt/nginx  
  3. [root@localhost nginx-0.7.65]#make  
  4. [root@localhost nginx-0.7.65]#make install 

到這里Nginx安裝完成。

4).為google-perftools添加線程目錄

創(chuàng)建一個線程目錄,這里將文件放在/tmp/tcmalloc下。操作如下:

 

  1. [root@localhost home]#mkdir /tmp/tcmalloc  
  2. [root@localhost home]#chmod 0777 /tmp/tcmalloc 

5).修改Nginx主配置文件

修改nginx.conf文件,在pid這行的下面添加如下代碼:

 

  1. #pid        logs/nginx.pid;  
  2. google_perftools_profiles /tmp/tcmalloc; 

接著,重啟Nginx即可完成google-perftools的加載。

6).驗證運行狀態(tài)

為了驗證google-perftools已經(jīng)正常加載,可通過如下命令查看:

 

  1. [root@ localhost home]# lsof -n | grep tcmalloc  
  2. nginx      2395 nobody   9w  REG    8,8       0    1599440 /tmp/tcmalloc.2395  
  3. nginx      2396 nobody   11w REG   8,8       0    1599443 /tmp/tcmalloc.2396  
  4. nginx      2397 nobody   13w REG  8,8        0    1599441  /tmp/tcmalloc.2397  
  5. nginx     2398 nobody    15w REG  8,8     0    1599442 /tmp/tcmalloc.2398 

由于在Nginx配置文件中設(shè)置worker_processes的值為4,因此開啟了4個Nginx線程,每個線程會有一行記錄。每個線程文件后面的數(shù)字值就是啟動的Nginx的pid值。

至此,利用TCMalloc優(yōu)化Nginx的操作完成。

3.Nginx內(nèi)核參數(shù)優(yōu)化

內(nèi)核參數(shù)的優(yōu)化,主要是在Linux系統(tǒng)中針對Nginx應(yīng)用而進行的系統(tǒng)內(nèi)核參數(shù)優(yōu)化。

下面給出一個優(yōu)化實例以供參考。

 

  1. net.ipv4.tcp_max_tw_buckets = 6000 
  2. net.ipv4.ip_local_port_range = 1024 65000  
  3. net.ipv4.tcp_tw_recycle = 1 
  4. net.ipv4.tcp_tw_reuse = 1 
  5. net.ipv4.tcp_syncookies = 1 
  6. net.core.somaxconn = 262144 
  7. net.core.netdev_max_backlog = 262144 
  8. net.ipv4.tcp_max_orphans = 262144 
  9. net.ipv4.tcp_max_syn_backlog = 262144 
  10. net.ipv4.tcp_synack_retries = 1 
  11. net.ipv4.tcp_syn_retries = 1 
  12. net.ipv4.tcp_fin_timeout = 1 
  13. net.ipv4.tcp_keepalive_time = 30 

將上面的內(nèi)核參數(shù)值加入/etc/sysctl.conf文件中,然后執(zhí)行如下命令使之生效:

  1. [root@ localhost home]#/sbin/sysctl -p 

下面對實例中選項的含義進行介紹:

net.ipv4.tcp_max_tw_buckets選項用來設(shè)定timewait的數(shù)量,默認是180 000,這里設(shè)為6000。

net.ipv4.ip_local_port_range選項用來設(shè)定允許系統(tǒng)打開的端口范圍。

net.ipv4.tcp_tw_recycle選項用于設(shè)置啟用timewait快速回收。

net.ipv4.tcp_tw_reuse選項用于設(shè)置開啟重用,允許將TIME-WAIT sockets重新用于新的TCP連接。

net.ipv4.tcp_syncookies選項用于設(shè)置開啟SYN Cookies,當出現(xiàn)SYN等待隊列溢出時,啟用cookies進行處理。

net.core.somaxconn選項的默認值是128, 這個參數(shù)用于調(diào)節(jié)系統(tǒng)同時發(fā)起的tcp連接數(shù),在高并發(fā)的請求中,默認的值可能會導(dǎo)致鏈接超時或者重傳,因此,需要結(jié)合并發(fā)請求數(shù)來調(diào)節(jié)此值。

net.core.netdev_max_backlog選項表示當每個網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時,允許發(fā)送到隊列的數(shù)據(jù)包的最大數(shù)目。

net.ipv4.tcp_max_orphans選項用于設(shè)定系統(tǒng)中最多有多少個TCP套接字不被關(guān)聯(lián)到任何一個用戶文件句柄上。如果超過這個數(shù)字,孤立連接將立即被復(fù)位并打印出警告信息。這個限制只是為了防止簡單的DoS攻擊。不能過分依靠這個限制甚至人為減小這個值,更多的情況下應(yīng)該增加這個值。

net.ipv4.tcp_max_syn_backlog選項用于記錄那些尚未收到客戶端確認信息的連接請求的最大值。對于有128MB內(nèi)存的系統(tǒng)而言,此參數(shù)的默認值是1024,對小內(nèi)存的系統(tǒng)則是128。

net.ipv4.tcp_synack_retries參數(shù)的值決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量。

net.ipv4.tcp_syn_retries選項表示在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。

net.ipv4.tcp_fin_timeout選項決定了套接字保持在FIN-WAIT-2狀態(tài)的時間。默認值是60秒。正確設(shè)置這個值非常重要,有時即使一個負載很小的Web服務(wù)器,也會出現(xiàn)大量的死套接字而產(chǎn)生內(nèi)存溢出的風(fēng)險。

net.ipv4.tcp_syn_retries選項表示在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。

如果發(fā)送端要求關(guān)閉套接字,net.ipv4.tcp_fin_timeout選項決定了套接字保持在FIN-WAIT-2狀態(tài)的時間。接收端可以出錯并永遠不關(guān)閉連接,甚至意外宕機。

net.ipv4.tcp_fin_timeout的默認值是60秒。需要注意的是,即使一個負載很小的Web服務(wù)器,也會出現(xiàn)因為大量的死套接字而產(chǎn)生內(nèi)存溢出的風(fēng)險。FIN-WAIT-2的危險性比FIN-WAIT-1要小,因為它最多只能消耗1.5KB的內(nèi)存,但是其生存期長些。

net.ipv4.tcp_keepalive_time選項表示當keepalive啟用的時候,TCP發(fā)送keepalive消息的頻度。默認值是2(單位是小時)。

4. PHP-FPM的優(yōu)化

如果您高負載網(wǎng)站使用PHP-FPMFastCGI,這些技巧也許對您有用:

1)增加FastCGI進程數(shù)

PHP FastCGI子進程數(shù)調(diào)到100或以上,4G內(nèi)存的服務(wù)器上200就可以建議通過壓力測試獲取最佳值。

2)增加 PHP-FPM打開文件描述符的限制

標簽rlimit_files用于設(shè)置PHP-FPM對打開文件描述符的限制,默認值為1024。這個標簽的值必須和Linux內(nèi)核打開文件數(shù)關(guān)聯(lián)起來,例如,要將此值設(shè)置為65 535,就必須在Linux命令行執(zhí)行“ulimit -HSn 65536”。

       然后 增加 PHP-FPM打開文件描述符的限制:
     # vi /path/to/php-fpm.conf
    找到
“<valuename="rlimit_files">1024</value>”
把1024更改為 4096或者更高
.
重啟 PHP-FPM.


         3)適當增加max_requests

    標簽max_requests指明了每個children最多處理多少個請求后便會被關(guān)閉,默認的設(shè)置是500。

    <value name="max_requests"> 500 </value>

   

5.   Nginx的php漏洞

漏洞介紹:nginx是一款高性能的web服務(wù)器,使用非常廣泛,其不僅經(jīng)常被用作反向代理,也可以非常好的支持PHP的運行。80sec發(fā)現(xiàn)其中存在一個較為嚴重的安全問題,默認情況下可能導(dǎo)致服務(wù)器錯誤的將任何類型的文件以PHP的方式進行解析,這將導(dǎo)致嚴重的安全問題,使得惡意的攻擊者可能攻陷支持php的nginx服務(wù)器。


漏洞分析:nginx默認以cgi的方式支持php的運行,譬如在配置文件當中可以以


location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

的方式支持對php的解析,location對請求進行選擇的時候會使用URI環(huán)境變量進行選擇,其中傳遞到后端Fastcgi的關(guān)鍵變量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name決定,而通過分析可以看到$fastcgi_script_name是直接由URI環(huán)境變量控制的,這里就是產(chǎn)生問題的點。而為了較好的支持PATH_INFO的提取,在PHP的配置選項里存在cgi.fix_pathinfo選項,其目的是為了從SCRIPT_FILENAME里取出真正的腳本名。
那么假設(shè)存在一個http://www.80sec.com/80sec.jpg,我們以如下的方式去訪問

http://www.80sec.com/80sec.jpg/80sec.php


將會得到一個URI

/80sec.jpg/80sec.php

經(jīng)過location指令,該請求將會交給后端的fastcgi處理,nginx為其設(shè)置環(huán)境變量SCRIPT_FILENAME,內(nèi)容為

/scripts/80sec.jpg/80sec.php

而在其他的webserver如lighttpd當中,我們發(fā)現(xiàn)其中的SCRIPT_FILENAME被正確的設(shè)置為

/scripts/80sec.jpg

所以不存在此問題。
后端的fastcgi在接受到該選項時,會根據(jù)fix_pathinfo配置決定是否對SCRIPT_FILENAME進行額外的處理,一般情況下如果不對fix_pathinfo進行設(shè)置將影響使用PATH_INFO進行路由選擇的應(yīng)用,所以該選項一般配置開啟。Php通過該選項之后將查找其中真正的腳本文件名字,查找的方式也是查看文件是否存在,這個時候?qū)⒎蛛x出SCRIPT_FILENAME和PATH_INFO分別為

/scripts/80sec.jpg和80sec.php

最后,以/scripts/80sec.jpg作為此次請求需要執(zhí)行的腳本,攻擊者就可以實現(xiàn)讓nginx以php來解析任何類型的文件了。

POC: 訪問一個nginx來支持php的站點,在一個任何資源的文件如robots.txt后面加上/80sec.php,這個時候你可以看到如下的區(qū)別:

訪問http://www.80sec.com/robots.txt

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes

訪問訪問http://www.80sec.com/robots.txt/80sec.php

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6

其中的Content-Type的變化說明了后端負責(zé)解析的變化,該站點就可能存在漏洞。

漏洞廠商:http://www.nginx.org

解決方案:

我們已經(jīng)嘗試聯(lián)系官方,但是此前你可以通過以下的方式來減少損失

關(guān)閉cgi.fix_pathinfo為0

或者

if ( $fastcgi_script_name ~ ..*/.*php ) {
return 403;
}

PS: 鳴謝laruence大牛在分析過程中給的幫助

posted on 2014-12-03 16:50 peakflys 閱讀(182) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

導(dǎo)航

統(tǒng)計

公告

人不淡定的時候,就愛表現(xiàn)出來,敲代碼如此,偶爾的靈感亦如此……

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜在线一区| 亚洲啪啪91| 午夜精品视频网站| 亚洲一区二区三区四区中文| 国产精品白丝jk黑袜喷水| 亚洲一区在线视频| 香蕉成人啪国产精品视频综合网| 国产麻豆精品theporn| 久久riav二区三区| 久久精品亚洲热| 亚洲日本va在线观看| 一卡二卡3卡四卡高清精品视频| 国产精品久久激情| 久久久久久久波多野高潮日日| 久久中文久久字幕| 在线亚洲一区观看| 久久er精品视频| 一区二区三区成人| 欧美一进一出视频| 日韩午夜电影av| 性18欧美另类| 在线天堂一区av电影| 性欧美大战久久久久久久久| 亚洲大片一区二区三区| 一本一本久久a久久精品综合麻豆| 国产欧美日本| 亚洲三级影院| 国产亚洲精品久| 亚洲精品资源| 在线播放中文一区| 亚洲性视频网站| 亚洲精品在线电影| 久久精品国产精品亚洲综合| 一本色道**综合亚洲精品蜜桃冫| 亚洲欧美日韩精品久久久久| 99热在线精品观看| 久久久久久久久久久久久久一区| 制服诱惑一区二区| 欧美成人一区二区三区在线观看| 久久国产精彩视频| 欧美日韩亚洲一区二区三区在线 | 欧美日韩国产免费| 久久久亚洲一区| 国产女主播视频一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产伦精品免费视频| 亚洲精品一区二区在线观看| 在线观看一区二区精品视频| 亚洲专区一区| 亚洲欧美视频在线观看| 欧美日韩成人在线观看| 亚洲二区在线视频| 亚洲在线黄色| 亚洲国产精品一区二区www| 亚洲视频在线观看免费| 欧美人成网站| 欧美一级在线亚洲天堂| 欧美激情亚洲| 亚洲欧美日韩一区二区在线| 国产视频一区免费看| 欧美风情在线| 欧美专区在线观看| 亚洲国内自拍| 亚洲国产影院| 亚洲中无吗在线| 尤物九九久久国产精品的分类| 午夜精品久久久| 欧美在线视频一区二区| 国产精品五区| 欧美主播一区二区三区美女 久久精品人 | 在线一区二区日韩| 中文av字幕一区| 国产精品久久久久久一区二区三区 | 欧美激情五月| 亚洲精品人人| 欧美天天在线| 午夜精品久久99蜜桃的功能介绍| 欧美在线一区二区| 黄色亚洲精品| 欧美激情aⅴ一区二区三区| 亚洲日韩中文字幕在线播放| 亚洲精选在线| 国产精品毛片大码女人| 欧美在线啊v一区| 欧美成人免费va影院高清| 亚洲免费成人av| 国产精品草莓在线免费观看| 午夜视频在线观看一区二区| 久久人人九九| 一本在线高清不卡dvd| 国产精品一区亚洲| 你懂的视频一区二区| 日韩特黄影片| 久久综合九九| 这里只有精品丝袜| 国产在线观看精品一区二区三区 | 一本大道久久a久久精二百| 欧美资源在线| 99re8这里有精品热视频免费 | 国产亚洲午夜| 欧美精品三级日韩久久| 欧美国产一区视频在线观看| 久久噜噜亚洲综合| 99精品国产热久久91蜜凸| 国产精品久久久久9999高清| 久久精品观看| 亚洲一区免费网站| 亚洲第一页在线| 午夜精品一区二区三区电影天堂| 亚洲国产高清aⅴ视频| 国产精品高潮呻吟久久| 免费久久99精品国产自在现线| 亚洲午夜激情网站| 亚洲精品国产精品国自产观看| 久久久久久久网站| 亚洲欧美国产不卡| 亚洲精品日韩在线观看| 激情欧美日韩一区| 国产毛片精品国产一区二区三区| 欧美国产第二页| 久久久美女艺术照精彩视频福利播放| 中文在线资源观看网站视频免费不卡 | 国内激情久久| 国产乱人伦精品一区二区| 欧美日韩精品中文字幕| 久久久久一本一区二区青青蜜月| 亚洲已满18点击进入久久| 亚洲精品中文字幕在线| 亚洲福利电影| 欧美成人首页| 欧美www视频| 久久亚洲精选| 美女精品视频一区| 久久婷婷国产麻豆91天堂| 久久精品91久久久久久再现| 亚洲自拍都市欧美小说| 一本久道久久综合狠狠爱| 亚洲日本成人网| 亚洲美女在线国产| 亚洲精选一区二区| 一区二区三区四区五区精品视频| 亚洲理伦电影| 日韩午夜三级在线| 在线亚洲自拍| 欧美一区二区三区免费观看视频 | 久久久亚洲人| 麻豆精品国产91久久久久久| 美女999久久久精品视频| 久久综合九色九九| 欧美激情aⅴ一区二区三区| 免费观看成人www动漫视频| 免费中文日韩| 亚洲国产精品久久久久秋霞蜜臀 | 日韩午夜激情| 亚洲欧美在线磁力| 久久精品噜噜噜成人av农村| 久久先锋资源| 欧美日韩不卡一区| 国产精品一区二区在线观看不卡| 国产精品女主播| 国内精品免费午夜毛片| 亚洲国产一区二区在线| 一区二区三区精品视频| 欧美一区1区三区3区公司| 久久久久欧美精品| 亚洲国产精品成人综合| 99精品欧美一区二区蜜桃免费| 亚洲一区在线观看视频| 久久精品最新地址| 欧美精品一区二区三区很污很色的 | 欧美69视频| 欧美三级中文字幕在线观看| 国产精品免费久久久久久| 红桃视频成人| 在线亚洲电影| 久久色在线播放| 日韩一级精品| 久久久久久久久综合| 欧美日韩一区二区精品| 国产综合婷婷| 在线亚洲精品福利网址导航| 久久久av毛片精品| 亚洲欧洲在线视频| 欧美亚洲一区| 欧美视频久久| 亚洲黄色精品| 久久久蜜臀国产一区二区| 91久久久久久久久久久久久| 欧美一级久久久久久久大片| 欧美精品免费在线| 狠狠88综合久久久久综合网| 亚洲午夜一区二区| 欧美大秀在线观看| 午夜一区二区三视频在线观看| 欧美精品色网| 亚洲国产精品福利| 久久久国产精品一区二区三区| 日韩一级网站| 欧美韩日一区二区| 亚洲国产精品一区二区www|