佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 為什么我推薦Nginx作為后端服務(wù)器代理(原因解析)

為什么我推薦Nginx作為后端服務(wù)器代理(原因解析)

熱門標(biāo)簽:智能手機(jī) 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 美圖手機(jī) 網(wǎng)站建設(shè) 阿里云 使用U盤裝系統(tǒng) 硅谷的囚徒呼叫中心 檢查注冊(cè)表項(xiàng)

1. 前言

我們真實(shí)的服務(wù)器不應(yīng)該直接暴露到公網(wǎng)上去,否則更加容易泄露服務(wù)器的信息,也更加容易受到攻擊。一個(gè)比較“平民化”的方案是使用Nginx反向代理它。今天就來聊一聊使用Nginx反向代理的一些能力,Nginx代理能幫助我們實(shí)現(xiàn)很多非常有效的API控制功能。這也解釋了我為什么一直推薦使用Nginx來代理我們的Spring Boot應(yīng)用。

2. Nginx可以提供哪些能力

Nginx已經(jīng)不用太多的贊美了,它已經(jīng)得到了業(yè)界的廣泛認(rèn)可。我們就聊聊它具體能夠?qū)崿F(xiàn)什么功能。

2.1 代理能力

這是針對(duì)服務(wù)器端我們最常用的功能,一臺(tái)具有公網(wǎng)的Nginx服務(wù)器可以代理和它能進(jìn)行內(nèi)網(wǎng)通信的真實(shí)的服務(wù)器。讓我們的服務(wù)器不直接對(duì)外暴露,增加其抗風(fēng)險(xiǎn)能力。

假如Nginx服務(wù)器192.168.1.8可以和同一內(nèi)網(wǎng)網(wǎng)段的192.168.1.9的應(yīng)用服務(wù)器進(jìn)行通信,同時(shí)Nginx服務(wù)器具有公網(wǎng)能力并將公網(wǎng)綁定到域名felord.cn上。那么我們Nginx代理的對(duì)應(yīng)的配置(nginx.conf)是這樣的:

 server {
  listen  80;
  server_name felord.cn;
 # ^~ 表示uri以某個(gè)常規(guī)字符串開頭,如果匹配到,則不繼續(xù)往下匹配。不是正則匹配
  location ^~ /api/v1 {
   proxy_set_header Host $host;
   proxy_pass http://192.168.1.9:8080/;
  }
 }

經(jīng)過以上配置后我們服務(wù)器真實(shí)的接口地址是http://192.168.1.9:8080/foo/get就可以通過http://felord.cn/api/v1/foo/get訪問。

proxy_pass如果以/結(jié)尾,就相當(dāng)于是絕對(duì)根路徑,那么Nginx不會(huì)把location中匹配的路徑部分代理走;如果不以/結(jié)尾,也會(huì)代理匹配的路徑部分。

2.2 Rewrite功能

Nginx還提供了一個(gè)rewrite功能讓我們?cè)谡?qǐng)求到達(dá)服務(wù)器時(shí)重寫URI,有點(diǎn)類似Servlet Filter的意味,對(duì)請(qǐng)求進(jìn)行一些預(yù)處理。

在2.1的例子中如果我們要實(shí)現(xiàn)如果判斷請(qǐng)求為POST的話返回405,只需要更改配置為:

location ^~ /api/v1 {
 proxy_set_header Host $host;
 if ($request_method = POST){
  return 405;
 }
 proxy_pass http://192.168.1.9:8080/;
}

你可以使用Nginx提供的全局變量(如上面配置中的$request_method)或自己設(shè)置的變量作為條件,結(jié)合正則表達(dá)式和標(biāo)志位(last、break、redirect、permanent)實(shí)現(xiàn)URI重寫以及重定向。

2.3 配置HTTPS

之前很多同學(xué)在群里問如何在Spring Boot項(xiàng)目中配置HTTPS,我都推薦使用Nginx來做這個(gè)事情。 Nginx比Spring Boot中配置SSL要方便的多,而且不影響我們本地開發(fā)。Nginx中HTTPS的相關(guān)配置根據(jù)下面的改一改就能用:

http{
 #http節(jié)點(diǎn)中可以添加多個(gè)server節(jié)點(diǎn)
 server{
  #ssl 需要監(jiān)聽443端口
  listen 443;
  # CA證書對(duì)應(yīng)的域名
  server_name felord.cn;
  # 開啟ssl
  ssl on;
  # 服務(wù)器證書絕對(duì)路徑
  ssl_certificate /etc/ssl/cert_felord.cn.crt;
  # 服務(wù)器端證書key絕對(duì)路徑 
  ssl_certificate_key /etc/ssl/cert_felord.cn.key;
  ssl_session_timeout 5m;
  # 協(xié)議類型
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  # ssl算法列表 
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  # 是否 服務(wù)器決定使用哪種算法 on/off TLSv1.1 的話需要開啟
  ssl_prefer_server_ciphers on;
  
  location ^~ /api/v1 {
   proxy_set_header Host $host;
   proxy_pass http://192.168.1.9:8080/;
  }
 }
 # 如果用戶通過 http 訪問 直接重寫 跳轉(zhuǎn)到 https 這個(gè)是一個(gè)很有必要的操作
 server{
  listen 80;
  server_name felord.cn;
  rewrite ^/(.*)$ https://felord.cn:443/$1 permanent;
 }

}

這里就用到了rewrite來提高用戶體驗(yàn)。

2.4 負(fù)載均衡

