Nginx常見問題
衣帶漸寬終不悔,為伊消得人憔悴。
1、什么是Nginx?
Nginx是一個 輕量級/高性能的反向代理Web服務器,他實現非常高效的反向代理、負載均衡,他可以處理2-3萬並發連接數,官方監測能支持5萬並發,現在中國使用nginx網站用戶有很多,例如:新浪、網易、 騰訊等。
2、為什么要用Nginx?
- 跨平台、配置簡單、方向代理、高並發連接:處理2-3萬並發連接數,官方監測能支持5萬並發。
- 內存消耗小:開啟10個nginx才占150M內存 ,nginx處理靜態文件好,耗費內存少。
- 而且Nginx內置的健康檢查功能:如果有一個服務器宕機,會做一個健康檢查,再發送的請求就不會發送到宕機的服務器了。重新將請求提交到其他的節點上。
- 節省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存。
- 穩定性高:宕機的概率非常小。
- 接收用戶請求是異步的。
3、為什么Nginx性能如此之高?
因為他的事件處理機制、異步非阻塞事件處理機制,運用了epoll模型,提供了一個隊列,排隊解決。
4、Nginx如何處理請求?
nginx接收一個請求后,首先由listen和server_name指令匹配server模塊,再匹配server模塊里的location,location就是實際地址。

