請解釋一下什麼是Nginx?它的優勢和功能?
Nginx是一個web服務器和方向代理服務器,用於HTTP、HTTPS、SMTP、POP3和IMAP協議。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
優點:
(1)更快
這表現在兩個方面:一方面,在正常情況下,單次請求會得到更快的響應;另一方面,在高峯期(如有數以萬計的併發請求),Nginx可以比其他Web服務器更快地響應請求。
(2)高擴展性,跨平臺
Nginx的設計極具擴展性,它完全是由多個不同功能、不同層次、不同類型且耦合度極低的模塊組成。因此,當對某一個模塊修復Bug或進行升級時,可以專注於模塊自身,無須在意其他。而且在HTTP模塊中,還設計了HTTP過濾器模塊:一個正常的HTTP模塊在處理完請求後,會有一串HTTP過濾器模塊對請求的結果進行再處理。這樣,當我們開發一個新的HTTP模塊時,不但可以使用諸如HTTP核心模塊、events模塊、log模塊等不同層次或者不同類型的模塊,還可以原封不動地複用大量已有的HTTP過濾器模塊。這種低耦合度的優秀設計,造就了Nginx龐大的第三方模塊,當然,公開的第三方模塊也如官方發佈的模塊一樣容易使用。
Nginx的模塊都是嵌入到二進制文件中執行的,無論官方發佈的模塊還是第三方模塊都是如此。這使得第三方模塊一樣具備極其優秀的性能,充分利用Nginx的高併發特性,因此,許多高流量的網站都傾向於開發符合自己業務特性的定製模塊。
(3)高可靠性:用於反向代理,宕機的概率微乎其微
高可靠性是我們選擇Nginx的最基本條件,因爲Nginx的可靠性是大家有目共睹的,很多家高流量網站都在覈心服務器上大規模使用Nginx。Nginx的高可靠性來自於其核心框架代碼的優秀設計、模塊設計的簡單性;另外,官方提供的常用模塊都非常穩定,每個worker進程相對獨立,master進程在1個worker進程出錯時可以快速“拉起”新的worker子進程提供服務。
(4)低內存消耗
一般情況下,10 000個非活躍的HTTP Keep-Alive連接在Nginx中僅消耗2.5MB的內存,這是Nginx支持高併發連接的基礎。
(5)單機支持10萬以上的併發連接
這是一個非常重要的特性!隨着互聯網的迅猛發展和互聯網用戶數量的成倍增長,各大公司、網站都需要應付海量併發請求,一個能夠在峯值期頂住10萬以上併發請求的Server,無疑會得到大家的青睞。理論上,Nginx支持的併發連接上限取決於內存,10萬遠未封頂。當然,能夠及時地處理更多的併發請求,是與業務特點緊密相關的。
(6)熱部署
master管理進程與worker工作進程的分離設計,使得Nginx能夠提供熱部署功能,即可以在7×24小時不間斷服務的前提下,升級Nginx的可執行文件。當然,它也支持不停止服務就更新配置項、更換日誌文件等功能。
(7)最自由的BSD許可協議
這是Nginx可以快速發展的強大動力。BSD許可協議不只是允許用戶免費使用Nginx,它還允許用戶在自己的項目中直接使用或修改Nginx源碼,然後發佈。這吸引了無數開發者繼續爲Nginx貢獻自己的智慧。
以上7個特點當然不是Nginx的全部,擁有無數個官方功能模塊、第三方功能模塊使得Nginx能夠滿足絕大部分應用場景,這些功能模塊間可以疊加以實現更加強大、複雜的功能,有些模塊還支持Nginx與Perl、Lua等腳本語言集成工作,大大提高了開發效率。這些特點促使用戶在尋找一個Web服務器時更多考慮Nginx。
選擇Nginx的核心理由還是它能在支持高併發請求的同時保持高效的服務
nginx的常用算法實現?
- round-robin
round-robin的意思是循環輪詢。Nginx最簡單的負載均衡配置如下
http {
upstream app1 {
server 10.10.10.1;
server 10.10.10.2;
}
server {
listen 80;
location / {
proxy_pass http://app1;
}
}
upstream app1用來指定一個服務器組,該組的名字是app1,包含兩臺服務器。在指定服務器組裏麪包含的服務器時以形式“server ip/domain:port”的形式指定,其中80端口可以忽略。然後在接收到請求時通過“proxy_pass http://app1”把對應的請求轉發到組app1上。Nginx默認的負載均衡算法就是循環輪詢,如上配置我們採用的就是循環輪詢,其會把接收到的請求循環的分發給其包含的(當前可用的)服務器。使用如上配置時,Nginx會把第1個請求給10.10.10.1,把第2個請求給10.10.10.2,第3個請求給10.10.10.1,以此類推。
2.least-connected
least-connected算法的中文翻譯是最少連接,即每次都找連接數最少的服務器來轉發請求。例如Nginx負載中有兩臺服務器,A和B,當Nginx接收到一個請求時,A正在處理的請求數是10,B正在處理的請求數是20,則Nginx會把當前請求交給A來處理。要啓用最少連接負載算法只需要在定義服務器組時加上“least_conn”,如:
upstream app1 {
least_conn;
server 10.10.10.1;
server 10.10.10.2;
}
3、ip-hash
ip-hash算法會根據請求的客戶端IP地址來決定當前請求應該交給誰。使用ip-hash算法時Nginx會確保來自同一客戶端的請求都分發到同一服務器。要使用ip-hash算法時只需要在定義服務器組時加上“ip-hash ”指令,如:
upstream app1 {
ip_hash;
server 10.10.10.1;
server 10.10.10.2;
}
4、weighted
weighted算法也就是權重算法,會根據每個服務的權重來分發請求,權重大的請求相對會多分發一點,權重小的會少分發一點。這通常應用於多個服務器的性能不一致時。需要使用權重算法時只需要在定義服務器組時在服務器後面指定參數weight,如:
upstream app1 {
server 10.10.10.1 weight=3;
server 10.10.10.2;
}
爲什麼不使用多線程?
pache: 創建多個進程或線程,而每個進程或線程都會爲其分配cpu和內存(線程要比進程小的多,所以worker支持比perfork高的併發),併發過大會榨乾服務器資源。
Nginx: 採用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進程的工作進程的數量)(epoll),不會爲每個請求分配cpu和內存資源,節省了大量資源,同時也減少了大量的CPU的上下文切換。所以才使得Nginx支持更高的併發。
Nginx是如何處理一個請求的呢?
首先,nginx在啓動時,會解析配置文件,得到需要監聽的端口與ip地址,然後在nginx的master進程裏面
先初始化好這個監控的socket,再進行listen
然後再fork出多個子進程出來, 子進程會競爭accept新的連接。
此時,客戶端就可以向nginx發起連接了。當客戶端與nginx進行三次握手,與nginx建立好一個連接後,此時,某一個子進程會accept成功,然後創建nginx對連接的封裝,即ngx_connection_t結構體接着,根據事件調用相應的事件處理模塊,如http模塊與客戶端進行數據的交換,最後,nginx或客戶端來主動關掉連接,到此,一個連接就壽終正寢了
動態資源、靜態資源分離的原因
動態資源、靜態資源分離是讓動態網站裏的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以後,我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路
動態資源、靜態資源分離簡單的概括是:動態文件與靜態文件的分離
二者分離的原因
在我們的軟件開發中,有些請求是需要後臺處理的(如:.jsp,.do等等),有些請求是不需要經過後臺處理的(如:css、html、jpg、js等等文件)
這些不需要經過後臺處理的文件稱爲靜態文件,否則動態文件。因此我們後臺處理忽略靜態文件。這會有人又說那我後臺忽略靜態文件不就完了嗎
當然這是可以的,但是這樣後臺的請求次數就明顯增多了。在我們對資源的響應速度有要求的時候,我們應該使用這種動靜分離的策略去解決
動、靜分離將網站靜態資源(HTML,JavaScript,CSS,img等文件)與後臺應用分開部署,提高用戶訪問靜態代碼的速度,降低對後臺應用訪問
這裏我們將靜態資源放到nginx中,動態資源轉發到tomcat服務器中
請列舉Nginx的一些特性
- Nginx服務器的特性包括:
- 反向代理/L7負載均衡器
- 嵌入式Perl解釋器
- 動態二進制升級
- 可用於重新編寫URL,具有非常好的PCRE支持
請列舉Nginx和Apache 之間的不同點
nginx | apache |
---|---|
1.nginx 是一個基於web服務器 | 1.Apache 是一個基於流程的服務器 |
2.所有請求都由一個線程來處理 | 2.單線程處理單個請求 |
3.nginx避免子進程的概念 | 3.apache是基於子進程的 |
4.nginx類似於速度 | 4.apache類似於功率 |
5.nginx在內存消耗和連接方面比較好 | 5.apache在內存消耗和連接方面並沒有提高 |
6.nginx在負載均衡方面表現較好 | 6.apache當流量達到進程的極限時,apache將拒絕新的連接 |
7.對於PHP來說,nginx更可取,因爲他支持PHP | 7.apache支持的php python Perl和其他語言,使用插件,當應用程序基於python和ruby時,它非常有用 |
8.nginx 不支持像ibmi 和 openvms 一樣的os | 8.apache支持更多的os |
9.nginx 只具有核心功能 | 9.apache 提供了比Nginx更多的功能 |
10.nginx 性能和可伸縮性不依賴於硬件 | 10.apache 依賴於CPU和內存等硬件組件 |
請解釋Nginx如何處理HTTP請求。
Nginx使用反應器模式。主事件循環等待操作系統發出準備事件的信號,這樣數據就可以從套接字讀取,在該實例中讀取到緩衝區並進行處理。單個線
程可以提供數萬個併發連接。
在Nginx中,如何使用未定義的服務器名稱來阻止處理請求?
只需將請求刪除的服務器就可以定義爲:
Server {
listen 80;
server_name “ “ ;
return 444;
}
這裏,服務器名被保留爲一個空字符串,它將在沒有“主機”頭字段的情況下匹配請求,而一個特殊的Nginx的非標準代碼444被返回,從而終止連接。
使用“反向代理服務器”的優點是什麼?
反向代理服務器可以隱藏源服務器的存在和特徵。它充當互聯網雲和web服務器之間的中間層。這對於安全方面來說是很好的,特別是當您使用web託管服務時。
請列舉Nginx服務器的最佳用途。
Nginx服務器的最佳用法是在網絡上部署動態HTTP內容,使用SCGI、WSGI應用程序服務器、用於腳本的FastCGI處理程序。它還可以作爲負載均衡器。
請解釋Nginx服務器上的Master和Worker進程分別是什麼?
Master進程:讀取及評估配置和維持
Worker進程:處理請求
請解釋你如何通過不同於80的端口開啓Nginx?
爲了通過一個不同的端口開啓Nginx,你必須進入/etc/Nginx/sites-enabled/,如果這是默認文件,那麼你必須打開名爲“default”的文件。編輯文件,並放置在你想要的端口:
Like server { listen 81; }
請解釋是否有可能將Nginx的錯誤替換爲502錯誤、503?
502 =錯誤網關
503 =服務器超載
有可能,但是您可以確保fastcgi_intercept_errors被設置爲ON,並使用錯誤頁面指令。
Location / {
fastcgi_pass 127.0.01:9001;
fastcgi_intercept_errors on;
error_page 502 =503/error_page.html;
在Nginx中,解釋如何在URL中保留雙斜線?
要在URL中保留雙斜線,就必須使用merge_slashes_off;
語法:merge_slashes [on/off]
默認值: merge_slashes on
環境: http,server
請解釋ngx_http_upstream_module的作用是什麼?
ngx_http_upstream_module用於定義可通過fastcgi傳遞、proxy傳遞、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的服務器組。
請解釋什麼是C10K問題?
C10K問題是指無法同時處理大量客戶端(10,000)的網絡套接字。
請陳述stub_status和sub_filter指令的作用是什麼?
Stub_status指令:該指令用於瞭解Nginx當前狀態的當前狀態,如當前的活動連接,接受和處理當前讀/寫/等待連接的總數
Sub_filter指令:它用於搜索和替換響應中的內容,並快速修復陳舊的數據
解釋Nginx是否支持將請求壓縮到上游?
您可以使用Nginx模塊gunzip將請求壓縮到上游。gunzip模塊是一個過濾器,它可以對不支持“gzip”編碼方法的客戶機或服務器使用“內容編碼:gzip”來解壓縮響應。
解釋如何在Nginx中獲得當前的時間?
要獲得Nginx的當前時間,必須使用SSI模塊、$date_gmt和 $date_local的變量。
Proxy_set_header THE-TIME $date_gmt;
用Nginx服務器解釋-s的目的是什麼?
用於運行Nginx -s參數的可執行文件。
解釋如何在Nginx服務器上添加模塊?
在編譯過程中,必須選擇Nginx模塊,因爲Nginx不支持模塊的運行時間選擇。