主頁 >  其他 > 40 個 Nginx 常問面試題

40 個 Nginx 常問面試題

2022-11-26 07:27:37 其他

 

Nginx 是一款輕量級的 Web 服務器、反向代理服務器,由于它的記憶體占用少,啟動極快,高并發能力強,在互聯網專案中廣泛應用,

那么關于 Nginx 的核心技術點有哪些呢?

 

 

 

 

什么是 Nginx?

Nginx 是一個 輕量級 / 高性能的反向代理 Web 服務器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 協議,他實作非常高效的反向代理、負載平衡,他可以處理 2-3 萬并發連接數,官方監測能支持 5 萬并發,現在中國使用 nginx 網站用戶有很多,例如:新浪、網易、 騰訊等,

Nginx 有哪些優點?

  • 跨平臺、配置簡單,

  • 非阻塞、高并發連接:處理 2-3 萬并發連接數,官方監測能支持 5 萬并發,

  • 記憶體消耗

  • 小:開啟 10 個 Nginx 才占 150M 記憶體,

  • 成本低廉,且開源,

  • 穩定性高,宕機的概率非常小,

  • 內置的健康檢查功能:如果有一個服務器宕機,會做一個健康檢查,再發送的請求就不會發送到宕機的服務器了,重新將請求提交到其他的節點上

Nginx 應用場景?

  • http 服務器,Nginx 是一個 http 服務可以獨立提供 http 服務,可以做網頁靜態服務器,

  • 虛擬主機,可以實作在一臺服務器虛擬出多個網站,例如個人網站使用的虛擬機,

  • 反向代理,負載均衡,當網站的訪問量達到一定程度后,單臺服務器不能滿足用戶的請求時,需要用多臺服務器集群可以使用 nginx 做反向代理,并且多臺服務器可以平均分擔負載,不會應為某臺服務器負載高宕機而某臺服務器閑置的情況,

  • nginz 中也可以配置安全管理、比如可以使用 Nginx 搭建 API 介面網關, 對每個介面服務進行攔截,

Nginx 怎么處理請求的?

server { # 第一個Server區塊開始,表示一個獨立的虛擬主機站點
   listen       80;# 提供服務的埠,默認80
   server_name localhost; # 提供服務的域名主機名
   location / { # 第一個location區塊開始
     root   html; # 站點的根目錄,相當于Nginx的安裝目錄
     index  index.html index.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 或客戶端來主動關掉連接,到此,一個連接就壽終正寢了,

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 之所以然的技識訓石,

什么是正向代理?

一個位于客戶端和原始服務器 (origin server) 之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容回傳給客戶端,

客戶端才能使用正向代理,正向代理總結就一句話:代理端代理的是客戶端,例如說:我們使用的 OpenVPN 等等,

什么是反向代理?

反向代理(Reverse Proxy)方式,是指以代理服務器來接受 Internet 上的連接請求,然后將請求,發給內部網路上的服務器并將從服務器上得到的結果回傳給 Internet 上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器,

反向代理總結就一句話:代理端代理的是服務端,

反向代理服務器的優點是什么?

反向代理服務器可以隱藏源服務器的存在和特征,它充當互聯網云和 web 服務器之間的中間層,這對于安全方面來說是很好的,特別是當您使用 web 托管服務時,

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 # 臨時目錄

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
        }
    }
    ......

 

 

cookie 和 session 區別?

共同:

存放用戶資訊,存放的形式:key-value 格式 變數和變數內容鍵值對,

區別:

cookie

  • 存放在客戶端瀏覽器

  • 每個域名對應一個 cookie,不能跨躍域名訪問其他 cookie

  • 用戶可以查看或修改 cookie

  • http 回應報文里面給你瀏覽器設定

  • 鑰匙(用于打開瀏覽器上鎖頭)

session:

  • 存放在服務器(檔案,資料庫,redis)

  • 存放敏感資訊

  • 鎖頭

為什么 Nginx 不使用多執行緒?

Apache: 創建多個行程或執行緒,而每個行程或執行緒都會為其分配 cpu 和記憶體(執行緒要比行程小的多,所以 worker 支持比 perfork 高的并發),并發過大會榨干服務器資源,