1 server { # 第一個Server區塊開始,表示一個獨立的虛擬主機站點 2 listen 80; # 提供服務的端口,默認80 3 server_name localhost; # 提供服務的域名主機名 4 location / { # 第一個location區塊開始 5 root html; # 站點的根目錄,相當於Nginx的安裝目錄 6 index index.html index.htm; # 默認的首頁文件,多個用空格分開 7 } # 第一個location區塊結果 8 }
5、什么是正向代理和反向代理?
- 正向代理就是一個人發送一個請求直接就到達了目標的服務器。
- 反方代理就是請求統一被Nginx接收,nginx反向代理服務器接收到之后,按照一定的規則分發給后端的業務處理服務器進行處理。
6、使用反向代理服務器的優點是什么?
反向代理服務器可以隱藏源服務器的存在和特征。它充當互聯網雲和web服務器之間的中間層。這對於安全方面來說是很好的,特別是使用web托管服務時。
7、Nginx的優缺點?
優點:
- 1. 占內存小,可實現高並發連接,處理響應快。
- 2. 可實現http服務器、虛擬主機、方向代理、負載均衡。
- 3. Nginx配置簡單。
- 4. 可以不暴露正式的服務器IP地址。
缺點:
- 1. 動態處理差:nginx處理靜態文件好,耗費內存少,但是處理動態頁面則很雞肋,現在一般前端用nginx作為反向代理抗住壓力。
8、Nginx應用場景?
- 1. http服務器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜態服務器。
- 2. 虛擬主機。可以實現在一台服務器虛擬出多個網站,例如個人網站使用的虛擬機。
- 3. 反向代理,負載均衡。當網站的訪問量達到一定程度后,單台服務器不能滿足用戶的請求時,需要用多台服務器集群可以使用nginx做反向代理。並且多台服務器可以平均分擔負載,不會應為某台服務器負載高宕機而某台服務器閑置的情況。
- 4. nginx中也可以配置安全管理、比如可以使用Nginx搭建API接口網關,對每個接口服務進行攔截。
9、Nginx目錄結構有哪些?
10、Nginx配置文件和nginx.conf有哪些屬性模塊?

1 worker_processes 1; # worker進程的數量 2 events { # 事件區塊開始 3 worker_connections 1024; # 每個worker進程支持的最大連接數 4 } # 事件區塊結束 5 http { # HTTP區塊開始 6 include mime.types; # Nginx支持的媒體類型庫文件 7 default_type application/octet-stream; # 默認的媒體類型 8 sendfile on; # 開啟高效傳輸模式 9 keepalive_timeout 65; # 連接超時 10 server { # 第一個Server區塊開始,表示一個獨立的虛擬 主機站點 11 listen 80; # 提供服務的端口,默認80 12 server_name localhost; # 提供服務的域名主機名 13 location / { # 第一個location區塊開始 14 root html; # 站點的根目錄,相當於Nginx的安裝目錄 15 index index.html index.htm; # 默認的首頁文件,多個用空格分開 16 } # 第一個location區塊結果 17 error_page 500502503504 /50x.html; # 出現對應的http狀態碼時,使用50x.html回應客戶 18 location = /50x.html { # location區塊開始,訪問50x.html 19 root html; # 指定對應的站點目錄為html 20 } 21 }......
11、Nginx靜態資源?
靜態資源訪問,就是存放在nginx的html頁面,我們可以自己編寫。
12、如何用Nginx解決前端跨域問題?
使用Nginx轉發請求。把跨域的接口寫成調本域的接口,然后將這些接口轉發到真正的請求地址。
13、Nginx虛擬主機怎么配置?
- 1、基於域名的虛擬主機,通過域名來區分虛擬主機——應用:外部網站。
- 2、基於端口的虛擬主機,通過端口來區分虛擬主機——應用:公司內部網站,外部網站的管理后台。
- 3、基於ip的虛擬主機。
基於域名的虛擬主機:
需要建立與域名相對於的項目目錄/data/tjt、 /data/ttt目錄,windows本地hosts添加虛擬機ip地址對應的域名解析;對應域名網站目錄下新增index.html文件。

1 #當客戶端訪問www.tjt.com,監聽端口號為80,直接跳轉到data/tjt目錄下文件 2 server { 3 listen 80; 4 server_name www.tjt.com; 5 location / { 6 root data/tjt; 7 index index.html index.htm; 8 } 9 } 10 #當客戶端訪問www.ttt.com,監聽端口號為80,直接跳轉到data/ttt目錄下文件 11 server { 12 listen 80; 13 server_name www.ttt.com; 14 location / { 15 root data/ttt; 16 index index.html index.htm; 17 } 18 }
基於端口的虛擬機:
使用端口來區分,瀏覽器使用域名或ip地址:端口號 訪問。

1 #當客戶端訪問www.tjt.com,監聽端口號為8080,直接跳轉到data/tjt目錄下文件 2 server { 3 listen 8080; 4 server_name www.tjt.com; 5 location / { 6 root data/tjt; 7 index index.html index.htm; 8 } 9 } 10 #當客戶端訪問www.tjt.com,監聽端口號為80直接跳轉到真實ip服務器地址 127.0.0.1:8080 11 server { 12 listen 80; 13 server_name www.tjt.com; 14 location / { 15 proxy_pass http://127.0.0.1:8080; 16 index index.html index.htm; 17 } 18 }
14、location的作用是什么?
location指令的作用是根據用戶請求的URI來執行不同的應用,也就是根據用戶請求的網站URL進行匹配,匹配成功即進行相關的操作。
15、location語法?
注意:~ 代表自己輸入的英文字母。

16、location正則案例

1 #優先級1,精確匹配,根路徑 2 location =/ { 3 return 400; 4 } 5 #優先級2,以某個字符串開頭,以av開頭的,優先匹配這里,區分大小寫 6 location ^~ /av { 7 root /data/av/; 8 } 9 #優先級3,區分大小寫的正則匹配,匹配/media*****路徑 10 location ~ /media { 11 alias /data/static/; 12 } 13 #優先級4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這里 location ~* .*\.(jpg|gif|png|js|css)$ { 14 root /data/av/; 15 } 16 #優先7,通用匹配 17 location / { 18 return 403; 19 }
17、Nginx怎么做限流?
Nginx限流就是限制用戶請求速度,防止服務器受不了,限流算法有以下3種方法:
- 1. 正常限制訪問頻率(正常流量)。
- 2. 突發限制訪問頻率(突發流量)。
- 3. 限制並發連接數。
Nginx的限流都是基於漏桶流算法。
正常限制訪問頻率(正常流量)
- 限制一個用戶發送的請求,設置Nginx多久接收一個請求。
- Nginx中使用ngx_http_limit_req_module模塊來限制的訪問頻率,限制的原理實質是基於漏桶算法原理來實現的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制單個IP的請求處理頻率。

1 #定義限流維度,一個用戶一分鍾一個請求進來,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; 2 #綁定限流維度 3 server{ 4 location/seckill.html{ 5 limit_req zone=zone; 6 proxy_pass http://lj_seckill; 7 } 8 }
1r/s代表1秒一個請求,1r/m一分鍾接收一個請求, 如果Nginx這時還有別人的請求沒有處理完,Nginx就會拒絕處理該用戶請求。
突發限制訪問頻率(突發流量)
- 限制一個用戶發送的請求,設置Nginx多久接收一個。
- 上面的配置一定程度可以限制訪問頻率,但是也存在着一個問題:如果突發流量超出請求被拒絕處理,無法處理活動時候的突發流量,這時候應該如何進一步處理呢?Nginx提供burst參數結合nodelay參數可以解決流量突發的問題,可以設置能處理的超過設置的請求數外能額外處理的請求數。我們可以將之前的例子添加burst參數以及nodelay參數。

1 #定義限流維度,一個用戶一分鍾一個請求進來,多余的全部漏掉 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m; 2 #綁定限流維度 3 server{ 4 location/seckill.html{ 5 limit_req zone=zone burst=5 nodelay; 6 proxy_pass http://lj_seckill; 7 } 8 }
這里多了一個 burst=5 nodelay; 多了這個可以代表Nginx對於一個用戶的請求會立即處理前五個,多余的就慢慢來落,沒有其他用戶的請求我就處理你的,有其他的請求的話Nginx就
漏掉不接受你的請求。
限制並發連接數
Nginx中的ngx_http_limit_conn_module模塊提供了限制並發連接數的功能,可以使用limit_conn_zone指令以及limit_conn執行進行配置。一個簡單的例子如下:

1 http { 2 limit_conn_zone $binary_remote_addr zone=myip:10m; 3 limit_conn_zone $server_name zone=myServerName:10m; 4 } 5 server { 6 location / { 7 limit_conn myip 10; 8 limit_conn myServerName 100; 9 rewrite / http://www.lijie.net permanent; 10 } 11 }
上面配置了單個IP同時並發連接數最多只能10個連接,並且設置了整個虛擬服務器同時最大並發數最多只能100個鏈接。當然,只有當請求的header被服務器處理后,虛擬服務器的連接數才會
計數。剛才有提到過Nginx是基於漏桶算法原理實現的,實際上限流一般都是基於漏桶算法和令牌桶算法實現的。
18、漏桶流算法和令牌桶算法?
漏桶算法
漏桶算法是網絡世界中流量整形或速率限制時經常使用的一種算法,它的主要目的是控制數據注入到網絡的速率,平滑網絡上的突發流量。漏桶算法提供了一種機制,通過它,突發流量可以被整形以便為網絡提供一個穩定的流量。也就是我們剛才所講的情況。漏桶算法提供的機制實際上就是剛才的案例:突發流量會進入到一個漏桶,漏桶會按照我們定義的速率依次處理請求,如果水流過大也就是突發流量過大就會直接溢出,則多余的請求會被拒絕。所以漏桶算法能控制數據的傳輸速率。

令牌桶算法
令牌桶算法是網絡流量整形和速率限制中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,並允許突發數據的發送。Google開源項目Guava中的RateLimiter使用的就是令牌桶控制算法。令牌桶算法的機制如下:存在一個大小固定的令牌桶,會以恆定的速率源源不斷產生令牌。如果令牌消耗速率小於生產令牌的速度,令牌就會一直產生直至裝滿整個令牌桶。

19、為什么要做動靜分離
- Nginx是當下最熱的Web容器,網站優化的重要點在於靜態化網站,網站靜態化的關鍵點則是是動靜分離,動靜分離是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以后,我們則根據靜態資源的特點將其做緩存操作。
- 讓靜態的資源只走靜態資源服務器,動態的走動態的服務器。
- Nginx的靜態處理能力很強,但是動態處理能力不足,因此,在企業中常用動靜分離技術。
- 對於靜態資源比如圖片,js,css等文件,我們則在反向代理服務器nginx中進行緩存。這樣瀏覽器在請求一個靜態資源時,代理服務器nginx就可以直接處理,無需將請求轉發給后端服務器tomcat。若用戶請求的動態文件,比如servlet、jsp則轉發給Tomcat服務器處理,從而實現動靜分離。這也是反向代理服務器的一個重要的作用。
20、Nginx怎么做動靜分離?
只需要指定路徑對應的目錄。location/可以使用正則表達式匹配。並指定對應的硬盤中的目錄。如下:

1 location /image/ { 2 root /usr/local/static/; 3 autoindex on; 4 }
21、Nginx負載均衡算法的實現以及策略?
為了避免服務器崩潰,大家會通過負載均衡的方式來分擔服務器壓力。將對台服務器組成一個集群,當用戶訪問時,先訪問到一個轉發服務器,再由轉發服務器將訪問分發到壓力更小的服務器。Nginx負載均衡實現的策略有以下五種:
輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端某個服務器宕機,能自動剔除故障系統。

1 upstream backserver { 2 server 192.168.0.12; 3 server 192.168.0.13; 4 }
權重weight
weight的值越大分配到的訪問概率越高,主要用於后端每台服務器性能不均衡的情況下。其次是為在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。

1 upstream backserver { 2 server 192.168.0.12 weight=2; 3 server 192.168.0.13 weight=8; 4 }
權重越高,在被訪問的概率越大,如上例,分別是20%、80%。
ip_hash(IP綁定)
每個請求按訪問IP的哈希結果分配,使來自同一個IP的訪客固定訪問一台后端服務器, 並且可以有效解決動態網頁存在的session共享問題。

1 upstream backserver { 2 ip_hash; 3 server 192.168.0.12:88; 4 server 192.168.0.13:80; 5 }
fair(第三方插件)
- 必須安裝upstream_fair模塊。
- 對比 weight、ip_hash更加智能的負載均衡算法,fair算法可以根據頁面大小和加載時間長短智能地進行負載均衡,響應時間短的優先分配。

1 upstream backserver { 2 server server1; 3 server server2; 4 fair; 5 }
哪個服務器的響應速度快,就將請求分配到那個服務器上。
url_hash(第三方插件)
- 必須安裝Nginx的hash軟件包。
- 按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,可以進一步提高后端緩存服務器的效率。

1 upstream backserver { 2 server squid1:3128; 3 server squid2:3128; 4 hash $request_uri; 5 hash_method crc32; 6 }
22、Nginx如何配置高可用?
當上游服務器(真實訪問服務器),一旦出現故障或者是沒有及時相應的話,應該直接輪訓到下一台服務器,保證服務器的高可用。

1 server { 2 listen 80; 3 server_name www.lijie.com; 4 location / { 5 ### 指定上游服務器負載均衡服務器 6 proxy_pass http://backServer; 7 ###nginx與上游服務器(真實訪問的服務器)超時時間 后端服務器連接的超時時間_發起握手等 候響應超時時間 8 proxy_connect_timeout 1s; 9 ###nginx發送給上游服務器(真實訪問的服務器)超時時間 10 proxy_send_timeout 1s; 11 ### nginx接受上游服務器(真實訪問的服務器)超時時間 12 proxy_read_timeout 1s; 13 index index.html index.htm; 14 } 15 }
23、Nginx如何判斷IP不可訪問?

1 # 如果訪問的ip地址為192.168.9.115,則返回403 2 if ($remote_addr = 192.168.9.115) { 3 return 403; 4 }
24、Nginx如何限制瀏覽器訪問?

1 ## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器返回500 2 if ($http_user_agent ~ Chrome) { 3 return 500; 4 }
25、Rewrite全局變量是什么?
衣帶漸寬終不悔
為伊消得人憔悴