1. nginx和php的兩種通信方式
Nginx與PHP的兩種通信方式-unix socket和tcp socket
1、兩者Nginx配置
unix socket
需要在nginx配置文件中填寫php-fpm運行的pid文件地址。
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
tcp socket
需要在nginx配置文件中填寫php-fpm運行的ip地址和埠號。
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
2、兩者比較
從上面的圖片可以看,unix socket減少了不必要的tcp開銷,而tcp需要經過loopback,還要申請臨時埠和tcp相關資源。但是,unix socket高並發時候不穩定,連接數爆發時,會產生大量的長時緩存,在沒有面向連接協議的支撐下,大數據包可能會直接出錯不返回異常。tcp這樣的面向連接的協議,多少可以保證通信的正確性和完整性。
3、選擇建議:如果是在同一台伺服器上運行的nginx和php-fpm,並發量不超過1000,選擇unix socket,因為是本地,可以避免一些檢查操作(路由等),因此更快,更輕。 如果面臨高並發業務,我會選擇使用更可靠的tcp socket,以負載均衡、內核優化等運維手段維持效率。
2. php和nginx之間是如何工作的
Nginx+php-fpm實現原理 Nginx本身不會對PHP進行解析,終端對PHP頁面的請求將會被Nginx交給FastCGI進程監聽的IP地址及埠,由php-fpm作為動態解析伺服器處理,最後將處理結果再返回給nginx。其實,Nginx就是一個反向代理伺服器。Nginx通過反向代理功能將動態請求轉向後端php-fpm,從而實現對PHP的解析支持,這就是Nginx實現PHP動態解析的原理。 Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI介面來調用。FastCGI介面在linux下是socket(這個socket可以是文件socket,也可以是ip socket)。為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用於啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如埠或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI介面,wrapper接收到請求,然後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接著,wrapper再將返回的數據通過FastCGI介面,沿著固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端。
當nginx接收到一個http請求時,通過配置文件找到對應的server。然後匹配server中的所有location,找到最匹配的。而在location中的命令會啟動不同的模塊去完成工作,比如rewrite模塊、index模塊。因此在nginx中模塊可以看作真正的勞動工作者。nginx的模塊是被編譯到nginx中的,屬於靜態方式。啟動nginx時,模塊被自動載入。
3. php.ini怎麼配置nginx
php5.3中要重啟PHP-fpm,單純的重啟nginx不能使php.ini設置生效php-fpm重啟
ps aux | grep php-fpm
kill -QUIT xxxx
/usr/local/php/sbin/php-fpm
nginx 啟動
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
4. 如何解決nginx ssi解析include路徑問題
安族答全的作法不修改nginx,調程序本身的路徑,這里就不討論了,目前的站點木有滲櫻辦法,要用就需兆喊慧要修改ssi模塊,再重新編譯nginx
修改如下:
src/http/moles/ngx_http_ssi_filter_mole.c 這個文件函數 ngx_http_ssi_include里注釋掉
if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {
return NGX_HTTP_SSI_ERROR;
}
轉載
5. 在Apache、IIS和Nginx開啟如何SSI
接下來到你的虛擬主機配置項里,配置如下的一行: Options -Indexes FollowSymLinks Includes 這個看情況,自己比對一下,有沒有漏掉哪個單詞。 最後附一個虛擬主機的參考配置(提示:不要直接拷貝): <氏租VirtualHost *:80> ServerName cmstop.run DocumentRoot "D:\SERVER\www\cmstop.run" AddType text/html .shtml AddOutputFilter INCLUDES .shtml <Directory /> Options -Indexes FollowSymLinks MultiViews Includes DirectoryIndex index.shtml index.html index.php AllowOverride All Order allow,deny Allow from all </Directory> AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps ServerSignature On </VirtualHost> Windows 2003 下的 IISwindows 2003 安裝好 IIS 之後默認是支持 .shtml 的,只要在 「WEB服務擴展」 允許 「在伺服器前端的包含文件」 即可,重啟 IIS 使配置生效。Windows 2000 下的 IIS 打開IIS,在要配置的網站上點擊右鍵,選擇屬性,並在接下來的窗口中點擊主目錄,再點擊右下方的配置,打開應用程序配置界面,如果列表中不存緩物在 .shtml 和 .shtm,則需要自己手動添加,點擊 添加 按鈕,在打開的窗口中輸入: 可執行文件:C:\WINDOWS\system32\inetsrv\ssinc.dll 擴展名:.shtml或.shtm 限制為:GET,POST 勾選「腳本引擎」和「確認文件是否存在」; 一路確定下去即可完成,之後重啟 IIS 使配置生效。Nginx下開啟SSI 這個最簡單,在 nginx 的 http 配置節中,添加如下的一行即殲哪兆可:http{
6. 如何正確配置 Nginx + PHP
1. php用php-fpm啟動,然後nginx
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
這樣就可以了
2.安裝一個集成的軟體phpstudy
7. 求教linux下nginx下如何配置ssi服務使得其支持php擴展
在php解析後執行ssi服務的時候 我沒有在vhost里的 虛擬主機配置里加入php解析後 支持 ssi服務 所以 ssi沒有支持php的擴展,這里我要留言強調下返宏nginx.conf內配置謹數php解析後執行ssi服務的和vhost里的沒有關祥世首系。
8. 面試官:請問Nginx為什麼比Apache性能好
Nginx才短短幾年,就拿下了web伺服器大筆江山,眾所周知,Nginx在處理大並發靜態請求方面,效率明顯高於httpd,甚至能輕松解決C10K問題。下面我們就來聊聊Web伺服器背後的一些原理。
進程是具有一定獨立功能的,在計算機中已經運行的程序的實體。在早期系統中(如linux 2.4以前),進程是基本運作單位,在支持線程的系統中(如windows,linux2.6)中,線程才是基本的運作單位,而進程只是線程的容器。程序本身只是指令、數據及其組織形式的描述,進程才是程序(那些指令和數據)的真正運行實例。若干進程有可能與同一個程序相關系,且每個進程皆可以同步(循序)或非同步(平行)的方式獨立運行。現代計算機系統可在同一段時間內以進程的形式將多個程序載入到存儲器中,並藉由時間共享(或稱時分復用),以在一個處理器上表現出同時(平行性)運行的感覺。同樣的,使用多線程技術(多線程即每一個線程都代表一個進程內的一個獨立執行上下文)的操作系統或計算機架構,同樣程序的平行線程,可在多 CPU 主機或網路上真正同時運行(在不同的CPU上)。
Web伺服器要為用戶提供服務,必須以某種方式,工作在某個套接字上。一般Web伺服器在處理檔讓用戶請求是,一般有如下三種方式可選擇:多進程方式、多線程方式、非同步方式。Web伺服器要為用戶提供服務,必須以某種方式,工作在某個套接字上。一般Web伺服器在處理用戶請求是,一般有如下三種方式可選擇:多進程方式、多線程方式、非同步方式。多進程方式:為每個請求啟動一個進程來處理。由於在操作系統中,生成進程、銷毀進程、進程間切換都很消耗CPU和內存,當負載高是,性能會明顯降低。優點: 穩定性!由於採用獨立進程處理獨立請求,而進程之間是獨立的,單個進程問題不會影響其他進程,因此穩定性最好。缺點: 資源佔用!當請求過大時,需要大量的進程處理請求,進程生成、切換開銷很大,而且進程間資源是獨立的,造成內存重復利用。多線程方式:一個進程中用多個線程處理用戶請求。由於線程開銷明顯小於進程,而且部分資源還可以共享,因此效率較高。優點:開銷較小!線程間部分數據是共享的,且線程生成與線程間的切換所需資源開銷比進程間切換小得多。缺點:穩定性!線程切換過快可能造成線程抖動,且線凳蠢廳程過多會造成伺服器不穩定。非同步方式:使用非阻塞方式處理請求,是三種方式中開銷最小的。但非同步方式雖然效率高,但要求也高,因為多任務之間的調度如果出現問題,就可能出現整體故障,因此使用非同步工作的,一般是一些功能相對簡單,但卻符合伺服器任務調度、且代碼中沒有影響調度的錯誤代碼存在的程序。優點:性能最好!一個進程或線程處理多個請求,不需要額外開銷,性能最好,資源佔用最低。缺點:穩定性!某個進程或線程出錯,可能導致大量請求無法處理,甚至導致整個服務宕機。
從上圖中我們可以看出,可以看出,越往後,阻塞越少,理論上效率也是最優。其五種I/O模型中,前三種屬於同步I/O,後兩者屬於非同步I/O。
同步I/O:
非同步I/O:
非同步 I/O 和 信號驅動I/O的區別:
注,其中iocp是Windows實現的,select、poll、epoll是Linux實現的,kqueue是FreeBSD實現的,/dev/poll是SUN的Solaris實現的。select、poll對應第3種(I/O復用)模型,iocp對應第5種(非同步I/O)模型,那麼epoll、kqueue、/dev/poll呢?其實也同select屬於同一種模型,只是更高級一些,可以看作有了第4種(信號驅動I/O)模型的某些特性,如callback機制。
答案是,他們無輪詢。因為他們用callback取代了。想想看,當套接字比較多的時候,每次select()都要通過遍歷FD_SETSIZE個Socket來完成調度,不管哪個Socket是活躍的,都遍歷一遍。這會浪費很多CPU時間。如果能給套接字注冊某個回調函數,當他們活躍時,自動完成相關操作,那就避免了輪詢,這正是epoll、kqueue、/dev/poll做的。這樣子說可能不好理解,那麼我說一個現實中的例子,假設你在大學讀書,住的宿舍樓有很多間房間,你的朋友要來找你。select版宿管大媽就會帶著你的朋友挨個房間去找,直到找到你為止。而epoll版宿管大媽會先記下每位同學的房間號,你的朋友來時,只需告訴你的朋友你住在哪個房間即可,不用親自帶著你的朋友滿大樓找人。如果來了10000個人,都要找自己住這棟樓的同學時,select版和epoll版宿管大媽,誰的效率更高,不言自明。同理,在高並發伺服器中,輪詢I/O是最耗時間的操作之一,select、epoll、/dev/poll的性能誰的性能更高,同樣十分明了。
誠然,Windows的IOCP非常出色,目前很少有支持asynchronous I/O的系統,但是由於其系統本身的局限性,大型伺服器還是在UNIX下。而且正如上面所述,kqueue、epoll、/dev/poll 與 IOCP相比,就是多了一層從內核數據到應用層的阻塞,從而不能算作asynchronous I/O類。但是,這層小小的阻塞無足輕重,kqueue、epoll、/dev/poll 已經做得很優秀了。
只有IOCP(windows實現)是asynchronous I/O,其他機制或多或少都會有一點阻塞。select(Linux實現)低效是因為每次它都需要輪詢。但低效也是相對的,視情況而定,也可通過良好的設計改善epoll(Linux實現)、kqueue(FreeBSD實現)、/dev/poll(Solaris實現)是Reacor模式,IOCP是Proactor模式。Apache 2.2.9之前只支持select模型,2.2.9之後支持epoll模型Nginx 支持epoll模型Java nio包是select模型
我們都知道Apache有三種工作模塊,分別為prefork、worker、event。prefork:多進程,每個請求用一個進程響應,這個過程會用到select機制來通知。worker:多線程,一個進程可以生成多個線程,每個線程響應一個請求,但通知機制還是select不過可以接受更多的請求。event:基於非同步I/O模型,一個進程或線程,每個進程或線程響應多個用戶請求,它是基於事件驅動(也就是epoll機制)實現的。
如果不用「--with-mpm」顯式指定某種MPM,prefork就是Unix平台上預設的MPM.它所採用的預派生子進程方式也是 Apache1.3中採用的模式。prefork本身並沒有使用到線程,2.0版使用它是為了與1.3版保持兼容性;另一方面,prefork用單獨的子進程來處理不同的請求,進程之間是彼此獨立的,這也使其成為最穩定的MPM之一。
相對於prefork,worker是2.0版中全新的支持多線程和多進程混合模型的MPM。由於使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小於基於進程的伺服器。但是,worker也使用了多進程,每個進程又生成多個線程,以獲得基於進程伺服器的穩定性,這種MPM的工作方 式將是Apache2.0的發展趨勢。
一個進程響應多個用戶請求,利用callback機制,讓套接字復用,請求過來後進程並不處理請求,而是直接交由其他機制來處理,通過epoll機制來通知請求是否完成;在這個過程中,進程本身一直處於空閑狀態,可以一直接收用戶請求。可以實現一個進程程響應多個用戶請求。支持持海量並發連接數,消耗更少的資源。
有幾個基本條件:
剛好,Nginx 支持以上所有特性。所以Nginx官網上說,Nginx支持50000並發,是有依據的。
傳統上基於進程或線程模型架構的web服務通過每進程或每線程處理並發連接請求,這勢必會在網路和I/O操作時產生阻塞,其另一個必然結果則是對內存或CPU的利用率低下。生成一個新的進程/線程需要事先備好其運行時環境,這包括為其分配堆內存和棧內存,以及為其創建新的執行上下文等。這些操作都需要佔用CPU,而且過多的進程/線程還會帶來線程抖動或頻繁的上下文切換,系統性能也會由此進一步下降。另一種高性能web伺服器/web伺服器反向代理:Nginx(Engine X),nginx的主要著眼點就是其高性能以及對物理計算資源的高密度利用,因此其採用了不同的架構模型。受啟發於多種操作系統設計中基於「事件」的高級處理機制,nginx採用了模塊化、事件驅動、非同步、單線程及非阻塞的架構,並大量採用了多路復用及事件通知機制。在nginx中,連接請求由為數不多的幾個僅包含一個線程的進程worker以高效的回環(run-loop)機制進行處理,而每個worker可以並行處理數千個的並發連接及請求。
Nginx會按需同時運行多個進程:一個主進程(master)和幾個工作進程(worker),配置了緩存時還會有緩存載入器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過「共享內存」的機制實現進程間通信。主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。
主進程主要完成如下工作:
註:如果負載以CPU密集型應用為主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型為主,如響應大量內容給客戶端,則worker數應該為CPU個數的1.5或2倍。
Nginx的代碼是由一個核心和一系列的模塊組成, 核心主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啟用網路協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。這些功能模塊大致可以分為事件模塊、階段性處理器、輸出過濾器、變數處理器、協議、upstream和負載均衡幾個類別,這些共同組成了nginx的http功能。事件模塊主要用於提供OS獨立的(不同操作系統的事件機制有所不同)事件通知機制如kqueue或epoll等。協議模塊則負責實現nginx通過http、tls/ssl、smtp、pop3以及imap與對應的客戶端建立會話。在Nginx內部,進程間的通信是通過模塊的pipeline或chain實現的;換句話說,每一個功能或操作都由一個模塊來實現。例如,壓縮、通過FastCGI或uwsgi協議與upstream伺服器通信,以及與memcached建立會話等。
處理靜態文件,索引文件以及自動索引;反向代理加速(無緩存),簡單的負載均衡和容錯;FastCGI,簡單的負載均衡和容錯;模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求並發處理;SSL 和 TLS SNI 支持;
使用外部 HTTP 認證伺服器重定向用戶到 IMAP/POP3 後端;使用外部 HTTP 認證伺服器認證用戶後連接重定向到內部的 SMTP 後端;認證方法:POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;IMAP: IMAP LOGIN;SMTP: AUTH LOGIN PLAIN CRAM-MD5;SSL 支持;在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;
FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;MacOS X (10.4) PPC;Windows 編譯版本支持 windows 系列操作系統
一個主進程和多個工作進程,工作進程運行於非特權用戶;kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT, EV_EOF, 有效數據的數目,錯誤代碼;sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;輸入過濾 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;10,000 非活動的 HTTP keep-alive 連接僅需要 2.5M 內存。最小化的數據拷貝操作;
基於IP 和名稱的虛擬主機服務;Memcached 的 GET 介面;支持 keep-alive 和管道連接;靈活簡單的配置;重新配置和在線升級而無須中斷客戶的工作進程;可定製的訪問日誌,日誌寫入緩存,以及快捷的日誌回卷;4xx-5xx 錯誤代碼重定向;基於 PCRE 的 rewrite 重寫模塊;基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;PUT, DELETE, 和 MKCOL 方法;支持 FLV (Flash 視頻);帶寬限制;
在高連接並發的情況下,Nginx是Apache伺服器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平台之一. 能夠支持高達 50,000 個並發連接數的響應, 感謝Nginx為我們選擇了 epoll and kqueue 作為開發模型。Nginx作為負載均衡伺服器: Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務, 也可以支持作為 HTTP代理 伺服器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。作為郵件代理伺服器: Nginx 同時也是一個非常優秀的郵件代理伺服器(最早開發這個產品的目的之一也是作為郵件代理伺服器), Last.fm 描述了成功並且美妙的使用經驗.Nginx 安裝非常的簡單 , 配置文件非常簡潔(還能夠支持perl語法),Bugs 非常少的伺服器: Nginx 啟動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動. 你還能夠 不間斷服務的情況下進行軟體版本的升級 。Nginx 的誕生主要解決C10K問題
9. php利用Nginx如何實現反向代理
我們要首先准備好環境,我准備好了nginx環境和apache的環境
10. 眾多語言中,為什麼很多伺服器都選擇Nginx呢讓大佬告訴你
Nginx是一個高性能的Web和反向代理伺服器,它具有有很多非常優越的特性:
作為負載均衡伺服器 :Nginx既可以在內部直接支持Rails和PHP,也可以支持作為HTTP代
理伺服器對外進行服務。Nginx用C編寫,不論是系統資源開銷還是CPU使用效率都比
Perlbal要好的多。
作為郵件代理伺服器 :Nginx同時也是-一個非常優秀的郵件代理伺服器(最早開發這個產品的目的之-也是作為郵件代理伺服器),Last.fm 描述了成功並且美妙的使用經驗。
Nginx安裝非常的簡李鍵單,配置文件非常簡潔(還能夠支持per語法),Bugs非 常少的伺服器:
Nginx啟動特別容易,並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟
動。你還能夠在不間斷服務的情況下進行軟體版本的升級。
處理靜態文件,索引文件以及自動索引;
反向代理加速(無緩存), 簡單的負載均衡和容錯;
FastCGI,簡單的負載均衡和容錯;
模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses,以及SSiI-ilter 。
在SSI過濾器中,到同一個proxy或者FastCGI的多個子請求並發處理;
SSL和TLSSNI支持;
使用外部HTTP認證伺服器重定向用戶到IMAP/POP3後端;
使用外部HTTP認證伺服器認證用戶後連接重定向到內部的SMTP後端;
認證方法:
POP3: POP3 USER/PASS, APOP, AUTH LOGIN PL AIN CRAM-MD5;
IMAP: IMAP LOGIN;
SMTP: AUTH LOGIN PLAIN CRAM-MD5;
SSL支持;
在IMAP和POP3模式下的STARTTLS和STLS支持;
FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
Linux2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
MacOS X (10.4) PPC;
一個主進程和多個工作進程。工作進程是單線程的,且不需要特殊授權即可運行;
kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), t signals (Linux 2.2.19+), /dev/poll (Solaris711/99+), select,以及poll支持;
kqueue支持的不同功能包括EV_ _CLEAR, EV_ DISABLE (臨時禁止事件),NOTE_ _LOWAT, EV_ EOF, 有效數據的數目,錯誤代碼;
sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+),和sendfilev(Solaris 8 7/01+)支持;
輸入過濾(FreeBSD 4.1+)以及TCP_ _DEFER_ ACCEPT (Linux2.4+)支持;
10,000 非活動的HTTP keep-alive連接僅需要2.5M內陵坦存。
最小化的數據拷貝操作;
基於IP和名稱的虛擬主機服務;
Memcached的GET介面;
支持keep-alive和管道連接;
靈活簡單的配置;
重新配置和在線升級而無須中斷客戶的工作進程;
可定製的訪問日誌,日誌寫入緩存,以及快捷的日誌回卷;
4xx-5xx錯誤代碼重尺擾桐定向;
基於PCRE的rewrite重寫模塊;
基於客戶端IP地址和HTTP基本認證的訪問控制;
PUT, DELETE,和MKCOL方法;
支持FLV (Flash視頻) ;
帶寬限制;
內嵌的perl
通過aio. read() 1 aio _write() 的套接字工作的實驗模塊,僅在FreeBSD下。
對線程的實驗化支持,FreeBSD 4.x的實現基於rfork()
Nginx主要的英語站點是htp://sysoev.ru/en/
本人有自己整理大數據學習的功課,閑置著也無用了。
獲取方式:
私信方式:
第一步,點擊頭像。
第二部:頭像旁邊有一個私信按鈕,發送{學習資料}即可!