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 }
View Code
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 }......
View Code
11、Nginx靜態資源?
靜態資源訪問,就是存放在nginx的html頁面,我們可以自己撰寫,12、如何用Nginx解決前端跨域問題?
使用Nginx轉發請求,把跨域的介面寫成調本域的介面,然后將這些介面轉發到真正的請求地址,13、Nginx虛擬主機怎么配置?
- 1、基于域名的虛擬主機,通過域名來區分虛擬主機——應用:外部網站,
- 2、基于埠的虛擬主機,通過埠來區分虛擬主機——應用:公司內部網站,外部網站的管理后臺,
- 3、基于ip的虛擬主機,
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 }
View Code
基于埠的虛擬機:
使用埠來區分,瀏覽器使用域名或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 }
View Code
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 }
View Code
17、Nginx怎么做限流?
Nginx限流就是限制用戶請求速度,防止服務器受不了,限流演算法有以下3種方法:- 1. 正常限制訪問頻率(正常流量),
- 2. 突發限制訪問頻率(突發流量),
- 3. 限制并發連接數,
- 限制一個用戶發送的請求,設定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 }
View Code
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 }
View Code
這里多了一個 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 }
View Code
上面配置了單個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 }
View Code
21、Nginx負載均衡演算法的實作以及策略?
為了避免服務器崩潰,大家會通過負載均衡的方式來分擔服務器壓力,將對臺服務器組成一個集群,當用戶訪問時,先訪問到一個轉發服務器,再由轉發服務器將訪問分發到壓力更小的服務器,Nginx負載均衡實作的策略有以下五種: 輪詢(默認) 每個請求按時間順序逐一分配到不同的后端服務器,如果后端某個服務器宕機,能自動剔除故障系統,
1 upstream backserver {
2 server 192.168.0.12;
3 server 192.168.0.13;
4 }
View Code
權重weight
weight的值越大分配到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下,其次是為在主從的情況下設定不同的權值,達到合理有效的地利用主機資源,
1 upstream backserver {
2 server 192.168.0.12 weight=2;
3 server 192.168.0.13 weight=8;
4 }
View Code
權重越高,在被訪問的概率越大,如上例,分別是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 }
View Code
fair(第三方插件)
- 必須安裝upstream_fair模塊,
- 對比 weight、ip_hash更加智能的負載均衡演算法,fair演算法可以根據頁面大小和加載時間長短智能地進行負載均衡,回應時間短的優先分配,
1 upstream backserver {
2 server server1;
3 server server2;
4 fair;
5 }
View Code
哪個服務器的回應速度快,就將請求分配到那個服務器上,
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 }
View Code
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 }
View Code
23、Nginx如何判斷IP不可訪問?
1 # 如果訪問的ip地址為192.168.9.115,則回傳403
2 if ($remote_addr = 192.168.9.115) {
3 return 403;
4 }
View Code
24、Nginx如何限制瀏覽器訪問?
1 ## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器回傳500
2 if ($http_user_agent ~ Chrome) {
3 return 500;
4 }
View Code
25、Rewrite全域變數是什么?

衣帶漸寬終不悔
為伊消得人憔悴
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300599.html
標籤:Java
上一篇:Spring Boot中使用@Async的時候,千萬別忘了執行緒池的配置!
下一篇:Python 做簡單的登錄系統

