Nginx 相關知識40問

Nginx 40 问!

什麼是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;          # 默認的首頁文件,多個用空格分開
    }    

首先,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目錄結構有哪些?


[root@localhost ~]# 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是異步的,多個連接可以對應一個進程。

Nginx Apache
nginx是一個基於事件的web服務器 apache是一個基於流程的服務器
所有請求都由一個線程處理 單個線程處理單個請求
nginx避免子進程的概念 apache是基於子進程的
nginx類似於速度 apache類似於功率
nginx在內存消耗和連接方面比較好 apache在內存消耗和連接上沒有提高
nginx在負載均衡方面表現較好 當流量到達進程極限時,apache將拒絕新的連接。
對於php來說,nginx可能更可取,因爲它支持php apache支持php,python,perl和其他語言使用插件,當應用程序基於python或ruby時,它非常有用。
nginx不支持IBMI和openvms一樣的os apache支持更多的os
nginx只具有核心功能 apache提供了比nginx更多的功能
nginx的性能和可伸縮性不依賴於硬件 apache依賴於cpu和內存等硬件組件。

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

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

動態資源、靜態資源分離簡單的概括是:動態文件與靜態文件的分離。

爲什麼要做動、靜分離?

在我們的軟件開發中,有些請求是需要後臺處理的(如:.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負載均衡實現的策略有以下五種:

  • 輪詢(默認) 每個請求按時間順序逐一分配到不同的後端服務器,如果後端某個服務器宕機,能自動剔除故障系統。

upstream backserver { 
   server 1112; 
   server 1113; 
  }
  • 權重 weight的值越大,分配到的訪問概率越高,主要用於後端每臺服務器性能不均衡的情況下。其次是爲在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。

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

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


upstream backserver { 

   ip_hash; 
   server 1112:88; 
   server 1113:80; 
  }
  • fair(第三方插件)

必須安裝upstream_fair模塊。

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


# 哪個服務器的響應速度快,就將請求分配到那個服務器上。

upstream backserver { 
 server server1; 
 server server2; 
 fair; 
}
  • 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.iwmyx.cn,監聽端口號爲 80,直接跳轉到 data/www 目錄下文件server {
    listen       80;
    server_name  www.iwmyx.cn;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

    # 當客戶端訪問 www.iwmyx.cn,監聽端口號爲 80,直接跳轉到 data/bbs 目錄下文件
     server {
    listen       80;
    server_name  bbs.iwmyx.cn;
    location / {
        root   data/bbs;
        index  index.html index.htm;
    }
}

基於端口的虛擬主機

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


# 當客戶端訪問 www.iwmyx.cn,監聽端口號爲 8080,直接跳轉到 data/www 目錄下文件server {
listen       8080;
server_name  iwmyx.cn;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

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

location的作用是什麼?

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

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

匹配符 匹配規則 優先級
= 精確匹配 1
^~ 以某個字符串開頭 2
~ 區分大小寫的正則匹配 3
~* 不區分大小寫的正則匹配 4
!~ 區分大小寫不匹配的正則 5
!~* 不區分大小寫不匹配的正則 6
/ 通用匹配,任何請求都會匹配到 7

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的限流都是基於漏桶流算法

實現三種限流算法

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

限制一個用戶發送的請求,我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就會拒絕處理該用戶請求。

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

限制一個用戶發送的請求,我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就漏掉不接受你的請求

  • 限制併發連接數

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.rumenz.net permanent;
    }

}

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

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

一文搞定,手擼Springboot + aop + Lua分佈式限流的最佳實踐_vincent-CSDN博客_springboot如何限流

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

Nginx 40 问!

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

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

Nginx 40 问!

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

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

Nginx配置代碼:


server {
    listen       80;
    server_name  www.iwmyx.cn;
    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 地址爲 11115,則返回 403
 if  ($remote_addr = 11115) {  
     return 403;  
 }

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

只需將請求刪除的服務器就可以定義爲:

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

怎麼限制瀏覽器訪問?


## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器返回 500if ($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壓縮之前,我們的對應的文件大小,如下所示:

Nginx 40 问!

現在我們開啓了gzip進行壓縮後的文件的大小,可以看到如下所示:

Nginx 40 问!

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

Nginx 40 问!

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

gzip雖然好用,但是以下類型的資源不建議啓用。

  • 圖片類型

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

  • 大文件

原因:會消耗大量的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_gmt和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:服務器錯誤

下面是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改成一個時間


來源:入門小站


武穆逸仙 https://www.iwmyx.cn/nginx40w.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章