日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

服务器 启动多个nginx_Nginx工作原理和优化总结

發布時間:2023/12/10 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 服务器 启动多个nginx_Nginx工作原理和优化总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NGINX以高性能的負載均衡器,緩存,和web服務器聞名,驅動了全球超過 40% 最繁忙的網站。

在大多數場景下,默認的 NGINX 和 Linux 設置可以很好的工作,但要達到最佳性能,有些時候必須做些調整。首先我們先了解其工作原理。

一、Nginx的模塊與工作原理

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

Nginx的模塊從結構上分為核心模塊、基礎模塊和第三方模塊:

  • 核心模塊:HTTP模塊、EVENT模塊和MAIL模塊。
  • 基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊。
  • 第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。

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

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

  • Handlers(處理器模塊)。此類模塊直接處理請求,并進行輸出內容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。
  • Filters (過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最后由Nginx輸出。
  • Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能。

圖1-1展示了Nginx模塊常規的HTTP請求和響應的過程

Nginx本身做的工作實際很少,當它接到一個HTTP請求時,它僅僅是通過查找配置文件將此次請求映射到一個location block,而此location中所配置的各個指令則會啟動不同的模塊去完成工作,因此模塊可以看做Nginx真正的勞動工作者。

通常一個location中的指令會涉及一個handler模塊和多個filter模塊(當然,多個location可以復用同一個模塊)。handler模塊負責處理請求,完成響應內容的生成,而filter模塊對響應內容進行處理。

Nginx的模塊直接被編譯進Nginx,因此屬于靜態編譯方式。啟動Nginx后,Nginx的模塊被自動加載,不像Apache,首先將模塊編譯為一個so文件,然后在配置文件中指定是否進行加載。

在解析配置文件時,Nginx的每個模塊都有可能去處理某個請求,但是同一個處理請求只能由一個模塊來完成。?

二、Nginx的進程模型

在工作方式上,Nginx分為單工作進程和多工作進程兩種模式。

  • 在單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;在多工作進程模式下,每個工作進程包含多個線程。

  • Nginx默認為單工作進程模式。

  • Nginx在啟動后,會有一個master進程和多個worker進程。

master進程

主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出后(異常情況下),會自動重新啟動新的worker進程。

master進程充當整個進程組與用戶的交互接口,同時對進程進行監護。

它不需要處理網絡事件,不負責業務的執行,只會通過管理worker進程來實現重啟服務、平滑升級、更換日志文件、配置文件實時生效等功能。

我們要控制nginx,只需要通過kill向master進程發送信號就行了。

比如kill -HUP pid,則是告訴nginx,從容地重啟nginx,我們一般用這個信號來重啟nginx,或重新加載配置,因為是從容地重啟,因此服務是不中斷的。

master進程在接收到HUP信號后是怎么做的呢?

首先master進程在接到信號后,會先重新加載配置文件,然后再啟動新的worker進程,并向所有老的worker進程發送信號,告訴他們可以光榮退休了。

新的worker在啟動后,就開始接收新的請求,而老的worker在收到來自master的信號后,就不再接收新的請求,并且在當前進程中的所有未處理完的請求處理完成后,再退出。

當然,直接給master進程發送信號,這是比較老的操作方式,nginx在0.8版本之后,引入了一系列命令行參數,來方便我們管理。比如,./nginx -s reload,就是來重啟nginx,./nginx -s stop,就是來停止nginx的運行。

如何做到的呢?

我們還是拿reload來說,我們看到,執行命令時,我們是啟動一個新的nginx進程,而新的nginx進程在解析到reload參數后,就知道我們的目的是控制nginx來重新加載配置文件了,它會向master進程發送信號,然后接下來的動作,就和我們直接向master進程發送信號一樣了。

worker進程:

而基本的網絡事件,則是放在worker進程中來處理了。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。

一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。

worker進程的個數是可以設置的,一般我們會設置與機器cpu核數一致,這里面的原因與nginx的進程模型以及事件處理模型是分不開的。

worker進程之間是平等的,每個進程,處理請求的機會也是一樣的。當我們提供80端口的http服務時,一個連接請求過來,每個進程都有可能處理這個連接,怎么做到的呢?

首先,每個worker進程都是從master進程fork過來,在master進程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多個worker進程。

所有worker進程的listenfd會在新連接到來時變得可讀,為保證只有一個進程處理該連接,所有worker進程在注冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程注冊listenfd讀事件,在讀事件里調用accept接受該連接。

當一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。

我們可以看到,一個請求,完全由worker進程來處理,而且只在一個worker進程中處理。worker進程之間是平等的,每個進程,處理請求的機會也是一樣的。當我們提供80端口的http服務時,一個連接請求過來,每個進程都有可能處理這個連接,怎么做到的呢?

首先,每個worker進程都是從master進程fork過來,在master進程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多個worker進程。

所有worker進程的listenfd會在新連接到來時變得可讀,為保證只有一個進程處理該連接,所有worker進程在注冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程注冊listenfd讀事件,在讀事件里調用accept接受該連接。

當一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。我們可以看到,一個請求,完全由worker進程來處理,而且只在一個worker進程中處理。

nginx的進程模型,可以由下圖來表示:

三、Nginx+FastCGI運行原理

1.什么是 FastCGI

FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通信的接口。

多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同時,FastCGI也被許多腳本語言支持,其中就有PHP。

FastCGI是從CGI發展改進而來的。

傳統CGI接口方式的主要缺點是性能很差,因為每次HTTP服務器遇到動態程序時都需要重新啟動腳本解析器來執行解析,然后將結果返回給HTTP服務器。這在處理高并發訪問時幾乎是不可用的。

另外傳統的CGI接口方式安全性也很差,現在已經很少使用了。

FastCGI接口方式采用C/S結構,可以將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。

當HTTP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。

這種方式可以讓HTTP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。

2.Nginx+FastCGI運行原理

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

wrapper:為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。

  • 當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接收到請求,然后Fork(派生)出一個新的線程,這個線程調用解釋器或者外部程序處理腳本并讀取返回數據;
  • 接著,wrapper再將返回的數據通過FastCGI接口,沿著固定的socket傳遞給Nginx;
  • 最后,Nginx將返回的數據(html頁面或者圖片)發送給客戶端。

這就是Nginx+FastCGI的整個運作過程,如圖1-3所示。

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

  • 通過調用fastcgi(庫)的函數通過socket和ningx通信(讀寫socket是fastcgi內部實現的功能,對wrapper是非透明的)
  • 調度thread,進行fork和kill
  • 和application(php)進行通信

3.spawn-fcgi與PHP-FPM

FastCGI接口方式在腳本解析服務器上啟動一個或者多個守護進程對動態腳本進行解析,這些進程就是FastCGI進程管理器,或者稱為FastCGI引擎。

spawn-fcgi與PHP-FPM就是支持PHP的兩個FastCGI進程管理器。因此HTTPServer完全解放出來,可以更好地進行響應和并發處理。

spawn-fcgi與PHP-FPM的異同:

①spawn-fcgi是HTTP服務器lighttpd的一部分,目前已經獨立成為一個項目,一般與lighttpd配合使用來支持PHP。

但是ligttpd的spwan-fcgi在高并發訪問的時候,會出現內存泄漏甚至自動重啟FastCGI的問題。

即:PHP腳本處理器當機,這個時候如果用戶訪問的話,可能就會出現白頁(即PHP不能被解析或者出錯)。

②Nginx是個輕量級的HTTP server,必須借助第三方的FastCGI處理器才可以對PHP進行解析,因此其實這樣看來nginx是非常靈活的,它可以和任何第三方提供解析的處理器實現連接從而實現對PHP的解析(在nginx.conf中很容易設置)。

nginx也可以使用spwan-fcgi(需要一同安裝lighttpd,但是需要為nginx避開端口,一些較早的blog有這方面安裝的教程),但是由于spawn-fcgi具有上面所述的用戶逐漸發現的缺陷,現在慢慢減少用nginx+spawn-fcgi組合了。

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

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

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

  • 相對Spawn-FCGI,PHP-FPM在CPU和內存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。

  • FastCGI 的主要優點是把動態語言和HTTP Server分離開來,所以Nginx與PHP/PHP-FPM經常被部署在不同的服務器上,以分擔前端Nginx服務器的壓力,使Nginx專一處理靜態請求和轉發動態請求,而PHP/PHP-FPM服務器專一解析PHP動態請求。

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已經集成php-fpm了,不再是第三方的包了。

PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置,比spawn-fcgi具有更多優點,所以被PHP官方收錄了。在./configure的時候帶 –enable-fpm參數即可開啟PHP-FPM。

?fastcgi已經在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進程監聽的ip地址以及端口start_serversmin_spare_serversmax_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進程監聽的IP地址和端口。

其整體工作流程:

①FastCGI進程管理器php-fpm自身初始化,啟動主進程php-fpm和啟動start_servers個CGI 子進程。

主進程php-fpm主要是管理fastcgi子進程,監聽9000端口。

fastcgi子進程等待來自Web Server的連接。

②當客戶端請求到達Web Server Nginx是時,Nginx通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理,即Nginx通過location指令,將所有以php為后綴的文件都交給127.0.0.1:9000來處理。

③FastCGI進程管理器PHP-FPM選擇并連接到一個子進程CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程。

④FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。

⑤FastCGI子進程接著等待并處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。

四、Nginx+PHP正確配置

一般web都做統一入口:把PHP請求都發送到同一個文件上,然后在此文件里通過解析「REQUEST_URI」實現路由。

Nginx配置文件分為好多塊,常見的從外到內依次是「http」、「server」、「location」等等,缺省的繼承關系是從外到內,也就是說內層塊會自動獲取外層塊的值作為缺省值。

例如:

server { listen 80; server_name foo.com; root /path; location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite . /index.php last; } } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; }}

