更新時間:2023-01-29 14:46:17 來源:動力節點 瀏覽1308次
Nginx 是一款輕量級的 Web 服務器、反向代理服務器,由于它的內存占用少,啟動極快,高并發能力強,在互聯網項目中廣泛應用。所以我們在面試的時候,相關的面試題會很多。
1.Nginx 應用場景?
http 服務器。Nginx 是一個 http 服務可以獨立提供 http 服務。可以做網頁靜態服務器。
虛擬主機。可以實現在一臺服務器虛擬出多個網站,例如個人網站使用的虛擬機。
反向代理,負載均衡。當網站的訪問量達到一定程度后,單臺服務器不能滿足用戶的請求時,需要用多臺服務器集群可以使用 nginx 做反向代理。并且多臺服務器可以平均分擔負載,不會應為某臺服務器負載高宕機而某臺服務器閑置的情況。
nginz 中也可以配置安全管理、比如可以使用 Nginx 搭建 API 接口網關, 對每個接口服務進行攔截。
2.Nginx 怎么處理請求的?
server{#第一個Server區塊開始,表示一個獨立的虛擬主機站點
listen 80;#提供服務的端口,默認80
server_namelocalhost;#提供服務的域名主機名
location/{#第一個location區塊開始
roothtml;#站點的根目錄,相當于Nginx的安裝目錄
indexindex.htmlindex.html;#默認的首頁文件,多個用空格分開
}#第一個location區塊結果
首先,Nginx 在啟動時,會解析配置文件,得到需要監聽的端口與 IP 地址,然后在 Nginx 的 Master 進程里面先初始化好這個監控的 Socket(創建 S ocket,設置 addr、reuse 等選項,綁定到指定的 ip 地址端口,再 listen 監聽)。
然后,再 fork(一個現有進程可以調用 fork 函數創建一個新進程。由 fork 創建的新進程被稱為子進程) 出多個子進程出來。
之后,子進程會競爭 accept 新的連接。此時,客戶端就可以向 nginx 發起連接了。當客戶端與 nginx 進行三次握手,與 nginx 建立好一個連接后。此時,某一個子進程會 accept 成功,得到這個建立好的連接的 Socket ,然后創建 nginx 對連接的封裝,即 ngx_connection_t 結構體。
接著,設置讀寫事件處理函數,并添加讀寫事件來與客戶端進行數據的交換。
最后,Nginx 或客戶端來主動關掉連接,到此,一個連接就壽終正寢了。
3.Nginx 是如何實現高并發的?
如果一個 server 采用一個進程 (或者線程) 負責一個 request 的方式,那么進程數就是并發數。那么顯而易見的,就是會有很多進程在等待中。等什么?最多的應該是等待網絡傳輸。
而 Nginx 的異步非阻塞工作方式正是利用了這點等待的時間。在需要等待的時候,這些進程就空閑出來待命了。因此表現為少數幾個進程就解決了大量的并發問題。
Nginx 是如何利用的呢,簡單來說:同樣的 4 個進程,如果采用一個進程負責一個 request 的方式,那么,同時進來 4 個 request 之后,每個進程就負責其中一個,直至會話關閉。期間,如果有第 5 個 request 進來了。就無法及時反應了,因為 4 個進程都沒干完活呢,因此,一般有個調度進程,每當新進來了一個 request ,就新開個進程來處理。
回想下,BIO 是不是存在這樣的問題?
Nginx 不這樣,每進來一個 request ,會有一個 worker 進程去處理。但不是全程的處理,處理到什么程度呢?處理到可能發生阻塞的地方,比如向上游(后端)服務器轉發 request ,并等待請求返回。那么,這個處理的 worker 不會這么傻等著,他會在發送完請求后,注冊一個事件:“如果 upstream 返回了,告訴我一聲,我再接著干”。于是他就休息去了。此時,如果再有 request 進來,他就可以很快再按這種方式處理。而一旦上游服務器返回了,就會觸發這個事件,worker 才會來接手,這個 request 才會接著往下走。
這就是為什么說,Nginx 基于事件模型。
由于 web server 的工作性質決定了每個 request 的大部份生命都是在網絡傳輸中,實際上花費在 server 機器上的時間片不多。這是幾個進程就解決高并發的秘密所在。即:
webserver 剛好屬于網絡 IO 密集型應用,不算是計算密集型。
異步,非阻塞,使用 epoll ,和大量細節處的優化。也正是 Nginx 之所以然的技術基石。
4.什么是正向代理?
一個位于客戶端和原始服務器 (origin server) 之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端。
客戶端才能使用正向代理。正向代理總結就一句話:代理端代理的是客戶端。例如說:我們使用的 OpenVPN 等等。
5.什么是反向代理?
反向代理(Reverse Proxy)方式,是指以代理服務器來接受 Internet 上的連接請求,然后將請求,發給內部網絡上的服務器并將從服務器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。
反向代理總結就一句話:代理端代理的是服務端。
6.Nginx 目錄結構有哪些?
tree/usr/local/nginx
/usr/local/nginx
├──client_body_temp
├──conf#Nginx所有配置文件的目錄
│├──fastcgi.conf#fastcgi相關參數的配置文件
│├──fastcgi.conf.default#fastcgi.conf的原始備份文件
│├──fastcgi_params#fastcgi的參數文件
│├──fastcgi_params.default
│├──koi-utf
│├──koi-win
│├──mime.types#媒體類型
│├──mime.types.default
│├──nginx.conf#Nginx主配置文件
│├──nginx.conf.default
│├──scgi_params#scgi相關參數文件
│├──scgi_params.default
│├──uwsgi_params#uwsgi相關參數文件
│├──uwsgi_params.default
│└──win-utf
├──fastcgi_temp#fastcgi臨時數據目錄
├──html#Nginx默認站點目錄
│├──50x.html#錯誤頁面優雅替代顯示文件,例如當出現502錯誤時會調用此頁面
│└──index.html#默認的首頁文件
├──logs#Nginx日志目錄
│├──access.log#訪問日志文件
│├──error.log#錯誤日志文件
│└──nginx.pid#pid文件,Nginx進程啟動后,會把所有進程的ID號寫到此文件
├──proxy_temp#臨時目錄
├──sbin#Nginx命令目錄
│└──nginx#Nginx的啟動命令
├──scgi_temp#臨時目錄
└──uwsgi_temp#臨時目錄
7.Nginx 配置文件 nginx.conf 有哪些屬性模塊?
worker_processes 1;#worker進程的數量
events{#事件區塊開始
worker_connections 1024;#每個worker進程支持的最大連接數
}#事件區塊結束
http{#HTTP區塊開始
include mime.types;#Nginx支持的媒體類型庫文件
default_type application/octet-stream;#默認的媒體類型
sendfile on;#開啟高效傳輸模式
keepalive_timeout 65;#連接超時
server{#第一個Server區塊開始,表示一個獨立的虛擬主機站點
listen 80;#提供服務的端口,默認80
server_name localhost;#提供服務的域名主機名
location/{#第一個location區塊開始
root html;#站點的根目錄,相當于Nginx的安裝目錄
index index.html index.htm;#默認的首頁文件,多個用空格分開
}#第一個location區塊結果
error_page 500502503504 /50x.html;#出現對應的http狀態碼時,使用50x.html回應客戶
location=/50x.html{#location區塊開始,訪問50x.html
root html;#指定對應的站點目錄為html
}
}
......
以上就是“一些會經常被問到的nginx面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習