更新時(shí)間:2023-01-29 14:46:17 來源:動力節(jié)點(diǎn) 瀏覽1840次
Nginx 是一款輕量級的 Web 服務(wù)器、反向代理服務(wù)器,由于它的內(nèi)存占用少,啟動極快,高并發(fā)能力強(qiáng),在互聯(lián)網(wǎng)項(xiàng)目中廣泛應(yīng)用。所以我們在面試的時(shí)候,相關(guān)的面試題會很多。

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

初級 202925

初級 203221

初級 202629

初級 203743