1??不應該在location 模塊定義index

?一旦未來需要加入新的「location」,必然會出現重復定義的「index」指令,這是因為多個「location」是平級的關系,不存在繼承,此時應該在「server」里定義「index」,借助繼承關系,「index」指令在所有的「location」中都能生效。

2??使用try_files

接下來看看「if」指令,說它是大家誤解最深的Nginx指令毫不為過:

if (!-e $request_filename) {rewrite . /index.php last;}

很多人喜歡用「if」指令做一系列的檢查,不過這實際上是「try_files」指令的職責:

try_files $uri $uri/ /index.php;

除此以外,初學者往往會認為「if」指令是內核級的指令,但是實際上它是rewrite模塊的一部分,加上Nginx配置實際上是聲明式的,而非過程式的,所以當其和非rewrite模塊的指令混用時,結果可能會非你所愿。

3??fastcgi_params」配置文件:

include fastcgi_params;

Nginx有兩份fastcgi配置文件,分別是「fastcgi_params」和「fastcgi.conf」,它們沒有太大的差異,唯一的區別是后者比前者多了一行「SCRIPT_FILENAME」的定義:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

注意:$document_root 和 $fastcgi_script_name 之間沒有 /。

原本Nginx只有「fastcgi_params」,后來發現很多人在定義「SCRIPT_FILENAME」時使用了硬編碼的方式,于是為了規范用法便引入了「fastcgi.conf」。

不過這樣的話就產生一個疑問:為什么一定要引入一個新的配置文件,而不是修改舊的配置文件?

  • 這是因為「fastcgi_param」指令是數組型的。

  • 和普通指令相同的是:內層替換外層;

  • 和普通指令不同的是:當在同級多次使用的時候,是新增而不是替換。

換句話說,如果在同級定義兩次「SCRIPT_FILENAME」,那么它們都會被發送到后端,這可能會導致一些潛在的問題,為了避免此類情況,便引入了一個新的配置文件。

此外,我們還需要考慮一個安全問題:在PHP開啟「cgi.fix_pathinfo」的情況下,PHP可能會把錯誤的文件類型當作PHP文件來解析。

如果Nginx和PHP安裝在同一臺服務器上的話,那么最簡單的解決方法是用「try_files」指令做一次過濾:

try_files $uri =404;

依照前面的分析,給出一份改良后的版本,是不是比開始的版本清爽了很多:

server { listen 80; server_name foo.com; root /path; index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { try_files $uri =404; include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; }}

五、Nginx為啥性能高-多進程IO模型

1.nginx采用多進程模型好處

首先,對于每個worker進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便很多。

其次,采用獨立的進程,可以讓互相之間不會影響,一個進程退出后,其它進程還在工作,服務不會中斷,master進程則很快啟動新的worker進程。當然,worker進程的異常退出,肯定是程序有bug了,異常退出,會導致當前worker上的所有請求失敗,不過不會影響到所有請求,所以降低了風險。

2.nginx多進程事件模型:異步非阻塞

雖然nginx采用多worker的方式來處理請求,每個worker里面只有一個主線程,那能夠處理的并發數很有限啊,多少個worker就能處理多少個并發,何來高并發呢?

非也,這就是nginx的高明之處,nginx采用了異步非阻塞的方式來處理請求,也就是說,nginx是可以同時處理成千上萬個請求的。

一個worker進程可以同時處理的請求數只受限于內存大小,而且在架構設計上,不同的worker進程之間處理并發請求時幾乎沒有同步鎖的限制,worker進程通常不會進入睡眠狀態。

因此,當Nginx上的進程數與CPU核心數相等時(最好每一個worker進程都綁定特定的CPU核心),進程間切換的代價是最小的。

而apache的常用工作方式(apache也有異步非阻塞版本,但因其與自帶某些模塊沖突,所以不常用),每個進程在一個時刻只處理一個請求,因此,當并發數上到幾千時,就同時有幾千的進程在處理請求了。

這對操作系統來說,是個不小的挑戰,進程帶來的內存占用非常大,進程的上下文切換帶來的cpu開銷很大,自然性能就上不去了,而這些開銷完全是沒有意義的。

為什么nginx可以采用異步非阻塞的方式來處理呢,或者異步非阻塞到底是怎么回事呢?

我們先回到原點,看看一個請求的完整過程:

首先,請求過來,要建立連接,然后再接收數據,接收數據后,再發送數據。

具體到系統底層,就是讀寫事件,而當讀寫事件沒有準備好時,必然不可操作,如果不用非阻塞的方式來調用,那就得阻塞調用了,事件沒有準備好,那就只能等了,等事件準備好了,你再繼續吧。

阻塞調用會進入內核等待,cpu就會讓出去給別人用了,對單線程的worker來說,顯然不合適,當網絡事件越多時,大家都在等待呢,cpu空閑下來沒人用,cpu利用率自然上不去了,更別談高并發了。

好吧,你說加進程數,這跟apache的線程模型有什么區別,注意,別增加無謂的上下文切換。

所以,在nginx里面,最忌諱阻塞的系統調用了。不要阻塞,那就非阻塞嘍。

非阻塞就是,事件沒有準備好,馬上返回EAGAIN,告訴你,事件還沒準備好呢,你慌什么,過會再來吧。

好吧,你過一會,再來檢查一下事件,直到事件準備好了為止,在這期間,你就可以先去做其它事情,然后再來看看事件好了沒。

雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做更多的事情了,但帶來的開銷也是不小的。

關于IO模型

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

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

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

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

  • kqueue– 高效的方法,使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰。

  • epoll – 高效的方法,使用于Linux內核2.6版本及以后的系統。在某些發行版本中,如SuSE 8.2, 有讓2.4版本的內核支持epoll的補丁。

  • rtsig – 可執行的實時信號,使用于Linux內核版本2.2.19以后的系統。默認情況下整個系統中不能出現大于1024個POSIX實時(排隊)信號。這種情況 對于高負載的服務器來說是低效的;所以有必要通過調節內核參數 /proc/sys/kernel/rtsig-max 來增加隊列的大小??墒菑腖inux內核版本2.6.6-mm2開始, 這個參數就不再使用了,并且對于每個進程有一個獨立的信號隊列,這個隊列的大小可以用 RLIMIT_SIGPENDING 參數調節。當這個隊列過于擁塞,nginx就放棄它并且開始使用 poll 方法來處理連接直到恢復正常。

  • /dev/poll – 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.

  • eventport – 高效的方法,使用于 Solaris 10. 為了防止出現內核崩潰的問題, 有必要安裝這個 安全補丁。

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

Epoll是Linux內核為處理大批量句柄而作了改進的poll。

要使用epoll只需要這三個系統調用:epoll_create(2), epoll_ctl(2), epoll_wait(2)。

它是在2.5.44內核中被引進的(epoll(4) is a new API introduced in Linux kernel 2.5.44),在2.6內核中得到廣泛應用。

epoll的優點

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

select 最不能忍受的是一個進程所打開的FD是有一定限制的,由FD_SETSIZE設置,默認值是2048。對于那些需要支持的上萬連接數目的IM服務器來說顯 然太少了。

這時候你一是可以選擇修改這個宏然后重新編譯內核,不過資料也同時指出這樣會帶來網絡效率的下降,二是可以選擇多進程的解決方案(傳統的 Apache方案),不過雖然linux上面創建進程的代價比較小,但仍舊是不可忽視的,加上進程間數據同步遠比不上線程間同步的高效,所以也不是一種完 美的方案。

