Nginx配置

什么是Nginx涉枫?

Nginx是一個 輕量級/高性能的反向代理Web服務器邢滑,用于 HTTP、HTTPS愿汰、SMTP困后、POP3 和 IMAP 協(xié)議。他實現(xiàn)非常高效的反向代理尼桶、負載平衡操灿,他可以處理2-3萬并發(fā)連接數(shù),官方監(jiān)測能支持5萬并發(fā)泵督。

Nginx 有哪些優(yōu)點趾盐?

  • 跨平臺、配置簡單小腊。
  • 非阻塞救鲤、高并發(fā)連接:處理 2-3 萬并發(fā)連接數(shù),官方監(jiān)測能支持 5 萬并發(fā)秩冈。
  • 內(nèi)存消耗斜静:開啟 10 個 Nginx 才占 150M 內(nèi)存。
  • 成本低廉入问,且開源丹锹。
  • 穩(wěn)定性高稀颁,宕機的概率非常小。
  • 內(nèi)置的健康檢查功能:如果有一個服務器宕機楣黍,會做一個健康檢查匾灶,再發(fā)送的請求就不會發(fā)送到宕機的服務器了。重新將請求提交到其他的節(jié)點上

Nginx 應用場景租漂?

  • http服務器阶女。Nginx是一個http服務可以獨立提供http服務×ㄖ危可以做網(wǎng)頁靜態(tài)服務器秃踩。
  • 虛擬主機∫捣ぃ可以實現(xiàn)在一臺服務器虛擬出多個網(wǎng)站憔杨,例如個人網(wǎng)站使用的虛擬機。
  • 反向代理驾孔,負載均衡芍秆。當網(wǎng)站的訪問量達到一定程度后惯疙,單臺服務器不能滿足用戶的請求時翠勉,需要用多臺服務器集群可以使用nginx做反向代理。并且多臺服務器可以平均分擔負載霉颠,不會應為某臺服務器負載高宕機而某臺服務器閑置的情況对碌。
  • nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關(guān),對每個接口服務進行攔截蒿偎。

Nginx 怎么處理請求的朽们?