一般項(xiàng)目都是從小做到大起來的,起步的時(shí)候部署一個(gè)服務(wù)器就夠用了,如果你的項(xiàng)目用戶多了起來,首先恭喜你,說明你的項(xiàng)目方向很對(duì)。但是伴隨而來還有服務(wù)器壓力,你一定不想服務(wù)器宕機(jī)帶來的各種損失,你需要快速提高服務(wù)器的抗壓能力,或者你想不停機(jī)維護(hù)避免業(yè)務(wù)中斷,這些都可以通過Nginx的負(fù)載均衡來實(shí)現(xiàn),而且非常簡(jiǎn)單。假如felord.cn我們部署了三個(gè)節(jié)點(diǎn):

最簡(jiǎn)單的輪詢策略

輪番派發(fā)請(qǐng)求,這種配置是最簡(jiǎn)單的:

http {
 
 upstream app {
   # 節(jié)點(diǎn)1
   server 192.168.1.9:8080;
   # 節(jié)點(diǎn)2
   server 192.168.1.10:8081;
   # 節(jié)點(diǎn)3
   server 192.168.1.11:8082;
 }
 
 server {
  listen  80;
  server_name felord.cn;
 # ^~ 表示uri以某個(gè)常規(guī)字符串開頭,如果匹配到,則不繼續(xù)往下匹配。不是正則匹配
  location ^~ /api/v1 {
   proxy_set_header Host $host;
   # 負(fù)載均衡
   proxy_pass http://app/;
  }
 }
}

加權(quán)輪詢策略

指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況:

upstream app {
  # 節(jié)點(diǎn)1
  server 192.168.1.9:8080 weight = 6;
  # 節(jié)點(diǎn)2
  server 192.168.1.10:8081 weight = 3;
  # 節(jié)點(diǎn)3
  server 192.168.1.11:8082 weight = 1;
}

最終請(qǐng)求處理數(shù)將為6:3:1 進(jìn)行分配。其實(shí)簡(jiǎn)單輪詢可以看作所有的權(quán)重均分為1。輪詢宕機(jī)可自動(dòng)剔除。

IP HASH

根據(jù)訪問IP進(jìn)行Hash,這樣每個(gè)客戶端將固定訪問服務(wù)器,如果服務(wù)器宕機(jī),需要手動(dòng)剔除。

upstream app {
  ip_hash;
  # 節(jié)點(diǎn)1
  server 192.168.1.9:8080 weight = 6;
  # 節(jié)點(diǎn)2
  server 192.168.1.10:8081 weight = 3;
  # 節(jié)點(diǎn)3
  server 192.168.1.11:8082 weight = 1;
}

最少連接

請(qǐng)求將轉(zhuǎn)發(fā)到連接數(shù)較少的服務(wù)器上,充分利用服務(wù)器資源:

upstream app {
  least_conn;
  # 節(jié)點(diǎn)1
  server 192.168.1.9:8080 weight = 6;
  # 節(jié)點(diǎn)2
  server 192.168.1.10:8081 weight = 3;
  # 節(jié)點(diǎn)3
  server 192.168.1.11:8082 weight = 1;
}

其它方式

我們可以借助一些插件來實(shí)現(xiàn)其它模式的負(fù)載均衡,例如借助于nginx-upsync-module實(shí)現(xiàn)動(dòng)態(tài)負(fù)載均衡。我們是不是借助于此可以開發(fā)一個(gè)灰度發(fā)布功能呢?

2.5 限流

通過對(duì)Nginx的配置,我們可以實(shí)現(xiàn)漏桶算法和令牌桶算法,通過限制單位時(shí)間的請(qǐng)求數(shù)、同一時(shí)間的連接數(shù)來限制訪問速度。這一塊我并沒有深入研究過這里就提一提,你可以查詢相關(guān)的資料研究。

3. 總結(jié)

Nginx非常強(qiáng)大,推薦使用它來代理我們的后端應(yīng)用,我們可以通過配置實(shí)現(xiàn)很多有用的功能,而不必進(jìn)行一些非業(yè)務(wù)邏輯的編碼來實(shí)現(xiàn),如果你在Spring Boot中實(shí)現(xiàn)限流、配置SSL的話,麻煩不說,還影響本地開發(fā),使用Nginx可以讓我們專心到業(yè)務(wù)中去??梢哉fNginx在這里充當(dāng)了一個(gè)小網(wǎng)關(guān)的作用,其實(shí)很多知名網(wǎng)關(guān)底層都是Nginx,比如Kong、Orange、Apache APISIX等,如果你有興趣可以玩一玩Nginx的高級(jí)形態(tài)Openresty。

到此這篇關(guān)于為什么我推薦Nginx作為后端服務(wù)器代理的文章就介紹到這了,更多相關(guān)Nginx作為后端服務(wù)器代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:懷化 湖北 賀州 湘潭 黃山 煙臺(tái) 山南 通遼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《為什么我推薦Nginx作為后端服務(wù)器代理(原因解析)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    乐平市| 晋江市| 奎屯市| 山西省| 咸丰县| 柘荣县| 开封市| 土默特左旗| 岢岚县| 馆陶县| 辉县市| 西藏| 定结县| 雅安市| 阿拉善左旗| 诸暨市| 海丰县| 巩留县| 昔阳县| 利川市| 长阳| 临洮县| 肃北| 观塘区| 恭城| 壶关县| 崇文区| 阿克苏市| 离岛区| 遵化市| 富宁县| 乐陵市| 南城县| 玉田县| 兴业县| 广德县| 定结县| 介休市| 灵宝市| 南江县| 汽车|