不過 epoll則沒有這個限制,它所支持的FD上限是最大可以打開文件的數目,這個數字一般遠大于2048,舉個例子,在1GB內存的機器上大約是10萬左 右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個數目和系統內存關系很大。

  • 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之上了。

  • 使用mmap加速內核與用戶空間的消息傳遞。

這 點實際上涉及到epoll的具體實現了。

無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很 重要,在這點上,epoll是通過內核于用戶空間mmap同一塊內存實現的。

而如果你想我一樣從2.5內核就關注epoll的話,一定不會忘記手工 mmap這一步的。

  • 內核微調

這一點其實不算epoll的優點了,而是整個linux平臺的優點。也許你可以懷疑linux平臺,但是你無法回避linux平臺賦予你微調內核的能力。

比如,內核TCP/IP協 議棧使用內存池管理sk_buff結構,那么可以在運行時期動態調整這個內存pool(skb_head_pool)的大小— 通過echo XXXX>/proc/sys/net/core/hot_list_length完成。

再比如listen函數的第2個參數(TCP完成3次握手 的數據包隊列長度),也可以根據你平臺內存大小動態調整。

更甚至在一個數據包面數目巨大但同時每個數據包本身大小卻很小的特殊系統上嘗試最新的NAPI網卡驅動架構。

推薦設置worker的個數為cpu的核數,在這里就很容易理解了,更多的worker數,只會導致進程來競爭cpu資源了,從而帶來不必要的上下文切換。

而且,nginx為了更好的利用多核特性,提供了cpu親緣性的綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因為進程的切換帶來cache的失效。

像這種小的優化在nginx中非常常見,同時也說明了nginx作者的苦心孤詣。

比如,nginx在做4個字節的字符串比較時,會將4個字符轉換成一個int型,再作比較,以減少cpu的指令數等等。

代碼來總結一下nginx的事件處理模型:

while (true) { for t in run_tasks: t.handler(); update_time(&now); timeout = ETERNITY; for t in wait_tasks: /* sorted already */ if (t.time <= now) { t.timeout_handler(); } else { timeout = t.time - now; break; } nevents = poll_function(events, timeout); for i in nevents: task t; if (events[i].type == READ) { t.handler = read_handler; } else { /* events[i].type == WRITE */ t.handler = write_handler; } run_tasks_add(t);}

六、Nginx優化

1.編譯安裝過程優化

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

在編譯Nginx時,默認以debug模式進行,而在debug模式下會插入很多跟蹤和ASSERT之類的信息,編譯完成后,一個Nginx要有好幾兆字節。

而在編譯前取消Nginx的debug模式,編譯完成后Nginx只有幾百千字節。因此可以在編譯之前,修改相關源碼,取消debug模式。

具體方法如下:

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

# debug CFLAGS=”$CFLAGS -g”

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

2.為特定的CPU指定CPU類型編譯優化

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

①--with-cc-opt='-O3'?

②--with-cpu-opt=CPU ?#為特定的 CPU 編譯,有效的值包括:

pentium, pentiumpro, pentium3, # pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

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

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

2. 利用TCMalloc優化Nginx的性能

TCMalloc的全稱為Thread-Caching Malloc,是谷歌開發的開源工具google-perftools中的一個成員。

與標準的glibc庫的Malloc相比,TCMalloc庫在內存分配效率和速度上要高很多,這在很大程度上提高了服務器在高并發情況下的性能,從而降低了系統的負載。

下面簡單介紹如何為Nginx添加TCMalloc庫支持。

要安裝TCMalloc庫,需要安裝libunwind(32位操作系統不需要安裝)和google-perftools兩個軟件包,libunwind庫為基于64位CPU和操作系統的程序提供了基本函數調用鏈和函數調用寄存器功能。

下面介紹利用TCMalloc優化Nginx的具體操作過程。

①安裝libunwind庫

可以從http://download.savannah.gnu.org/releases/libunwind下載相應的libunwind版本,這里下載的是libunwind-0.99-alpha.tar.gz。

安裝過程如下:

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

②.安裝google-perftools

可以從http://google-perftools.googlecode.com下載相應的google-perftools版本,這里下載的是google-perftools-1.8.tar.gz。

安裝過程如下:

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

至此,google-perftools安裝完成。

③重新編譯Nginx

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

安裝代碼如下:

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

到這里Nginx安裝完成。

④為google-perftools添加線程目錄

創建一個線程目錄,這里將文件放在/tmp/tcmalloc下。

操作如下:

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

⑤修改Nginx主配置文件

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

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

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

⑥驗證運行狀態

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

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

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

至此,利用TCMalloc優化Nginx的操作完成。

3.Nginx內核參數優化

內核參數的優化,主要是在Linux系統中針對Nginx應用而進行的系統內核參數優化。下面給出一個優化實例以供參考。

net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 net.core.somaxconn = 262144 net.core.netdev_max_backlog = 262144 net.ipv4.tcp_max_orphans = 262144 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30

將上面的內核參數值加入/etc/sysctl.conf文件中,然后執行如下命令使之生效:

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

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

TCP參數設置:

  • net.ipv4.tcp_max_tw_buckets :選項用來設定timewait的數量,默認是180 000,這里設為6000。

  • net.ipv4.ip_local_port_range:選項用來設定允許系統打開的端口范圍。在高并發情況否則端口號會不夠用。當NGINX充當代理時,每個到上游服務器的連接都使用一個短暫或臨時端口。

  • net.ipv4.tcp_tw_recycle:選項用于設置啟用timewait快速回收.

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

  • net.ipv4.tcp_syncookies:選項用于設置開啟SYN Cookies,當出現SYN等待隊列溢出時,啟用cookies進行處理。

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

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

  • net.ipv4.tcp_synack_retries參數的值決定了內核放棄連接之前發送SYN+ACK包的數量。

  • net.ipv4.tcp_syn_retries選項表示在內核放棄建立連接之前發送SYN包的數量。

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

  • net.ipv4.tcp_syn_retries選項表示在內核放棄建立連接之前發送SYN包的數量。

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

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

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

緩沖區隊列:

  • net.core.somaxconn:選項的默認值是128, 這個參數用于調節系統同時發起的tcp連接數,在高并發的請求中,默認的值可能會導致鏈接超時或者重傳,因此,需要結合并發請求數來調節此值。

  • 由NGINX可接受的數目決定。默認值通常很低,但可以接受,因為NGINX 接收連接非???#xff0c;但如果網站流量大時,就應該增加這個值。內核日志中的錯誤消息會提醒這個值太小了,把值改大,直到錯誤提示消失。注意:如果設置這個值大于512,相應地也要改變NGINX listen指令的backlog參數。

  • net.core.netdev_max_backlog:選項表示當每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許發送到隊列的數據包的最大數目。

4.PHP-FPM的優化

如果您高負載網站使用PHP-FPM管理FastCGI,這些技巧也許對您有用:

①增加FastCGI進程數

把PHP FastCGI子進程數調到100或以上,在4G內存的服務器上200就可以建議通過壓力測試獲取最佳值。

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

標簽rlimit_files用于設置PHP-FPM對打開文件描述符的限制,默認值為1024。

這個標簽的值必須和Linux內核打開文件數關聯起來。

例如,要將此值設置為65 535,就必須在Linux命令行執行“ulimit -HSn 65536”。

然后 增加 PHP-FPM打開文件描述符的限制: # vi /path/to/php-fpm.conf 找到“1024”把1024更改為 4096或者更高.重啟 PHP-FPM.ulimit -n 要調整為65536甚至更大。如何調這個參數,可以參考網上的一些文章。命令行下執行 ulimit -n 65536即可修改。如果不能修改,需要設置 /etc/security/limits.conf,加入* hard nofile6553* soft nofile 65536

③適當增加max_requests

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

500

5.nginx.conf的參數優化

nginx要開啟的進程數?一般等于cpu的總核數 其實一般情況下開4個或8個就可以。

  • 每個nginx進程消耗的內存10兆的模樣

worker_cpu_affinity

①僅適用于linux,使用該選項可以綁定worker進程和CPU(2.4內核的機器用不了)

②假如是8 cpu 分配如下:

?worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000

00100000 01000000 10000000

nginx可以使用多個worker進程,原因如下:

to use SMP to decrease latency when workers blockend on disk I/O to limit number of connections per process when select()/poll() isused The worker_processes and worker_connections from the event sectionsallows you to calculate maxclients value: k max_clients = worker_processes * worker_connectionsworker_rlimit_nofile 102400;