Nginx: 采用單執行緒來異步非阻塞處理請求(管理員可以配置 Nginx 主行程的作業行程的數量)(epoll),不會為每個請求分配 cpu 和記憶體資源,節省了大量資源,同時也減少了大量的 CPU 的背景關系切換,所以才使得 Nginx 支持更高的并發,

nginx 和 apache 的區別

輕量級,同樣起 web 服務,比 apache 占用更少的記憶體和資源,

抗并發,nginx 處理請求是異步非阻塞的,而 apache 則是阻塞性的,在高并發下 nginx 能保持低資源,低消耗高性能,

高度模塊化的設計,撰寫模塊相對簡單,

最核心的區別在于 apache 是同步多行程模型,一個連接對應一個行程,nginx 是異步的,多個連接可以對應一個行程,

 

 

 

什么是動態資源、靜態資源分離?

動態資源、靜態資源分離,是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以后我們就可以根據靜態資源的特點將其做快取操作,這就是網站靜態化處理的核心思路,

動態資源、靜態資源分離簡單的概括是:動態檔案與靜態檔案的分離,

為什么要做動、靜分離?

在我們的軟體開發中,有些請求是需要后臺處理的(如:.jsp,.do 等等),有些請求是不需要經過后臺處理的(如:css、html、jpg、js 等等檔案),這些不需要經過后臺處理的檔案稱為靜態檔案,否則動態檔案,

因此我們后臺處理忽略靜態檔案,這會有人又說那我后臺忽略靜態檔案不就完了嗎?當然這是可以的,但是這樣后臺的請求次數就明顯增多了,在我們對資源的回應速度有要求的時候,我們應該使用這種動靜分離的策略去解決動、靜分離將網站靜態資源(HTML,JavaScript,CSS,img 等檔案)與后臺應用分開部署,提高用戶訪問靜態代碼的速度,降低對后臺應用訪問

這里我們將靜態資源放到 Nginx 中,動態資源轉發到 Tomcat 服務器中去,

當然,因為現在七牛、阿里云等 CDN 服務已經很成熟,主流的做法,是把靜態資源快取到 CDN 服務中,從而提升訪問速度,

相比本地的 Nginx 來說,CDN 服務器由于在國內有更多的節點,可以實作用戶的就近訪問,并且,CDN 服務可以提供更大的帶寬,不像我們自己的應用服務,提供的帶寬是有限的,

什么叫 CDN 服務?

CDN ,即內容分發網路,

其目的是,通過在現有的 Internet 中 增加一層新的網路架構,將網站的內容發布到最接近用戶的網路邊緣,使用戶可就近取得所需的內容,提高用戶訪問網站的速度,

一般來說,因為現在 CDN 服務比較大眾,所以基本所有公司都會使用 CDN 服務,

Nginx 怎么做的動靜分離?

只需要指定路徑對應的目錄,location / 可以使用正則運算式匹配,并指定對應的硬碟中的目錄,如下:(操作都是在 Linux 上)

location /image/ {
    root /usr/local/static/;
    autoindex on;
}
步驟:
# 創建目錄
mkdir /usr/local/static/image
 
# 進入目錄
cd  /usr/local/static/image
 
# 上傳照片
photo.jpg
 
# 重啟nginx
sudo nginx -s reload

打開瀏覽器 輸入 server_name/image/1.jpg 就可以訪問該靜態圖片了

Nginx 負載均衡的演算法怎么實作的? 策略有哪些?

為了避免服務器崩潰,大家會通過負載均衡的方式來分擔服務器壓力,將對臺服務器組成一個集群,當用戶訪問時,先訪問到一個轉發服務器,再由轉發服務器將訪問分發到壓力更小的服務器,

Nginx 負載均衡實作的策略有以下五種:

1 . 輪詢 (默認)

每個請求按時間順序逐一分配到不同的后端服務器,如果后端某個服務器宕機,能自動剔除故障系統,

upstream backserver {
 server 192.168.0.12;
 server 192.168.0.13;
}

2. 權重 weight

weight 的值越大,分配到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下,其次是為在主從的情況下設定不同的權值,達到合理有效的地利用主機資源,