server { # 第一個Server區(qū)塊開始,表示一個獨立的虛擬主機站點
   listen       80诉位;# 提供服務的端口骑脱,默認80
   server_name localhost; # 提供服務的域名主機名
   location / { # 第一個location區(qū)塊開始
     root   html; # 站點的根目錄,相當于Nginx的安裝目錄
     index  index.html index.html; # 默認的首頁文件苍糠,多個用空格分開
} # 第一個location區(qū)塊結(jié)果
  • 首先叁丧,Nginx 在啟動時,會解析配置文件岳瞭,得到需要監(jiān)聽的端口與 IP 地址拥娄,然后在 Nginx 的 Master 進程里面先初始化好這個監(jiān)控的Socket(創(chuàng)建 S ocket,設置 addr瞳筏、reuse 等選項稚瘾,綁定到指定的 ip 地址端口,再 listen 監(jiān)聽)姚炕。
  • 然后摊欠,再 fork(一個現(xiàn)有進程可以調(diào)用 fork 函數(shù)創(chuàng)建一個新進程丢烘。由 fork 創(chuàng)建的新進程被稱為子進程 )出多個子進程出來。
  • 之后些椒,子進程會競爭 accept 新的連接铅协。此時,客戶端就可以向 nginx 發(fā)起連接了摊沉。當客戶端與nginx進行三次握手狐史,與 nginx 建立好一個連接后。此時说墨,某一個子進程會 accept 成功骏全,得到這個建立好的連接的 Socket ,然后創(chuàng)建 nginx 對連接的封裝尼斧,即 ngx_connection_t 結(jié)構(gòu)體姜贡。
  • 接著,設置讀寫事件處理函數(shù)棺棵,并添加讀寫事件來與客戶端進行數(shù)據(jù)的交換楼咳。
  • 最后,Nginx 或客戶端來主動關(guān)掉連接烛恤,到此母怜,一個連接就壽終正寢了。

Nginx 是如何實現(xiàn)高并發(fā)的缚柏?

如果一個 server 采用一個進程(或者線程)負責一個request的方式苹熏,那么進程數(shù)就是并發(fā)數(shù)。那么顯而易見的币喧,就是會有很多進程在等待中轨域。等什么?最多的應該是等待網(wǎng)絡傳輸杀餐。

而 Nginx 的異步非阻塞工作方式正是利用了這點等待的時間干发。在需要等待的時候,這些進程就空閑出來待命了史翘。因此表現(xiàn)為少數(shù)幾個進程就解決了大量的并發(fā)問題枉长。

Nginx是如何利用的呢,簡單來說:同樣的 4 個進程恶座,如果采用一個進程負責一個 request 的方式搀暑,那么,同時進來 4 個 request 之后跨琳,每個進程就負責其中一個自点,直至會話關(guān)閉。期間脉让,如果有第 5 個request進來了桂敛。就無法及時反應了功炮,因為 4 個進程都沒干完活呢,因此术唬,一般有個調(diào)度進程薪伏,每當新進來了一個 request ,就新開個進程來處理粗仓。

回想下嫁怀,BIO 是不是存在醬紫的問題?

Nginx 不這樣借浊,每進來一個 request 塘淑,會有一個 worker 進程去處理。但不是全程的處理蚂斤,處理到什么程度呢存捺?處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務器轉(zhuǎn)發(fā) request 曙蒸,并等待請求返回捌治。那么,這個處理的 worker 不會這么傻等著纽窟,他會在發(fā)送完請求后肖油,注冊一個事件:“如果 upstream 返回了,告訴我一聲师倔,我再接著干”构韵。于是他就休息去了。此時趋艘,如果再有 request 進來,他就可以很快再按這種方式處理凶朗。而一旦上游服務器返回了瓷胧,就會觸發(fā)這個事件,worker 才會來接手棚愤,這個 request 才會接著往下走搓萧。

這就是為什么說,Nginx 基于事件模型宛畦。

由于 web server 的工作性質(zhì)決定了每個 request 的大部份生命都是在網(wǎng)絡傳輸中瘸洛,實際上花費在 server 機器上的時間片不多。這是幾個進程就解決高并發(fā)的秘密所在次和。即:

webserver 剛好屬于網(wǎng)絡 IO 密集型應用反肋,不算是計算密集型。

異步踏施,非阻塞石蔗,使用 epoll 罕邀,和大量細節(jié)處的優(yōu)化。也正是 Nginx 之所以然的技術(shù)基石养距。

什么是正向代理诉探?

一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內(nèi)容棍厌,客戶端向代理發(fā)送一個請求并指定目標(原始服務器)肾胯,然后代理向原始服務器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端。

客戶端才能使用正向代理耘纱。正向代理總結(jié)就一句話:代理端代理的是客戶端阳液。例如說:我們使用的OpenVPN 等等。

什么是反向代理揣炕?

反向代理(Reverse Proxy)方式帘皿,是指以代理服務器來接受 Internet上的連接請求,然后將請求畸陡,發(fā)給內(nèi)部網(wǎng)絡上的服務器并將從服務器上得到的結(jié)果返回給 Internet 上請求連接的客戶端鹰溜,此時代理服務器對外就表現(xiàn)為一個反向代理服務器。

反向代理總結(jié)就一句話:代理端代理的是服務端丁恭。

反向代理服務器的優(yōu)點是什么?

反向代理服務器可以隱藏源服務器的存在和特征曹动。它充當互聯(lián)網(wǎng)云和web服務器之間的中間層。這對于安全方面來說是很好的牲览,特別是當您使用web托管服務時墓陈。

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ù)據(jù)目錄
├── html # Nginx默認站點目錄
│ ├── 50x.html # 錯誤頁面優(yōu)雅替代顯示文件第献,例如當出現(xiàn)502錯誤時會調(diào)用此頁面
│ └── 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進程的數(shù)量
events { # 事件區(qū)塊開始
    worker_connections  1024仔拟;# 每個worker進程支持的最大連接數(shù)
} # 事件區(qū)塊結(jié)束
http { # HTTP區(qū)塊開始
    include       mime.types;# Nginx支持的媒體類型庫文件
    default_type application/octet-stream飒赃;# 默認的媒體類型
    sendfile on利花;# 開啟高效傳輸模式
    keepalive_timeout 65;# 連接超時
    server { # 第一個Server區(qū)塊開始载佳,表示一個獨立的虛擬主機站點
        listen       80炒事;# 提供服務的端口,默認80
        server_name localhost蔫慧;# 提供服務的域名主機名
        location / { # 第一個location區(qū)塊開始
            root   html挠乳;# 站點的根目錄,相當于Nginx的安裝目錄
            index index.html index.htm;# 默認的首頁文件欲侮,多個用空格分開
        } # 第一個location區(qū)塊結(jié)果
        error_page 500502503504  /50x.html崭闲;# 出現(xiàn)對應的http狀態(tài)碼時,使用50x.html回應客戶
        location = /50x.html { # location區(qū)塊開始威蕉,訪問50x.html
            root   html刁俭;# 指定對應的站點目錄為html
        }
    }
    ......

為什么 Nginx 不使用多線程?

Apache: 創(chuàng)建多個進程或線程韧涨,而每個進程或線程都會為其分配 cpu 和內(nèi)存(線程要比進程小的多牍戚,所以 worker 支持比 perfork 高的并發(fā)),并發(fā)過大會榨干服務器資源虑粥。

Nginx: 采用單線程來異步非阻塞處理請求(管理員可以配置 Nginx 主進程的工作進程的數(shù)量)(epoll)如孝,不會為每個請求分配 cpu 和內(nèi)存資源,節(jié)省了大量資源娩贷,同時也減少了大量的 CPU 的上下文切換第晰。所以才使得 Nginx 支持更高的并發(fā)。

nginx和apache的區(qū)別

輕量級彬祖,同樣起web服務茁瘦,比apache占用更少的內(nèi)存和資源。

抗并發(fā)储笑,nginx處理請求是異步非阻塞的甜熔,而apache則是阻塞性的,在高并發(fā)下nginx能保持低資源突倍,低消耗高性能腔稀。

高度模塊化的設計,編寫模塊相對簡單羽历。

最核心的區(qū)別在于apache是同步多進程模型焊虏,一個連接對應一個進程,nginx是異步的窄陡,多個連接可以對應一個進程炕淮。


什么是動態(tài)資源、靜態(tài)資源分離跳夭?

動態(tài)資源、靜態(tài)資源分離们镜,是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來币叹,動靜資源做好了拆分以后我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路模狭。

動態(tài)資源颈抚、靜態(tài)資源分離簡單的概括是:動態(tài)文件與靜態(tài)文件的分離。

為什么要做動、靜分離贩汉?

在我們的軟件開發(fā)中驱富,有些請求是需要后臺處理的(如:.jsp,.do 等等),有些請求是不需要經(jīng)過后臺處理的(如:css匹舞、html褐鸥、jpg、js 等等文件)赐稽,這些不需要經(jīng)過后臺處理的文件稱為靜態(tài)文件叫榕,否則動態(tài)文件。

因此我們后臺處理忽略靜態(tài)文件姊舵。這會有人又說那我后臺忽略靜態(tài)文件不就完了嗎晰绎?當然這是可以的,但是這樣后臺的請求次數(shù)就明顯增多了括丁。在我們對資源的響應速度有要求的時候荞下,我們應該使用這種動靜分離的策略去解決動、靜分離將網(wǎng)站靜態(tài)資源(HTML史飞,JavaScript尖昏,CSS,img等文件)與后臺應用分開部署祸憋,提高用戶訪問靜態(tài)代碼的速度会宪,降低對后臺應用訪問

這里我們將靜態(tài)資源放到 Nginx 中,動態(tài)資源轉(zhuǎn)發(fā)到 Tomcat 服務器中去蚯窥。

當然掸鹅,因為現(xiàn)在七牛、阿里云等 CDN 服務已經(jīng)很成熟拦赠,主流的做法巍沙,是把靜態(tài)資源緩存到 CDN 服務中,從而提升訪問速度荷鼠。

相比本地的 Nginx 來說句携,CDN 服務器由于在國內(nèi)有更多的節(jié)點喉悴,可以實現(xiàn)用戶的就近訪問烈菌。并且,CDN 服務可以提供更大的帶寬蚪拦,不像我們自己的應用服務牍疏,提供的帶寬是有限的蠢笋。

什么叫 CDN 服務?

CDN 鳞陨,即內(nèi)容分發(fā)網(wǎng)絡昨寞。

其目的是,通過在現(xiàn)有的 Internet中 增加一層新的網(wǎng)絡架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡邊緣援岩,使用戶可就近取得所需的內(nèi)容歼狼,提高用戶訪問網(wǎng)站的速度。

一般來說享怀,因為現(xiàn)在 CDN 服務比較大眾羽峰,所以基本所有公司都會使用 CDN 服務。

Nginx 怎么做的動靜分離凹蜈?

只需要指定路徑對應的目錄限寞。location/可以使用正則表達式匹配。并指定對應的硬盤中的目錄仰坦。如下:(操作都是在Linux上)

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

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

Nginx 負載均衡的算法怎么實現(xiàn)的?策略有哪些?

為了避免服務器崩潰履植,大家會通過負載均衡的方式來分擔服務器壓力。將對臺服務器組成一個集群悄晃,當用戶訪問時玫霎,先訪問到一個轉(zhuǎn)發(fā)服務器,再由轉(zhuǎn)發(fā)服務器將訪問分發(fā)到壓力更小的服務器妈橄。

Nginx負載均衡實現(xiàn)的策略有以下五種:

1 .輪詢(默認)

每個請求按時間順序逐一分配到不同的后端服務器庶近,如果后端某個服務器宕機,能自動剔除故障系統(tǒng)眷蚓。

upstream backserver {
 server 192.168.0.12;
 server 192.168.0.13;
}

2. 權(quán)重 weight

weight的值越大鼻种,分配到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下沙热。其次是為在主從的情況下設置不同的權(quán)值叉钥,達到合理有效的地利用主機資源。

# 權(quán)重越高篙贸,在被訪問的概率越大投队,如上例,分別是20%爵川,80%敷鸦。
upstream backserver {
 server 192.168.0.12 weight=2;
 server 192.168.0.13 weight=8;
}

3. ip_hash( IP綁定)

每個請求按訪問IP的哈希結(jié)果分配,使來自同一個IP的訪客固定訪問一臺后端服務器寝贡,并且可以有效解決動態(tài)網(wǎng)頁存在的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算法可以根據(jù)頁面大小和加載時間長短智能地進行負載均衡谎碍,響應時間短的優(yōu)先分配。

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

5.url_hash(第三方插件)

必須安裝Nginx的hash軟件包

按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務器澡匪,可以進一步提高后端緩存服務器的效率熔任。

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

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

使用Nginx轉(zhuǎn)發(fā)請求唁情。把跨域的接口寫成調(diào)本域的接口疑苔,然后將這些接口轉(zhuǎn)發(fā)到真正的請求地址。

Nginx 虛擬主機怎么配置?

1甸鸟、基于域名的虛擬主機惦费,通過域名來區(qū)分虛擬主機——應用:外部網(wǎng)站

2、基于端口的虛擬主機抢韭,通過端口來區(qū)分虛擬主機——應用:公司內(nèi)部網(wǎng)站薪贫,外部網(wǎng)站的管理后臺

3、基于ip的虛擬主機刻恭。

基于虛擬主機配置域名

需要建立/data/www /data/bbs目錄瞧省,windows本地hosts添加虛擬機ip地址對應的域名解析;對應域名網(wǎng)站目錄下新增index.html文件鳍贾;

# 當客戶端訪問www.lijie.com,監(jiān)聽端口號為80,直接跳轉(zhuǎn)到data/www目錄下文件
server {
    listen       80;
    server_name  www.lijie.com;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

# 當客戶端訪問www.lijie.com,監(jiān)聽端口號為80,直接跳轉(zhuǎn)到data/bbs目錄下文件
 server {
    listen       80;
    server_name  bbs.lijie.com;
    location / {
        root   data/bbs;
        index  index.html index.htm;
    }
}

基于端口的虛擬主機

使用端口來區(qū)分鞍匾,瀏覽器使用域名或ip地址:端口號 訪問

# 當客戶端訪問www.lijie.com,監(jiān)聽端口號為8080,直接跳轉(zhuǎn)到data/www目錄下文件
 server {
    listen       8080;
    server_name  8080.lijie.com;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

# 當客戶端訪問www.lijie.com,監(jiān)聽端口號為80直接跳轉(zhuǎn)到真實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指令的作用是根據(jù)用戶請求的URI來執(zhí)行不同的應用骑科,也就是根據(jù)用戶請求的網(wǎng)站URL進行匹配橡淑,匹配成功即進行相關(guān)的操作。

location的語法能說出來嗎咆爽?

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

Location正則案例

# 優(yōu)先級1,精確匹配梁棠,根路徑
location =/ {
    return 400;
}

# 優(yōu)先級2,以某個字符串開頭,以av開頭的,優(yōu)先匹配這里伍掀,區(qū)分大小寫
location ^~ /av {
   root /data/av/;
}

# 優(yōu)先級3掰茶,區(qū)分大小寫的正則匹配,匹配/media*****路徑
location ~ /media {
      alias /data/static/;
}

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

# 優(yōu)先7,通用匹配
location / {
    return 403;
}

限流怎么做的把兔?

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

限流有3種

  • 正常限制訪問頻率(正常流量)
  • 突發(fā)限制訪問頻率(突發(fā)流量)
  • 限制并發(fā)連接數(shù)

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

實現(xiàn)三種限流算法

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

限制一個用戶發(fā)送的請求县好,我Nginx多久接收一個請求围橡。

Nginx中使用ngx_http_limit_req_module模塊來限制的訪問頻率,限制的原理實質(zhì)是基于漏桶算法原理來實現(xiàn)的缕贡。在nginx.conf配置文件中可以使用limit_req_zone命令及l(fā)imit_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泪勒、突發(fā)限制訪問頻率(突發(fā)流量):

限制一個用戶發(fā)送的請求,我Nginx多久接收一個宴猾。

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

Nginx提供burst參數(shù)結(jié)合nodelay參數(shù)可以解決流量突發(fā)的問題,可以設置能處理的超過設置的請求數(shù)外能額外處理的請求數(shù)税产。我們可以將之前的例子添加burst參數(shù)以及nodelay參數(shù):

# 定義限流維度怕轿,一個用戶一分鐘一個請求進來,多余的全部漏掉
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诀紊、 限制并發(fā)連接數(shù)

Nginx中的ngx_http_limit_conn_module模塊提供了限制并發(fā)連接數(shù)的功能,可以使用limit_conn_zone指令以及l(fā)imit_conn執(zhí)行進行配置隅俘。接下來我們可以通過一個簡單的例子來看下:

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同時并發(fā)連接數(shù)最多只能10個連接邻奠,并且設置了整個虛擬服務器同時最大并發(fā)數(shù)最多只能100個鏈接。當然为居,只有當請求的header被服務器處理后碌宴,虛擬服務器的連接數(shù)才會計數(shù)。剛才有提到過Nginx是基于漏桶算法原理實現(xiàn)的蒙畴,實際上限流一般都是基于漏桶算法和令牌桶算法實現(xiàn)的贰镣。

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

漏桶算法

漏桶算法思路很簡單膳凝,我們把水比作是請求碑隆,漏桶比作是系統(tǒng)處理能力極限,水先進入到漏桶里蹬音,漏桶里的水按一定速率流出上煤,當流出的速率小于流入的速率時,由于漏桶容量有限著淆,后續(xù)進入的水直接溢出(拒絕請求)劫狠,以此實現(xiàn)限流拴疤。

令牌桶算法

令牌桶算法的原理也比較簡單,我們可以理解成醫(yī)院的掛號看病嘉熊,只有拿到號以后才可以進行診病遥赚。

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

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

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

Nginx配置代碼:

server {
        listen       80;
        server_name  www.lijie.com;
        location / {
            ### 指定上游服務器負載均衡服務器
            proxy_pass http://backServer;
            ###nginx與上游服務器(真實訪問的服務器)超時時間 后端服務器連接的超時時間_發(fā)起握手等候響應超時時間
            proxy_connect_timeout 1s;
            ###nginx發(fā)送給上游服務器(真實訪問的服務器)超時時間
            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 //已經(jīng)經(jīng)過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 //請求的響應狀態(tài)碼,如:200
$body_bytes_sent // 響應時送出的body字節(jié)數(shù)數(shù)量伴鳖。即使連接中斷,這個數(shù)據(jù)也是精確的,如: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的參數(shù)(GET)徙硅,如a=1&b=2
$document_uri //與$uri相同 這個變量指當前的請求URI榜聂,不包括任何參數(shù)(見$args) 如:/2013/81.html
$document_root //針對當前請求的根路徑設置值
$hostname //如:centos53.localdomain
$http_cookie //客戶端cookie信息
$cookie_COOKIE //cookie COOKIE變量的值
$is_args //如果有$args參數(shù),這個變量等于”?”嗓蘑,否則等于”"须肆,空值匿乃,如?
$limit_rate //這個變量可以限制連接速率,0表示不限速
$query_string // 與$args相同 等于當中URL的參數(shù)(GET)豌汇,如a=1&b=2
$request_body // 記錄POST過來的數(shù)據(jù)信息
$request_body_file //客戶端請求主體信息的臨時文件名
$request_method //客戶端請求的動作幢炸,通常為GET或POST,如:GET
$request_uri //包含請求參數(shù)的原始URI,不包含主機名拒贱,如:/2013/81.html?a=1&b=2
$scheme //HTTP方法(如http宛徊,https),如:http
$uri //這個變量指當前的請求URI,不包括任何參數(shù)(見$args) 如:/2013/81.html
$request_completion //如果請求結(jié)束逻澳,設置為OK. 當請求未結(jié)束或如果該請求不是請求鏈串的最后一個時闸天,為空(Empty),如:OK
$server_protocol //請求使用的協(xié)議斜做,通常是HTTP/1.0或HTTP/1.1苞氮,如:HTTP/1.1
$server_addr //服務器IP地址,在完成一次系統(tǒng)調(diào)用后可以確定這個值
$server_name //服務器名稱瓤逼,如:blog.sakmon.com
$server_port //請求到達服務器的端口號,如:80

Nginx 如何實現(xiàn)后端服務的健康檢查笼吟?

方式一,利用 nginx 自帶模塊 ngx_http_proxy_module 和 ngx_http_upstream_module 對后端節(jié)點做健康檢查霸旗。

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

Nginx 如何開啟壓縮定硝?

開啟nginx gzip壓縮后皿桑,網(wǎng)頁、css蔬啡、js等靜態(tài)資源的大小會大大的減少诲侮,從而可以節(jié)約大量的帶寬,提高傳輸效率箱蟆,給用戶快的體驗沟绪。雖然會消耗cpu資源,但是為了給用戶更好的體驗是值得的空猜。

開啟的配置如下:

將以上配置放到nginx.conf的http{ … }節(jié)點中绽慈。

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

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

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

1唁影、圖片類型

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

2、大文件

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

ngx_http_upstream_module的作用是什么?

ngx_http_upstream_module用于定義可通過fastcgi傳遞、proxy傳遞筑公、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的服務器組尊浪。

什么是C10K問題?

C10K問題是指無法同時處理大量客戶端(10,000)的網(wǎng)絡套接字匣屡。

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

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

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

要獲得Nginx的當前時間,必須使用SSI模塊鹅士、和date_local的變量券躁。

Proxy_set_header THE-TIME $date_gmt;

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

用于運行Nginx -s參數(shù)的可執(zhí)行文件。

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

在編譯過程中掉盅,必須選擇Nginx模塊也拜,因為Nginx不支持模塊的運行時間選擇。

生產(chǎn)中如何設置worker進程的數(shù)量呢趾痘?

在有多個cpu的情況下慢哈,可以設置多個worker,worker進程的數(shù)量可以設置到和cpu的核心數(shù)一樣多永票,如果在單個cpu上起多個worker進程卵贱,那么操作系統(tǒng)會在多個worker之間進行調(diào)度,這種情況會降低系統(tǒng)性能侣集,如果只有一個cpu键俱,那么只啟動一個worker進程就可以了。

nginx狀態(tài)碼

499:
服務端處理時間過長世分,客戶端主動關(guān)閉了連接编振。

502:

(1).FastCGI進程是否已經(jīng)啟動

(2).FastCGI worker進程數(shù)是否不夠

(3).FastCGI執(zhí)行時間過長

- fastcgi_connect_timeout 300;
- fastcgi_send_timeout 300;
- fastcgi_read_timeout 300;

(4).FastCGI Buffer不夠,nginx和apache一樣罚攀,有前端緩沖限制党觅,可以調(diào)整緩沖參數(shù)

- fastcgi_buffer_size 32k;
- fastcgi_buffers 8 32k;

(5). Proxy Buffer不夠雌澄,如果你用了Proxying,調(diào)整

- proxy_buffer_size 16k;
- proxy_buffers 4 16k;

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杯瞻,一起剝皮案震驚了整個濱河市镐牺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魁莉,老刑警劉巖睬涧,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旗唁,居然都是意外死亡畦浓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門检疫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讶请,“玉大人,你說我怎么就攤上這事屎媳《嵋纾” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵烛谊,是天一觀的道長风响。 經(jīng)常有香客問我,道長丹禀,這世上最難降的妖魔是什么状勤? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮双泪,結(jié)果婚禮上持搜,老公的妹妹穿的比我還像新娘。我一直安慰自己攒读,他們只是感情好朵诫,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著薄扁,像睡著了一般剪返。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邓梅,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天脱盲,我揣著相機與錄音,去河邊找鬼日缨。 笑死钱反,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播面哥,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼哎壳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尚卫?” 一聲冷哼從身側(cè)響起归榕,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吱涉,沒想到半個月后刹泄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡怎爵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年特石,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖链。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姆蘸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芙委,到底是詐尸還是另有隱情乞旦,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布题山,位于F島的核電站,受9級特大地震影響故痊,放射性物質(zhì)發(fā)生泄漏顶瞳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一愕秫、第九天 我趴在偏房一處隱蔽的房頂上張望慨菱。 院中可真熱鬧,春花似錦戴甩、人聲如沸符喝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽协饲。三九已至,卻和暖如春缴川,著一層夾襖步出監(jiān)牢的瞬間茉稠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工把夸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留而线,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像膀篮,于是被迫代替她去往敵國和親嘹狞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容