每個nginx進程打開文件描述符最大數目 配置要和系統的單進程打開文件數一致,linux 2.6內核下開啟文件打開數為65535,worker_rlimit_nofile就相應應該填寫65535 nginx調度時分配請求到進程并不是那么的均衡,假如超過會返回502錯誤。我這里寫的大一點。

use epoll

Nginx使用了最新的epoll(Linux 2.6內核)和kqueue(freebsd)網絡I/O模型,而Apache則使用的是傳統的select模型。

處理大量的連接的讀寫,Apache所采用的select網絡I/O模型非常低效。在高并發服務器中,輪詢I/O是最耗時間的操作 目前Linux下能夠承受高并發

?訪問的Squid、Memcached都采用的是epoll網絡I/O模型。

worker_processes?

NGINX工作進程數(默認值是1)。

在大多數情況下,一個CPU內核運行一個工作進程最好,建議將這個指令設置成自動就可以。

有時可能想增大這個值,比如當工作進程需要做大量的磁盤I/O。

worker_connections 65535;

每個工作進程允許最大的同時連接數 (Maxclient = work_processes * worker_connections)

keepalive_timeout 75

keepalive超時時間

這里需要注意官方的一句話:

The parameters can differ from each other. Line Keep-Alive:

timeout=time understands Mozilla and Konqueror. MSIE itself shuts

keep-alive connection approximately after 60 seconds.

client_header_buffer_size 16k

large_client_header_buffers 4 32k

客戶請求頭緩沖大小?

nginx默認會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取

如果設置過小HTTP頭/Cookie過大 會報400 錯誤 nginx 400 bad request

求行如果超過buffer,就會報HTTP 414錯誤(URI Too Long) nginx接受最長的HTTP頭部大小必須比其中一個buffer大,否則就會報400的HTTP錯誤(Bad Request)。

open_file_cache max 102400

使用字段:http, server, location 這個指令指定緩存是否啟用,如果啟用,將記錄文件以下信息: 打開的文件描述符,大小信息和修改時間. 存在的目錄信息. 在搜索文件過程中的錯誤信息 -- 沒有這個文件,無法正確讀取,參考open_file_cache_errors 指令選項:

·max - 指定緩存的最大數目,如果緩存溢出,最長使用過的文件(LRU)將被移除

例: open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;

open_file_cache_errors

語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤.

open_file_cache_min_uses

  • 語法:open_file_cache_min_uses number?

  • 默認值:open_file_cache_min_uses 1?

  • 使用字段:http, server, location?

  • 這個指令指定了在open_file_cache指令無效的參數中,一定的時間范圍內可以使用的最小文件數,如果使用更大的值,文件描述符在cache中總是打開狀態。

open_file_cache_valid

語法:open_file_cache_valid time?

默認值:open_file_cache_valid 60?

使用字段:http, server, location?

這個指令指定了何時需要檢查open_file_cache中緩存項目的有效信息。

開啟gzip

gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.0;gzip_comp_level 2;gzip_types text/plain application/x-javascript text/cssapplication/xml;gzip_vary on;

緩存靜態文件:

location ~* ^.+\.(swf|gif|png|jpg|js|css)$ { root /usr/local/ku6/ktv/show.ku6.com/; expires 1m;}

響應緩沖區:

比如我們Nginx+Tomcat 代理訪問JS無法完全加載,這幾個參數影響:

proxy_buffer_size 128k;proxy_buffers 32 128k;proxy_busy_buffers_size 128k;

Nginx在代理了相應服務后或根據我們配置的UpStream和location來獲取相應的文件,首先文件會被解析到nginx的內存或者臨時文件目錄中,然后由nginx再來響應。

那么當proxy_buffers和proxy_buffer_size以及proxy_busy_buffers_size 都太小時,會將內容根據nginx的配置生成到臨時文件中,但是臨時文件的大小也有默認值。所以當這四個值都過小時就會導致部分文件只加載一部分。

所以要根據我們的服務器情況適當的調整proxy_buffers和proxy_buffer_size以及proxy_busy_buffers_size、proxy_temp_file_write_size。

具體幾個參數的詳細如下:

  • proxy_buffers?? 32 128k;? 設置了32個緩存區,每個的大小是128k

  • proxy_buffer_size 128k; 每個緩存區的大小是128k,當兩個值不一致時沒有找到具體哪個有效,建議和上面的設置一致。

  • proxy_busy_buffers_size 128k;設置使用中的緩存區的大小,控制傳輸至客戶端的緩存的最大

  • proxy_temp_file_write_size 緩存文件的大小

? 5.訪問日志

記錄每個請求會消耗CPU和I/O周期,一種降低這種影響的方式是緩沖訪問日志。使用緩沖,而不是每條日志記錄都單獨執行寫操作,NGINX會緩沖一連串的日志記錄,使用單個操作把它們一起寫到文件中。

要啟用訪問日志的緩存,就涉及到在access_log指令中buffer=size這個參數。當緩沖區達到size值時,NGINX會把緩沖區的內容寫到日志中。讓NGINX在指定的一段時間后寫緩存,就包含flush=time參數。

當兩個參數都設置了,當下個日志條目超出緩沖區值或者緩沖區中日志條目存留時間超過設定的時間值,NGINX都會將條目寫入日志文件。

當工作進程重新打開它的日志文件或退出時,也會記錄下來。要完全禁用訪問日志記錄的功能,將access_log 指令設置成off參數。

?6.限流

你可以設置多個限制,防止用戶消耗太多的資源,避免影響系統性能和用戶體驗及安全。以下是相關的指令:

  • limit_conn and limit_conn_zone:NGINX接受客戶連接的數量限制,例如單個IP地址的連接。設置這些指令可以防止單個用戶打開太多的連接,消耗超出自己的資源。

  • limit_rate:傳輸到客戶端響應速度的限制(每個打開多個連接的客戶消耗更多的帶寬)。設置這個限制防止系統過載,確保所有客戶端更均勻的服務質量。

  • limit_req and limit_req_zone:NGINX處理請求的速度限制,與limit_rate有相同的功能??梢蕴岣甙踩?#xff0c;尤其是對登錄頁面,通過對用戶限制請求速率設置一個合理的值,避免太慢的程序覆蓋你的應用請求(比如DDoS攻擊)。

  • max_conns:上游配置塊中服務器指令參數。在上游服務器組中單個服務器可接受最大并發數量。使用這個限制防止上游服務器過載。設置值為0(默認值)表示沒有限制。

  • queue (NGINX Plus) :創建一個隊列,用來存放在上游服務器中超出他們最大max_cons限制數量的請求。這個指令可以設置隊列請求的最大值,還可以選擇設置在錯誤返回之前最大等待時間(默認值是60秒)。如果忽略這個指令,請求不會放入隊列。

7. ?錯誤排查

1.Nginx 502 Bad Gateway:5 作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。

常見原因:

1.后端服務掛了的情況,直接502 (nginx error日志:connect() failed (111: Connection refused)?)

2.后端服務在重啟

實例:將后端服務關掉,然后向nginx發送請求后端接口,nginx日志可以看到502錯誤。

如果nginx+php出現502, 錯誤分析:

php-cgi進程數不夠用、php執行時間長(mysql慢)、或者是php-cgi進程死掉,都會出現502錯誤

一般來說Nginx 502 Bad Gateway和php-fpm.conf的設置有關,而Nginx 504 Gateway Time-out則是與nginx.conf的設置有關

①查看當前的PHP FastCGI進程數是否夠用:

netstat -anpo | grep "php-cgi" | wc -l

如果實際使用的“FastCGI進程數”接近預設的“FastCGI進程數”,那么,說明“FastCGI進程數”不夠用,需要增大。

②部分PHP程序的執行時間超過了Nginx的等待時間,可以適當增加

nginx.conf配置文件中FastCGI的timeout時間,例如:

http { ...... fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; ......}

2.504 Gateway Timeout :?

nginx作為網關或者代理工作的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)收到響應。

常見原因:

  • 該接口太耗時,后端服務接收到請求,開始執行,未能在設定時間返回數據給nginx。

  • 后端服務器整體負載太高,接受到請求之后,由于線程繁忙,未能安排給請求的接口,導致未能在設定時間返回數據給nginx。

413 Request Entity Too Large

解決:增大client_max_body_size

client_max_body_size:指令指定允許客戶端連接的最大請求實體大小,它出現在請求頭部的Content-Length字段。

?如果請求大于指定的值,客戶端將收到一個"Request Entity Too Large" (413)錯誤. 記住,瀏覽器并不知道怎樣顯示這個錯誤。

php.ini中增大

post_max_size 和upload_max_filesize

3.Ngnix error.log出現:upstream sent too big header while reading response header from upstream錯誤

①如果是nginx反向代理