# 權重越高,在被訪問的概率越大,如上例,分別是20%,80%,
upstream backserver {
 server 192.168.0.12 weight=2;
 server 192.168.0.13 weight=8;
}

3. ip_hash(IP 系結)

每個請求按訪問 IP 的哈希結果分配,使來自同一個 IP 的訪客固定訪問一臺后端服務器,并且可以有效解決動態網頁存在的 session 共享問題

upstream backserver {
 ip_hash;
 server 192.168.0.12:88;
 server 192.168.0.13:80;
}

4. fair(第三方插件)

必須安裝 upstream_fair 模塊,

對比 weight、ip_hash 更加智能的負載均衡演算法,fair 演算法可以根據頁面大小和加載時間長短智能地進行負載均衡,回應時間短的優先分配,

# 哪個服務器的回應速度快,就將請求分配到那個服務器上,
upstream backserver {
 server server1;
 server server2;
 fair;
}

5.url_hash(第三方插件)

必須安裝 Nginx 的 hash 軟體包

按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個后端服務器,可以進一步提高后端快取服務器的效率,

upstream backserver {
 server squid1:3128;
 server squid2:3128;
 hash $request_uri;
 hash_method crc32;
}

如何用 Nginx 解決前端跨域問題?

使用 Nginx 轉發請求,把跨域的介面寫成調本域的介面,然后將這些介面轉發到真正的請求地址,

Nginx 虛擬主機怎么配置?

1、基于域名的虛擬主機,通過域名來區分虛擬主機——應用:外部網站

2、基于埠的虛擬主機,通過埠來區分虛擬主機——應用:公司內部網站,外部網站的管理后臺

3、基于 ip 的虛擬主機,

基于虛擬主機配置域名

需要建立 / data/www /data/bbs 目錄,windows 本地 hosts 添加虛擬機 ip 地址對應的域名決議;對應域名網站目錄下新增 index.html 檔案;

# 當客戶端訪問www.lijie.com,監聽埠號為80,直接跳轉到data/www目錄下檔案
server {
    listen       80;
    server_name  www.lijie.com;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

# 當客戶端訪問www.lijie.com,監聽埠號為80,直接跳轉到data/bbs目錄下檔案
 server {
    listen       80;
    server_name  bbs.lijie.com;
    location / {
        root   data/bbs;
        index  index.html index.htm;
    }
}

基于埠的虛擬主機

使用埠來區分,瀏覽器使用域名或 ip 地址: 埠號 訪問

# 當客戶端訪問www.lijie.com,監聽埠號為8080,直接跳轉到data/www目錄下檔案
 server {
    listen       8080;
    server_name  8080.lijie.com;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

# 當客戶端訪問www.lijie.com,監聽埠號為80直接跳轉到真實ip服務器地址 127.0.0.1:8080
server {
    listen       80;
    server_name  www.lijie.com;
    location / {
         proxy_pass http://127.0.0.1:8080;
        index  index.html index.htm;
    }
}

location 的作用是什么?

location 指令的作用是根據用戶請求的 URI 來執行不同的應用,也就是根據用戶請求的網站 URL 進行匹配,匹配成功即進行相關的操作,

location 的語法能說出來嗎?

注意:~ 代表自己輸入的英文字母

 

 

 

Location 正則案例

# 優先級1,精確匹配,根路徑
location =/ {
    return 400;
}

# 優先級2,以某個字串開頭,以av開頭的,優先匹配這里,區分大小寫
location ^~ /av {
   root /data/av/;
}

# 優先級3,區分大小寫的正則匹配,匹配/media*****路徑
location ~ /media {
      alias /data/static/;
}

# 優先級4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這里
location ~* .*\.(jpg|gif|png|js|css)$ {
   root  /data/av/;
}

# 優先7,通用匹配
location / {
    return 403;
}
 

限流怎么做的?

Nginx 限流就是限制用戶請求速度,防止服務器受不了

限流有 3 種

  • 正常限制訪問頻率(正常流量)

  • 突發限制訪問頻率(突發流量)

  • 限制并發連接數

Nginx 的限流都是基于漏桶流演算法

實作三種限流演算法

1、正常限制訪問頻率(正常流量):

限制一個用戶發送的請求,我 Nginx 多久接收一個請求,

Nginx 中使用 ngx_http_limit_req_module 模塊來限制的訪問頻率,限制的原理實質是基于漏桶演算法原理來實作的,在 nginx.conf 組態檔中可以使用 limit_req_zone 命令及 limit_req 命令限制單個 IP 的請求處理頻率,

# 定義限流維度,一個用戶一分鐘一個請求進來,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

# 系結限流維度
server{
    
    location/seckill.html{
        limit_req zone=zone;
        proxy_pass http://lj_seckill;
    }

}

1r/s 代表 1 秒一個請求,1r/m 一分鐘接收一個請求, 如果 Nginx 這時還有別人的請求沒有處理完,Nginx 就會拒絕處理該用戶請求,

2、突發限制訪問頻率(突發流量):

限制一個用戶發送的請求,我 Nginx 多久接收一個,

上面的配置一定程度可以限制訪問頻率,但是也存在著一個問題:如果突發流量超出請求被拒絕處理,無法處理活動時候的突發流量,這時候應該如何進一步處理呢?

Nginx 提供 burst 引數結合 nodelay 引數可以解決流量突發的問題,可以設定能處理的超過設定的請求數外能額外處理的請求數,我們可以將之前的例子添加 burst 引數以及 nodelay 引數:

# 定義限流維度,一個用戶一分鐘一個請求進來,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

# 系結限流維度
server{
    
    location/seckill.html{
        limit_req zone=zone burst=5 nodelay;
        proxy_pass http://lj_seckill;
    }

}

為什么就多了一個 burst=5 nodelay; 呢,多了這個可以代表 Nginx 對于一個用戶的請求會立即處理前五個,多余的就慢慢來落,沒有其他用戶的請求我就處理你的,有其他的請求的話我 Nginx 就漏掉不接受你的請求

3、 限制并發連接數

Nginx 中的 ngx_http_limit_conn_module 模塊提供了限制并發連接數的功能,可以使用 limit_conn_zone 指令以及 limit_conn 執行進行配置,接下來我們可以通過一個簡單的例子來看下:

http {
    limit_conn_zone $binary_remote_addr zone=myip:10m;
    limit_conn_zone $server_name zone=myServerName:10m;
}

server {
    location / {
        limit_conn myip 10;
        limit_conn myServerName 100;
        rewrite / http://www.lijie.net permanent;
    }
}

上面配置了單個 IP 同時并發連接數最多只能 10 個連接,并且設定了整個虛擬服務器同時最大并發數最多只能 100 個鏈接,當然,只有當請求的 header 被服務器處理后,虛擬服務器的連接數才會計數,剛才有提到過 Nginx 是基于漏桶演算法原理實作的,實際上限流一般都是基于漏桶演算法和令牌桶演算法實作的,

漏桶流演算法和令牌桶演算法知道?

漏桶演算法

漏桶演算法思路很簡單,我們把水比作是請求,漏桶比作是系統處理能力極限,水先進入到漏桶里,漏桶里的水按一定速率流出,當流出的速率小于流入的速率時,由于漏桶容量有限,后續進入的水直接溢位(拒絕請求),以此實作限流,

令牌桶演算法

令牌桶演算法的原理也比較簡單,我們可以理解成醫院的掛號看病,只有拿到號以后才可以進行診病,

系統會維護一個令牌(token)桶,以一個恒定的速度往桶里放入令牌(token),這時如果有請求進來想要被處理,則需要先從桶里獲取一個令牌(token),當桶里沒有令牌(token)可取時,則該請求將被拒絕服務,令牌桶演算法通過控制桶的容量、發放令牌的速率,來達到對請求的限制,

 

 

 

Nginx 配置高可用性怎么配置?

當上游服務器 (真實訪問服務器),一旦出現故障或者是沒有及時相應的話,應該直接輪訓到下一臺服務器,保證服務器的高可用

Nginx 配置代碼:

server {
        listen       80;
        server_name  www.lijie.com;
        location / {
            ### 指定上游服務器負載均衡服務器
            proxy_pass http://backServer;
            ###nginx與上游服務器(真實訪問的服務器)超時時間 后端服務器連接的超時時間_發起握手等候回應超時時間
            proxy_connect_timeout 1s;
            ###nginx發送給上游服務器(真實訪問的服務器)超時時間
            proxy_send_timeout 1s;
            ### nginx接受上游服務器(真實訪問的服務器)超時時間
            proxy_read_timeout 1s;
            index  index.html index.htm;
        }
    }
 

Nginx 怎么判斷別 IP 不可訪問?

# 如果訪問的ip地址為192.168.9.115,則回傳403
 if  ($remote_addr = 192.168.9.115) {
     return 403;
 }
 

在 nginx 中,如何使用未定義的服務器名稱來阻止處理請求?

只需將請求洗掉的服務器就可以定義為:

服務器名被保留一個空字串,他在沒有主機頭欄位的情況下匹配請求,而一個特殊的 nginx 的非標準代碼被回傳,從而終止連接,

怎么限制瀏覽器訪問?

## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器回傳500
if ($http_user_agent ~ Chrome) {
  return 500;
}

Rewrite全域變數是什么?

$remote_addr //獲取客戶端ip
$binary_remote_addr //客戶端ip(二進制)
$remote_port //客戶端port,如:50472
$remote_user //已經經過Auth Basic Module驗證的用戶名
$host //請求主機頭欄位,否則為服務器名稱,如:blog.sakmon.com
$request //用戶請求資訊,如:GET ?a=1&b=2 HTTP/1.1
$request_filename //當前請求的檔案的路徑名,由root或alias和URI request組合而成,如:/2013/81.html
$status //請求的回應狀態碼,如:200
$body_bytes_sent // 回應時送出的body位元組數數量,即使連接中斷,這個資料也是精確的,如:40
$content_length // 等于請求行的“Content_Length”的值
$content_type // 等于請求行的“Content_Type”的值
$http_referer // 參考地址
$http_user_agent // 客戶端agent資訊,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
$args //與$query_string相同 等于當中URL的引數(GET),如a=1&b=2
$document_uri //與$uri相同 這個變數指當前的請求URI,不包括任何引數(見$args) 如:/2013/81.html
$document_root //針對當前請求的根路徑設定值
$hostname //如:centos53.localdomain
$http_cookie //客戶端cookie資訊
$cookie_COOKIE //cookie COOKIE變數的值
$is_args //如果有$args引數,這個變數等于”?”,否則等于”",空值,如?
$limit_rate //這個變數可以限制連接速率,0表示不限速
$query_string // 與$args相同 等于當中URL的引數(GET),如a=1&b=2
$request_body // 記錄POST過來的資料資訊
$request_body_file //客戶端請求主體資訊的臨時檔案名
$request_method //客戶端請求的動作,通常為GET或POST,如:GET
$request_uri //包含請求引數的原始URI,不包含主機名,如:/2013/81.html?a=1&b=2
$scheme //HTTP方法(如http,https),如:http
$uri //這個變數指當前的請求URI,不包括任何引數(見$args) 如:/2013/81.html
$request_completion //如果請求結束,設定為OK. 當請求未結束或如果該請求不是請求鏈串的最后一個時,為空(Empty),如:OK
$server_protocol //請求使用的協議,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1
$server_addr //服務器IP地址,在完成一次系統呼叫后可以確定這個值
$server_name //服務器名稱,如:blog.sakmon.com
$server_port //請求到達服務器的埠號,如:80

Nginx 如何實作后端服務的健康檢查?

方式一,利用 nginx 自帶模塊 ngx_http_proxy_module 和 ngx_http_upstream_module 對后端節點做健康檢查,

方式二 (推薦),利用 nginx_upstream_check_module 模塊對后端節點做健康檢查,

Nginx 如何開啟壓縮?

開啟 nginx gzip 壓縮后,網頁、css、js 等靜態資源的大小會大大的減少,從而可以節約大量的帶寬,提高傳輸效率,給用戶快的體驗,雖然會消耗 cpu 資源,但是為了給用戶更好的體驗是值得的,

開啟的配置如下:

將以上配置放到 nginx.conf 的 http{…} 節點中,

http {
  # 開啟gzip
  gzip on;
 
  # 啟用gzip壓縮的最小檔案;小于設定值的檔案將不會被壓縮
  gzip_min_length 1k;
 
  # gzip 壓縮級別 1-10
  gzip_comp_level 2;
 
  # 進行壓縮的檔案型別,
 
  gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
 
  # 是否在http header中添加Vary: Accept-Encoding,建議開啟
  gzip_vary on;
}

保存并重啟 nginx,重繪頁面(為了避免快取,請強制重繪)就能看到效果了,以谷歌瀏覽器為例,通過 F12 看請求的回應頭部:

我們可以先來對比下,如果我們沒有開啟 zip 壓縮之前,我們的對應的檔案大小,如下所示:

 

 

現在我們開啟了 gzip 進行壓縮后的檔案的大小,可以看到如下所示:

 

 

并且我們查看回應頭會看到 gzip 這樣的壓縮,如下所示

gzip 壓縮前后效果對比:jquery 原大小 90kb,壓縮后只有 30kb,

gzip 雖然好用,但是以下型別的資源不建議啟用,

1、圖片型別

原因:圖片如 jpg、png 本身就會有壓縮,所以就算開啟 gzip 后,壓縮前和壓縮后大小沒有多大區別,所以開啟了反而會白白的浪費資源,(Tips:可以試試將一張 jpg 圖片壓縮為 zip,觀察大小并沒有多大的變化,雖然 zip 和 gzip 演算法不一樣,但是可以看出壓縮圖片的價值并不大)

2、大檔案

原因:會消耗大量的 cpu 資源,且不一定有明顯的效果,

ngx_http_upstream_module 的作用是什么?

ngx_http_upstream_module 用于定義可通過 fastcgi 傳遞、proxy 傳遞、uwsgi 傳遞、memcached 傳遞和 scgi 傳遞指令來參考的服務器組,

什么是 C10K 問題?

C10K 問題是指無法同時處理大量客戶端 (10,000) 的網路套接字,

Nginx 是否支持將請求壓縮到上游?

您可以使用 Nginx 模塊 gunzip 將請求壓縮到上游,gunzip 模塊是一個過濾器,它可以對不支持 “gzip” 編碼方法的客戶機或服務器使用 “內容編碼: gzip” 來解壓縮回應,

如何在 Nginx 中獲得當前的時間?

要獲得 Nginx 的當前時間,必須使用 SSI 模塊、和 date_local 的變數,

Proxy_set_header THE-TIME $date_gmt;

用 Nginx 服務器解釋 - s 的目的是什么?

用于運行 Nginx -s 引數的可執行檔案,

如何在 Nginx 服務器上添加模塊?

在編譯程序中,必須選擇 Nginx 模塊,因為 Nginx 不支持模塊的運行時間選擇,

生產中如何設定 worker 行程的數量呢?

在有多個 cpu 的情況下,可以設定多個 worker,worker 行程的數量可以設定到和 cpu 的核心數一樣多,如果在單個 cpu 上起多個 worker 行程,那么作業系統會在多個 worker 之間進行調度,這種情況會降低系統性能,如果只有一個 cpu,那么只啟動一個 worker 行程就可以了,

nginx 狀態碼

499:

服務端處理時間過長,客戶端主動關閉了連接,

502:

(1).FastCGI 行程是否已經啟動

(2).FastCGI worker 行程數是否不夠

(3).FastCGI 執行時間過長

  • fastcgi_connect_timeout 300;
  • fastcgi_send_timeout 300;
  • fastcgi_read_timeout 300;

(4).FastCGI Buffer 不夠,nginx 和 apache 一樣,有前端緩沖限制,可以調整緩沖引數

  • fastcgi_buffer_size 32k;
  • fastcgi_buffers 8 32k;

(5). Proxy Buffer 不夠,如果你用了 Proxying,調整

  • proxy_buffer_size 16k;
  • proxy_buffers 4 16k;

(6).php 腳本執行時間過長

  • 將 php-fpm.conf 的 0s 的 0s 改成一個時間

- END -

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/40-Nginx-Frequently-Asked-Interview-Questions.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538372.html

標籤:其他

上一篇:研究光度立體法階段性小結和優化(可20ms獲取4個2500*2000灰度圖的Normal Map)。

下一篇:群暉NAS搭建外網可訪問的電子圖書館Calibre-Web

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more