proxy是nginx作為client轉發時使用的,如果header過大,超出了默認的1k,就會引發上述的upstream sent too big header (說白了就是nginx把外部請求給后端server,后端server返回的header ?太大nginx處理不過來就導致了。

server { listen 80; server_name *.xywy.com ; large_client_header_buffers 4 16k; location / { #添加這3行 proxy_buffer_size 64k; proxy_buffers 32 32k; proxy_busy_buffers_size 128k; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

②如果是 nginx+PHPcgi?錯誤帶有 upstream: "fastcgi://127.0.0.1:9000"。

就該多加:

fastcgi_buffer_size 128k; fastcgi_buffers 4 128k;server { listen 80; server_name ddd.com; index index.html index.htm index.php; client_header_buffer_size 128k; large_client_header_buffers 4 128k; proxy_buffer_size 64k; proxy_buffers 8 64k; fastcgi_buffer_size 128k; fastcgi_buffers 4 128k; location / { ...... }}

8. ?Nginx的php漏洞

漏洞介紹:

nginx是一款高性能的web服務器,使用非常廣泛,其不僅經常被用作反向代理,也可以非常好的支持PHP的運行。

80sec發現其中存在一個較為嚴重的安全問題,默認情況下可能導致服務器錯誤的將任何類型的文件以PHP的方式進行解析,這將導致嚴重的安全問題,使得惡意的攻擊者可能攻陷支持php的nginx服務器。

漏洞分析:

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環境變量進行選擇,其中傳遞到后端Fastcgi的關鍵變量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name決定,而通過分析可以看到$fastcgi_script_name是直接由URI環境變量控制的,這里就是產生問題的點。

而為了較好的支持PATH_INFO的提取,在PHP的配置選項里存在cgi.fix_pathinfo選項,其目的是為了從SCRIPT_FILENAME里取出真正的腳本名。

那么假設存在一個http://www.80sec.com/80sec.jpg,

我們以如下的方式去訪問

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

將會得到一個URI

/80sec.jpg/80sec.php

經過location指令,該請求將會交給后端的fastcgi處理,nginx為其設置環境變量SCRIPT_FILENAME,內容為

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

而在其他的webserver如lighttpd當中,我們發現其中的SCRIPT_FILENAME被正確的設置為

/scripts/80sec.jpg

所以不存在此問題。

后端的fastcgi在接受到該選項時,會根據fix_pathinfo配置決定是否對SCRIPT_FILENAME進行額外的處理,一般情況下如果不對fix_pathinfo進行設置將影響使用PATH_INFO進行路由選擇的應用,所以該選項一般配置開啟。

Php通過該選項之后將查找其中真正的腳本文件名字,查找的方式也是查看文件是否存在,這個時候將分離出SCRIPT_FILENAME和PATH_INFO分別為

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

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

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

訪問http://www.80sec.com/robots.txtHTTP/1.1 200 OKServer: nginx/0.6.32Date: Thu, 20 May 2010 10:05:30 GMTContent-Type: text/plainContent-Length: 18Last-Modified: Thu, 20 May 2010 06:26:34 GMTConnection: keep-aliveKeep-Alive: timeout=20Accept-Ranges: bytes

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

HTTP/1.1 200 OKServer: nginx/0.6.32Date: Thu, 20 May 2010 10:06:49 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveKeep-Alive: timeout=20X-Powered-By: PHP/5.2.6?

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

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

解決方案:我們已經嘗試聯系官方,但是此前你可以通過以下的方式來減少損失

關閉cgi.fix_pathinfo為0

或者

if ( $fastcgi_script_name ~ ..*/.*php ) {return 403;}來源:https://blog.csdn.net/hguisu/article/details/8930668

·END·

PHP開源社區進階·提升·漲薪

總結

以上是生活随笔為你收集整理的服务器 启动多个nginx_Nginx工作原理和优化总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

伊人夜夜 | 免费成人在线视频网站 | 久久国产精品免费观看 | www.com操| 99久久99久久免费精品蜜臀 | 久久九九精品 | 激情久久一区二区三区 | 婷婷六月天综合 | 亚洲aⅴ免费在线观看 | 91九色pron| 成人精品999| 精品国产一区二区久久 | 在线观看中文字幕第一页 | 久久久片 | 日韩av一卡二卡三卡 | 91正在播放 | 91精品毛片 | 99久久久久成人国产免费 | 国产高清av免费在线观看 | 天堂av影院 | 中文字幕电影一区 | 日日干影院 | 91在线资源 | 日本精品视频一区 | 黄色电影在线免费观看 | 国产黄大片| 国产精品99久久久精品免费观看 | 成人久久视频 | 国产亚洲精品bv在线观看 | 国产精品一区在线观看 | 免费裸体视频网 | 97天天干 | 中文字幕在线观看资源 | 狠狠网站 | 中字幕视频在线永久在线观看免费 | 黄色在线免费观看网站 | 久久国产精品久久精品 | 中文字幕在线观看免费 | 波多野结衣视频在线 | 9在线观看免费高清完整版在线观看明 | 在线播放日韩av | 久久国产影院 | 精品久久五月天 | 国产成人a v电影 | 开心综合网 | 黄色一级大片免费看 | 天天av天天 | 亚洲男男gaygay无套 | 最新av电影网址 | 亚洲精品久久久久中文字幕二区 | 成人性生交视频 | 在线观看免费高清视频大全追剧 | 欧美一二三区在线观看 | 91尤物在线播放 | 精品视频资源站 | 亚洲天堂网视频 | 国产精品欧美久久久久三级 | 欧美性大战久久久久 | 国产人成在线视频 | 91精品天码美女少妇 | 99视频导航 | 四虎影院在线观看av | 欧美了一区在线观看 | 国产精品每日更新 | 91精品国产92久久久久 | av中文字幕在线免费观看 | 亚洲传媒在线 | 黄色片软件网站 | 国产99免费视频 | 国产精品乱码高清在线看 | 欧洲av在线 | 免费特级黄色片 | 欧美日韩中 | 黄色av电影在线观看 | 欧美日韩一区二区视频在线观看 | 91久久丝袜国产露脸动漫 | 婷婷在线免费视频 | 97国产在线| 国产视频亚洲 | 日韩欧美在线综合网 | 伊人影院得得 | 久草免费资源 | 夜夜视频 | 怡红院成人在线 | 一区二区三区日韩在线观看 | 国产精品免费大片视频 | 特级西西444www高清大视频 | 国产色视频一区二区三区qq号 | 久热国产视频 | 久久高清视频免费 | 99在线观看精品 | 视频国产在线观看18 | 日产中文字幕 | 97国产超碰 | 91超碰在线播放 | 在线观看国产日韩欧美 | 91丨九色丨国产女 | 国产麻豆果冻传媒在线观看 | 成人免费在线播放 | 欧美日韩国产页 | 四虎永久网站 | 国产成人久久精品77777 | 中文字幕一区二区三区四区在线视频 | 日韩在线色视频 | 亚洲高清av在线 | 午夜视频在线观看欧美 | 米奇狠狠狠888| 色偷偷88888欧美精品久久久 | www.久久爱.cn | 国产露脸91国语对白 | 五月开心激情 | 99热精品在线观看 | 91在线网址| 成年人在线免费视频观看 | 99高清视频有精品视频 | 黄色av网站在线观看 | 蜜桃视频成人在线观看 | 亚洲精品视频在线观看免费视频 | 国内精品视频久久 | 97国产在线视频 | 欧美成年人在线视频 | 精品99久久久久久 | 婷婷在线免费视频 | 天天操天天添 | 在线免费性生活片 | 全黄网站 | 91天堂在线观看 | 国产69精品久久久久久久久久 | 久久久精品网站 | 欧美国产日韩一区二区三区 | 免费看的黄色 | 一级黄色a视频 | 久久高清视频免费 | 精品亚洲视频在线观看 | 亚洲视频一区二区三区在线观看 | 精品久久久久国产 | 特级西西人体444是什么意思 | 正在播放国产91 | 中文字幕一区二区三区四区在线视频 | 成年人黄色免费视频 | 成人av资源网站 | 超碰在线成人 | 在线国产一区 | 亚洲精品毛片一级91精品 | 久久综合视频网 | 精品自拍av | 免费大片黄在线 | 日韩欧美视频在线观看免费 | 96视频在线| 亚洲一级片免费观看 | 天天操夜夜曰 | 人人dvd| 亚洲成人动漫在线观看 | 在线一二三四区 | 亚洲视频高清 | 国产日韩精品一区二区在线观看播放 | 久久一区二区免费视频 | 在线观看mv的中文字幕网站 | 色综合久久99 | 亚洲精品mv在线观看 | 亚洲精品播放 | 91九色精品女同系列 | 成人国产精品一区二区 | 精品国产亚洲一区二区麻豆 | 天堂av观看 | 黄色软件在线观看 | 免费在线视频一区二区 | 亚洲 欧美 日韩 综合 | 色姑娘综合天天 | 欧美a级在线 | 日日夜夜天天综合 | 精品视频在线视频 | 国产精品不卡 | 色综合久久久网 | 天天艹天天爽 | 天天色播 | 黄色片软件网站 | 国产精品久久久久久久免费 | 中日韩在线视频 | 五月婷婷六月丁香 | 久久免费黄色大片 | 日本中文在线播放 | 亚洲日本色 | 国产精品久久久网站 | 免费观看9x视频网站在线观看 | www.亚洲精品在线 | 五月婷婷开心中文字幕 | 国产va精品免费观看 | 午夜精品久久久久 | 日韩av影视在线观看 | 国产福利午夜 | 国产黄色精品视频 | 五月婷婷在线视频 | 久久免费久久 | 91高清免费看 | 最新超碰在线 | 亚洲 欧美 日韩 综合 | 69国产精品成人在线播放 | 操操操干干干 | 日韩欧美视频一区二区三区 | 色综合久久久久久久久五月 | 亚洲综合丁香 | 处女av在线 | 丁香婷婷色综合亚洲电影 | 久久精品国产99国产 | 国内久久久久 | 波多野结衣最新 | 91精品国产91久久久久久三级 | 久久官网 | 午夜视频免费在线观看 | 亚洲精品视频第一页 | 99亚洲国产精品 | 中文在线最新版天堂 | 久草com | 久久久久亚洲a | 在线天堂日本 | 伊人资源站 | 日韩伦理片hd | 国产视频一区精品 | 99欧美| 激情五月播播久久久精品 | 黄色最新网址 | 国产精品白浆视频 | 天天操天天操天天操天天操天天操 | 久久国产一区二区 | 在线播放精品一区二区三区 | a国产精品 | 日韩在线视频免费播放 | 最近高清中文在线字幕在线观看 | 啪一啪在线 | 最新日韩视频 | 亚洲伊人av | 国产 视频 高清 免费 | 91免费版成人 | 欧美性色网站 | 久久综合狠狠 | 在线视频日韩一区 | 日韩二区三区在线观看 | 亚洲免费在线看 | 亚洲精品美女在线观看 | 中文字幕第一页在线视频 | 91精品国产福利在线观看 | 亚洲精品白浆高清久久久久久 | 亚洲一区精品二人人爽久久 | 色综合久久久久综合体桃花网 | 美女网站色免费 | 国产一级免费av | 天天操夜夜摸 | 欧美极品少妇xbxb性爽爽视频 | 欧美成年人在线观看 | 在线影视 一区 二区 三区 | 成人免费视频观看 | 久久国产片 | 日韩精品久久久 | 狠狠狠色丁香综合久久天下网 | 日韩精品中文字幕在线播放 | 日本精品中文字幕在线观看 | 在线观看的av | 亚洲激情一区二区三区 | 99精品国产一区二区 | 久久久久久久福利 | 丁香六月婷婷开心 | 字幕网在线观看 | 毛片黄色一级 | 最新av网址在线 | 久久 国产一区 | 久久久久福利视频 | 激情五月在线视频 | 国产精品video爽爽爽爽 | 国产人免费人成免费视频 | 成人免费视频视频在线观看 免费 | 超碰日韩在线 | 国产 视频 高清 免费 | 国产一区二区免费看 | 日韩av黄 | 国产成人在线免费观看 | 亚洲手机av | 免费在线观看中文字幕 | av免费看在线 | 在线播放国产一区二区三区 | 国产精品粉嫩 | 国产精品日韩久久久久 | 国产视频首页 | 91理论片午午伦夜理片久久 | 久久精品视频2 | 日韩网页 | 国产一级黄色免费看 | 天天操天 | 日日干,天天干 | 西西4444www大胆无视频 | 99视频一区 | 99久久精品免费看国产四区 | 人人爽人人av| 最新日韩电影 | 视频成人 | 少妇bbbb搡bbbb桶 | 欧美va天堂va视频va在线 | 欧美成人亚洲 | 91精品无人成人www | 久久久免费看片 | www.夜夜| 国产精品久久久久毛片大屁完整版 | 91亚洲精品在线观看 | 97香蕉久久超级碰碰高清版 | 久久免费视频在线观看6 | 日韩电影一区二区三区在线观看 | 91网免费看| 91精品国自产在线观看欧美 | 亚洲另类视频在线 | 免费福利在线 | 黄色影院在线播放 | 91av手机在线观看 | 五月导航| 1区2区3区在线观看 三级动图 | 丁香五月网久久综合 | 欧美日韩精品综合 | 色综合小说 | 久草免费在线 | 综合久久一本 | www国产亚洲精品久久网站 | 人人精久 | 久草在线手机观看 | 久久久久久久综合色一本 | av大片免费在线观看 | 天天射天天做 | 精品国产日本 | 成人免费观看a | 中文字幕精品一区 | 国产美女视频免费 | 国产1区在线观看 | 91久久电影 | 国产一区二区在线影院 | 色综合久久综合网 | 国产日本亚洲 | 国产福利a | 国产精品99久久久久久人免费 | 成人在线播放网站 | 欧美精品亚洲精品 | 午夜精品久久久久久久久久久久久久 | 国产亚洲视频在线免费观看 | 一级黄色网址 | 国产日韩视频在线播放 | 日韩av专区 | 九九久久免费视频 | 精品专区一区二区 | 欧美视频在线二区 | 天天综合婷婷 | 91精品久久久久久久91蜜桃 | 欧美日韩视频在线一区 | 午夜免费福利视频 | 成人h电影在线观看 | 99精品视频免费看 | 最新av电影网站 | 一区免费视频 | 成人a v视频| 97碰在线 | www.色就是色 | 久草免费在线 | 国产精品毛片久久久久久久久久99999999 | 亚洲黄色小说网址 | 在线v片| 91三级视频 | 三级av小说 | 三级免费黄色 | 久草视频在线资源 | 日本中文一区二区 | 九九99| 成人黄色电影免费观看 | 国产午夜三级一区二区三 | 在线日韩中文 | 国产精品美女久久 | 二区视频在线观看 | 精品高清美女精品国产区 | 91看国产| 日本久久中文字幕 | 在线观看视频黄色 | 九月婷婷色| 中文字幕免费一区 | 免费h在线观看 | 亚洲综合少妇 | 国产一区视频在线观看免费 | 婷婷激情小说网 | 福利一区二区三区四区 | 久久精品99国产精品亚洲最刺激 | 国产免费片 | 97夜夜澡人人爽人人免费 | 涩涩网站在线看 | 最近中文字幕免费视频 | 欧美一区成人 | 啪啪av在线| 欧美一区日韩精品 | 免费91麻豆精品国产自产在线观看 | 久久电影国产免费久久电影 | 片黄色毛片黄色毛片 | 91在线欧美 | 久久免费在线视频 | 婷婷激情5月天 | 豆豆色资源网xfplay | 久久久www成人免费精品 | 亚洲欧洲日韩在线观看 | 99在线热播精品免费99热 | 日韩久久精品一区二区 | 久热超碰 | 91丨精品丨蝌蚪丨白丝jk | 精品一区二区在线免费观看 | 国产精品毛片一区视频播不卡 | 国内精品久久久久久久久久 | 色婷久久 | 亚洲精品成人免费 | 在线免费观看视频a | 欧美伦理一区二区三区 | 97色免费视频 | 国产一级片一区二区三区 | 亚洲高清激情 | 黄色三级在线观看 | 亚洲精品国产精品国自产观看 | 中文字幕日本特黄aa毛片 | 亚洲精品在线免费观看视频 | 丁香激情视频 | 中文字幕一区在线 | 99视频免费在线观看 | 人人讲 | 国产最新在线视频 | av免费电影在线 | 中文字幕999 | 国产美女主播精品一区二区三区 | 国产欧美精品一区二区三区 | 97狠狠干 | 免费看片亚洲 | 国产xxxxx在线观看 | 五月天久久久久久 | 青青河边草免费直播 | 98超碰人人 | 精品亚洲va在线va天堂资源站 | 久久久国产电影 | 欧美日韩视频在线观看一区二区 | 国产精品中文字幕av | 91成人免费在线视频 | 久久精品亚洲综合专区 | 美女网站久久 | 欧美亚洲国产一卡 | 亚洲精品高清在线 | 五月婷婷,六月丁香 | 欧美精品黑人性xxxx | 丁香免费视频 | 欧美不卡视频在线 | 丁香视频免费观看 | 欧美亚洲一区二区在线 | 成年人黄色av | 国产香蕉视频 | 婷婷伊人网 | 亚洲一区二区精品视频 | 亚洲一区视频免费观看 | 日韩理论片在线观看 | 91色网址| 欧美一级免费 | 久久久精品成人 | 国产成人精品999 | 最新av在线免费观看 | 久久国产精品久久精品 | 日韩欧美一区二区三区在线观看 | av中文字幕网 | 国产伦精品一区二区三区免费 | 国产精品99久久久久久武松影视 | 午夜国产在线观看 | 又色又爽又黄高潮的免费视频 | 九九视频在线播放 | 国产经典av | 中文字幕黄色网址 | 国产又黄又硬又爽 | 色综合天天狠天天透天天伊人 | 中文字幕资源在线 | 美女黄网站视频免费 | 欧美一级看片 | 色视频在线免费观看 | 中文字幕在线观看免费高清完整版 | 亚洲国产999 | 国产五十路毛片 | 国产精品99在线观看 | 91精品入口 | 夜夜嗨av色一区二区不卡 | 久久99在线观看 | 91麻豆精品国产91久久久无限制版 | 97av影院| 婷婷精品国产一区二区三区日韩 | 国产精品激情在线观看 | 亚洲国产美女久久久久 | 美女网站久久 | 精品毛片一区二区免费看 | 在线国产视频观看 | 日本丶国产丶欧美色综合 | 五月婷婷狠狠 | 少妇视频在线播放 | 人人澡人人爽欧一区 | 亚洲,国产成人av | 五月激情久久久 | 国产成人三级 | 欧美一区中文字幕 | 国产精品久久久久久久久久直播 | 伊人电影天堂 | 久久久久免费精品国产小说色大师 | 91女子私密保健养生少妇 | 亚洲欧美视频网站 | 国产一区二区不卡视频 | 国产 精品 资源 | av线上免费看 | 不卡在线一区 | 国产成人亚洲精品自产在线 | av网站免费在线 | 久久99精品热在线观看 | 欧美 另类 交 | 中文字幕亚洲综合久久五月天色无吗'' | 天天操天天色综合 | 欧美日韩久久 | 中文字幕在线观看91 | 免费看黄在线网站 | av大全在线看 | 亚洲国产一二三 | 日韩一级电影在线观看 | 最近中文字幕免费大全 | 激情五月婷婷综合网 | 四虎精品成人免费网站 | 免费毛片一区二区三区久久久 | 精品99在线观看 | 天天天干天天天操 | 午夜精品一区二区三区免费视频 | 国产高清久久久 | 日本中文在线 | 一级全黄毛片 | 国产91亚洲精品 | 日本午夜免费福利视频 | 日韩资源在线 | 久久综合激情 | 日本福利视频在线 | 五月天伊人 | 成人99免费视频 | www日韩精品 | 中文字幕超清在线免费 | 99爱视频在线观看 | 一级欧美日韩 | 久久久免费视频播放 | 国产精品影音先锋 | 国产精品高潮呻吟久久av无 | 91久久国产自产拍夜夜嗨 | 国产精品一区二区吃奶在线观看 | 成人久久电影 | 久久超碰网 | 玖玖玖国产精品 | 99国产精品免费网站 | 欧美日韩国产一区二区在线观看 | 精品国产免费av | 日韩三级视频在线观看 | 五月天.com| 欧美午夜激情网 | 欧美激情精品久久 | 欧美a视频在线观看 | 麻豆国产精品一区二区三区 | 色一级片 | 欧美日韩高清在线 | 国产99精品在线观看 | 国产精品久久中文字幕 | 久久久久久久久久久福利 | 国产又粗又猛又爽又黄的视频免费 | 麻豆视频免费播放 | 色婷五月 | 亚洲一区动漫 | 欧美一级久久久久 | 日韩电影久久久 | 人人澡澡人人 | 欧美日韩视频 | 国产黄色一级片在线 | 国产成人综合图片 | 国产午夜麻豆影院在线观看 | 精品国产视频在线观看 | 丁香婷婷自拍 | 欧美久久电影 | 成人综合婷婷国产精品久久免费 | 日韩一区二区三区视频在线 | 亚洲精品黄 | 在线视频中文字幕一区 | 在线观看视频一区二区三区 | 日韩免费在线观看视频 | 久久综合九色综合欧美就去吻 | 免费h精品视频在线播放 | 91精品国产亚洲 | 国产麻豆视频免费观看 | 成人精品在线 | 亚洲日本三级 | 精品视频久久 | 最近中文字幕 | 在线看黄色的网站 | av蜜桃在线 | 精品国产91亚洲一区二区三区www | 国产精品va | 91 在线视频播放 | 日韩激情视频在线观看 | 91精品国产乱码久久 | 成人免费一区二区三区在线观看 | 香蕉成人在线视频 | 97av色| 国产精品久久久久久久免费 | 一级特黄av | 一区二区不卡视频在线观看 | 欧美动漫一区二区三区 | 国产日韩在线看 | 8090yy亚洲精品久久 | 国产亚洲欧美在线视频 | 久久综合九色欧美综合狠狠 | 久久精品一二三 | 日韩视频一区二区三区在线播放免费观看 | 欧美日一级片 | 欧美一区二区三区激情视频 | 国产精品免费观看视频 | 久久久久久久久久久福利 | 国产精品大片在线观看 | 超碰成人网 | 91视频首页 | 色99导航| 国产精品 日本 | 粉嫩av一区二区三区四区在线观看 | 亚洲精品电影在线 | 日韩欧美在线观看一区二区 | 亚洲电影第一页av | 亚洲成人精品 | 久久久久免费精品国产小说色大师 | www日日夜夜| 久久精品视频在线观看免费 | 日韩在线电影 | 一级片免费视频 | 一区二区三区电影在线播 | 色久综合 | 精品一区 在线 | 五月天九九 | 99精品视频免费在线观看 | 狠狠色丁香久久婷婷综合丁香 | 国产精品久久久久亚洲影视 | 啪啪av在线 | 久久精品8 | 色噜噜在线观看 | 黄色影院在线免费观看 | 免费看黄的视频 | 精品免费视频 | 成人 国产 在线 | 五月天色综合 | 99精品免费 | 18国产精品福利片久久婷 | 亚洲男男gaygay无套同网址 | 97av视频| 在线观看深夜视频 | 99电影| 亚洲欧美日韩中文在线 | av大全在线免费观看 | 精品久久久久久国产91 | 国产盗摄精品一区二区 | jizz欧美性9 国产一区高清在线观看 | 欧美日韩高清在线观看 | av成人动漫在线观看 | 久久久黄色 | 人人草人人草 | 福利一区二区三区四区 | 人人草人人草 | a黄色影院 | 亚洲不卡av一区二区三区 | 一级黄色av | 亚洲天堂激情 | 偷拍精品一区二区三区 | 久久久久五月天 | 99久久99久久综合 | 日韩欧美国产精品 | 免费日韩一区二区三区 | 国产精品一区二区久久精品爱微奶 | 激情欧美一区二区三区 | 免费h精品视频在线播放 | 久久线视频 | 国产又粗又猛又爽 | 国产精品 美女 | 国产特级毛片aaaaaaa高清 | 中文字幕一区二区三区在线视频 | 午夜.dj高清免费观看视频 | 成年人在线免费看视频 | 亚洲年轻女教师毛茸茸 | 久久久久综合视频 | 91色在线观看 | 国产精品av久久久久久无 | av中文电影 | 久久精品123| 成人午夜精品 | 久久久久久久久久久久亚洲 | 亚洲国产精品女人久久久 | 天天曰天天曰 | 嫩嫩影院理论片 | 国产精品一区专区欧美日韩 | 玖玖色在线观看 | 香蕉视频亚洲 | 亚洲激情影院 | 亚洲精品网站 | 国产精品av免费 | 日韩美女黄色片 | 久久精彩免费视频 | 91传媒视频在线观看 | 天天天天爱天天躁 | 欧美做受69 | 欧美一级性生活片 | 午夜国产在线观看 | 欧美色道 | 亚洲毛片在线观看. | avsex| 正在播放久久 | 久久一区二区三区超碰国产精品 | 欧美久久久久久久久久久 | 97夜夜澡人人双人人人喊 | 国产偷国产偷亚洲清高 | 欧美午夜a | 蜜桃av观看 | 久热免费 | 91九色成人蝌蚪首页 | 综合国产在线 | 99视频在线看 | 精品福利片| 久久一本综合 | 黄a网 | 欧美在线视频二区 | 美女黄频网站 | 国产乱对白刺激视频在线观看女王 | 国产亚洲情侣一区二区无 | 婷婷久久丁香 | 深爱开心激情网 | 91色国产| 国产区精品区 | 97超碰超碰久久福利超碰 | 色姑娘综合天天 | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久久久久高清 | 久久免费视频在线观看30 | 又黄又刺激视频 | 在线观看av网站 | 91视频最新网址 | 在线婷婷 | 免费看黄的 | 色a综合| 国产免费又黄又爽 | 三级大片网站 | 欧美精品一区二区三区四区在线 | 天天色天天射天天操 | 一级一片免费看 | 97超碰在线人人 | 91久久久久久国产精品 | 久久色亚洲 | 日日爱网址 | 黄色av电影免费观看 | 欧美aa在线 | 精品美女在线视频 | 啪啪小视频网站 | 午夜久久影院 | 在线观看中文字幕 | 日韩在线播放视频 | 天天夜夜亚洲 | 日日噜噜噜噜夜夜爽亚洲精品 | 黄色毛片视频 | 狠狠干美女 | 九九久久久久99精品 | 看片网站黄色 | 成人精品亚洲 | 伊人开心激情 | 九九亚洲精品 | 亚洲国产色一区 | 婷婷丁香花五月天 | 国产日产精品一区二区三区四区的观看方式 | 久久国产系列 | 婷婷资源站 | 国产天天爽 | 国内丰满少妇猛烈精品播放 | 国产毛片aaa| 日日日天天天 | 81国产精品久久久久久久久久 | 四虎成人精品永久免费av九九 | 日韩中文字幕一区 | 亚洲精品小视频 | 久久桃花网 | 亚洲女欲精品久久久久久久18 | 六月婷婷久香在线视频 | 亚州av成人| 97人人爽人人 | 最新中文字幕在线播放 | 97色婷婷成人综合在线观看 | 香蕉在线观看视频 | av在线免费网 | 国产精品国产三级在线专区 | 日日弄天天弄美女bbbb | 亚洲精品 在线视频 | av在线com| av中文字幕在线观看网站 | 国产婷婷色 | 日韩av免费一区 | 亚洲精品在线免费看 | 男女激情免费网站 | 国产精品毛片久久久久久久 | 国产一区欧美日韩 | 国产精品99久久免费观看 | 日韩视频专区 | 精品国产乱码久久久久久1区二区 | 91中文视频 | 69性欧美| 黄色一级大片免费看 | 色综合久久99 | 久久久麻豆 | 婷婷亚洲五月色综合 | 国产一级视屏 | 人人爽人人片 | 国产精品视频免费看 | 国产精品久久久久久久久久尿 | 九九热国产视频 | 五月婷婷综 | 97精品国产一二三产区 | 成人一级片在线观看 | 国产一级性生活视频 | 亚洲丁香日韩 | 99在线热播精品免费99热 | 中文字幕影视 | 亚洲午夜激情网 | 国产99久久久久久免费看 | 国产人成一区二区三区影院 | 国产高清不卡 | 久久夜色网 | 97超碰人人澡人人 | 欧美精品一区二区免费 | 日本女人的性生活视频 | 国产精品二区三区 | 江苏妇搡bbbb搡bbbb | 国产精品美女久久久久久久久久久 | 亚洲极色 | 中文字幕资源网 国产 | 狠狠躁夜夜躁人人爽超碰91 | 一级特黄av | 日本精品视频在线观看 | 日本丶国产丶欧美色综合 | 免费男女羞羞的视频网站中文字幕 | 超碰97国产| 99久久精品国产一区 | 欧美精品一区二区免费 | mm1313亚洲精品国产 | 欧美性生活免费 | 亚洲精品麻豆视频 | 黄色毛片一级片 | 日韩在线观看你懂得 | 天天操天天操天天操 | 亚洲精品网站在线 | 久久精品一区二区三区中文字幕 | 黄网站www| 极品中文字幕 | 国产亚洲精品xxoo | 国产精品毛片一区视频播不卡 | 日本精品中文字幕 | 91私密视频 | av成人资源 | 婷婷在线播放 | 日韩欧美一区二区三区视频 | 国产一区在线不卡 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产九九精品视频 | 欧美日韩国产二区三区 | 久久久免费看片 | 99re8这里有精品热视频免费 | 五月天伊人网 | 在线观看韩日电影免费 | 久久久久免费网 | 国产91精品久久久久久 | 成人啪啪18免费游戏链接 | 激情五月播播久久久精品 | 日本中文字幕影院 | 久久视频这里有久久精品视频11 | 在线亚洲人成电影网站色www | 91插插视频 | 欧美日韩精品在线免费观看 | 午夜国产一区二区三区四区 | 99热精品国产一区二区在线观看 | 一级一片免费看 | 久久久一本精品99久久精品 | 日韩三级精品 | 怡红院av久久久久久久 | 中文字幕 国产视频 | 91精品伦理 | 国产精品女主播一区二区三区 | 日韩免费中文 | 97视频网站| 久草在在线视频 | 亚洲天堂网在线视频 | 中文字幕在线观看一区二区三区 | 日日草天天草 | 91色影院 | 97在线超碰 | 日韩精品一区二区三区免费观看视频 | 国产视频中文字幕 | 免费看国产视频 | 久久五月婷婷丁香 | 国产va饥渴难耐女保洁员在线观看 | 国产精品成人品 | 亚洲婷久久 | 国产成人一区二区三区电影 | 五月婷婷在线视频观看 | 麻豆国产精品va在线观看不卡 | 亚洲免费不卡 | 午夜在线日韩 | 国产精品久久久久婷婷二区次 | 日韩精品一区二区免费视频 | 草久久久久久 | 久久999久久 | 久草www | 91亚洲精品在线观看 | 亚洲国产午夜视频 | 日韩av在线高清 | 成人在线视频网 | 精品国偷自产在线 | 五月天综合色激情 | 亚洲一级二级三级 | 免费观看一级视频 | 天天曰视频 | 四虎影视成人精品国库在线观看 | 中文字幕在线观看你懂的 | 久久激情视频 久久 | 欧美久久久影院 | 亚洲激情在线观看 | 国产传媒一区在线 | 成年人黄色免费网站 | 99r在线 | 国产精品久久久久久影院 | 中文字幕一区二区三区四区视频 | 成人欧美一区二区三区在线观看 | 免费高清在线观看电视网站 | 天天操天天干天天玩 | 黄色特一级| 江苏妇搡bbbb搡bbbb | 亚洲精品99久久久久中文字幕 | 日韩av影片在线观看 | 欧美日韩精品综合 | 久一在线| 激情久久影院 | 欧美精选一区二区三区 | 在线观看91 | 国产黄色片网站 | 精品日韩在线一区 | 免费v片 | 国产成人av一区二区三区在线观看 | 99r在线视频 | 精品国产一区二区三区四区在线观看 | 国产精品青草综合久久久久99 | 亚洲在线日韩 | 99精品免费久久久久久日本 | 国产精品99久久久久的智能播放 | 国产黄a三级三级三级三级三级 | 国产黄免费看 | 亚洲三级影院 | 人人爽人人爽人人片av | 韩国av三级 | 色婷婷天天干 | 国产精品久久久久影院 | 久草免费在线观看 | 日韩a级黄色 | 91亚洲精品国偷拍 | 精品亚洲欧美一区 | 欧美日韩在线观看一区二区三区 | 激情欧美网| 超碰97免费在线 | 91九色蝌蚪视频网站 | 黄在线 | 91大神在线观看视频 | 日日干,天天干 | 日韩欧美国产免费播放 | 午夜av电影院 | 久久不射电影院 | 男女拍拍免费视频 | 久草综合在线观看 | 东方av免费在线观看 | 色综合久久五月天 | 精品视频久久久久久 | 丝袜制服天堂 | 国产亚洲激情视频在线 | 国产黄色精品视频 | 国产人成在线视频 | 五月婷婷视频 | 97网站| 狠狠操狠狠干天天操 | 午夜精品久久久久久久久久久 | 亚洲综合一区二区精品导航 | www视频在线免费观看 | 久久久精品免费观看 | 欧美国产一区二区 | 性色av香蕉一区二区 | 二区在线播放 | 偷拍视频一区 | 91一区一区三区 | 日韩三级视频在线观看 | 91av视频播放 | 亚洲精品99久久久久中文字幕 | 亚洲午夜精品久久久久久久久久久久 | 国产视频久 | 国产在线观看午夜 | 免费精品国产va自在自线 |