亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

基于 Nginx 的動態(tài)代理

wean / 828人閱讀

摘要:目前最常用的軟件反向代理服務(wù)器有和?;趯崿F(xiàn)動態(tài)代理為了實現(xiàn)動態(tài)代理方案,需要在反向代理服務(wù)器中增加定制的功能。同時,由于反向代理服務(wù)器需要處理大量的代理請求,因此會頻繁的讀取反向代理配置數(shù)據(jù)。

基于 Nginx 的動態(tài)代理

作者:趙波
日期:2016 年 8 月 4 日

在實際應(yīng)用中,遇到了這樣一個場景:

已有一個手機 APP 客戶端,需要在該 APP 客戶端中實現(xiàn)通過 Web 的形式接入其他的應(yīng)用頁面。按照常規(guī)的流程,在 APP 中為應(yīng)用設(shè)置入口鏈接按鈕,當(dāng)用戶點擊應(yīng)用入口按鈕時,APP 啟動 WebView 并打開設(shè)置的應(yīng)用鏈接即可。

但在該場景中,接入 APP 的應(yīng)用均部署在內(nèi)網(wǎng)服務(wù)器,外網(wǎng)無法直接訪問,因此在 APP 中配置的鏈接是內(nèi)網(wǎng)地址,當(dāng)用戶通過外網(wǎng)使用 APP 時,將無法訪問接入的 Web 應(yīng)用。

針對如上場景中遇到的問題,本文中提出了基于 Nginx 實現(xiàn)動態(tài)代理的解決方案。

使用代理

在前面的場景中,要實現(xiàn)內(nèi)網(wǎng)應(yīng)用能夠被外網(wǎng)訪問,一般有兩種方式:

將應(yīng)用部署到可被外網(wǎng)訪問的服務(wù)器,通常為 DMZ 區(qū)服務(wù)器

使用反向代理服務(wù)器,將外網(wǎng)請求代理轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的應(yīng)用服務(wù)器

其中,將內(nèi)網(wǎng)應(yīng)用部署到可被外網(wǎng)訪問的服務(wù)器上的方法,通常受限于可提供的硬件環(huán)境、安全控制等方面的問題,并不是解決該類問題的首選方案。因此,通常會在可被外網(wǎng)訪問的服務(wù)器上部署反向代理服務(wù)器,使用代理轉(zhuǎn)發(fā)來解決。

目前最常用的軟件反向代理服務(wù)器有 Apache 和 Nginx 。通過配置文件設(shè)置,就可以將特定的鏈接向應(yīng)用服務(wù)器轉(zhuǎn)發(fā)。例如 Nginx 可通過以下簡單的配置,即可實現(xiàn)代理轉(zhuǎn)發(fā):

server
{
    listen 80;
    server_name domain.com;
    location /app1 {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.10.38:3000/app1;
    }
    access_log logs/domain.com.access.log;
}

在以上實例中,Nginx 配置完成后,即可將 http://domain.com/app 的所有請求代理轉(zhuǎn)發(fā)到 http://192.168.10.38:3000/app1 地址,這樣就可以實現(xiàn)針對 app1 的從外網(wǎng)訪問內(nèi)網(wǎng)應(yīng)用的代理轉(zhuǎn)發(fā)功能。此時 app1 對于外網(wǎng)的訪問地址就變成了 http://domain.com/app 。

通過使用代理服務(wù)器, 所有的應(yīng)用將擁有統(tǒng)一域名 ,而通過 二級目錄區(qū)分 不同的應(yīng)用。

在 Apache 中同樣可以采用類似的策略進(jìn)行代理轉(zhuǎn)發(fā),本文中主要以 Nginx 作為實例。

在多個接入多個應(yīng)用的情況下,只要按照上述實例中的配置,為不同的應(yīng)用分配不同的二級目錄,即可實現(xiàn)向不同應(yīng)用進(jìn)行代理轉(zhuǎn)發(fā)。這樣就可以解決文章開始提出的問題。

但是這一解決方案也存在問題:

當(dāng)需要新增/修改/刪除應(yīng)用的代理轉(zhuǎn)發(fā)配置時,需要人工修改配置文件,并重啟代理轉(zhuǎn)發(fā)服務(wù)器,這將導(dǎo)致服務(wù)的暫時不可用。

當(dāng)接入應(yīng)用較多時,配置文件將越來越大,對用人工維護(hù)造成極大的不便。

當(dāng)代理轉(zhuǎn)發(fā)服務(wù)器進(jìn)行集群化部署時,每次對配置文件的更新,都需要更新所有代理轉(zhuǎn)發(fā)服務(wù)器,并進(jìn)行重啟,這將增大維護(hù)的風(fēng)險。

針對以上的問題,需要對該訪問進(jìn)行進(jìn)一步改進(jìn)。

使用動態(tài)代理

如果能夠使反向代理服務(wù)器動態(tài)的通過集中的配置數(shù)據(jù)更新針對應(yīng)用的代理配置,就可以解決上述方案中存在的問題。

經(jīng)過研究分析,本文中提出 動態(tài)代理 方案,流程如下:

當(dāng)請求進(jìn)入反向代理服務(wù)器時,反向代理服務(wù)器將分析進(jìn)入的請求 URL ,識別 URL 中的二級目錄(用于區(qū)分不同的應(yīng)用),然后使用該二級目錄作為應(yīng)用標(biāo)識,到代理配置數(shù)據(jù)數(shù)據(jù)中進(jìn)行查詢,獲得代理地址的返回結(jié)果,然后將該請求轉(zhuǎn)發(fā)到對應(yīng)的應(yīng)用服務(wù)器。

同時,管理人員可以通過特定的管理端,對代理配置數(shù)據(jù)進(jìn)行 CRUD 操作,方便管理人員對代理應(yīng)用配置的實時管理。

通過以上流程,即可實現(xiàn)在不中斷服務(wù)的情況下,動態(tài)修改代理配置。同時也可以確保集群化的反向代理服務(wù)器同步更新,都可以獲得最新的配置數(shù)據(jù)。

使用動態(tài)代理方案,即可以解決在文章開頭提出的問題。

基于 Nginx 實現(xiàn)動態(tài)代理

為了實現(xiàn)動態(tài)代理方案,需要在反向代理服務(wù)器中增加定制的功能。針對這一目的,研究了目前主流的反向代理服務(wù)器 Apache 和 Nginx ,結(jié)論如下:

Apache 和 Nginx 均可以增加定制的模塊以實現(xiàn)定制的功能。但是 Apache 目前必須使用 C 語言按照 Apache 的要求編寫模塊,這對于開發(fā)者要求相對較高。而 Nginx 同樣可以使用 C 語言開發(fā)擴展模塊,但除此之外,目前已有針對 Nginx 開發(fā)的 Lua 語言解釋器模塊,即可以在 Nginx 的配置文件中直接調(diào)用 Lua 語言開發(fā)的腳本程序,這種方式極大的降低了定制功能開發(fā)的難度。因此,采用 Nginx 作為反向代理服務(wù)器,使用 Lua 語言作為定制功能開發(fā)語言,進(jìn)行動態(tài)代理功能實現(xiàn)。

同時,由于反向代理服務(wù)器需要處理大量的代理請求,因此會頻繁的讀取反向代理配置數(shù)據(jù)?;谶@一情況,選用 Redis 作為數(shù)據(jù)庫,利用其高性能的數(shù)據(jù)讀寫,支撐代理配置數(shù)據(jù)的頻繁訪問。

根據(jù)以上的技術(shù)選型,設(shè)計流程圖如下:

在 Nginx 的配置文件中通過 Lua 解釋器模塊,調(diào)用 Lua 腳本。請求進(jìn)入 Nginx 后,通過 Lua 腳本處理請求,并連接 Redis 獲取當(dāng)前 URL 對應(yīng)的應(yīng)用的代理地址,處理完成后,將代理地址回寫到 Nginx 的配置塊,由 Nginx 完成后續(xù)的代理轉(zhuǎn)發(fā)工作。

在運行期間,管理人員可以使用代理管理端,對 Redis 中的代理配置數(shù)據(jù)進(jìn)行操作,操作完成后,Nginx 代理服務(wù)器將及時讀取到最新的配置數(shù)據(jù)進(jìn)行轉(zhuǎn)發(fā)。

經(jīng)過調(diào)研,在具體開發(fā)過程中,采用了基于 Nginx 進(jìn)行了模塊擴展的 OpenResty。OpenResty 基于 Nginx 擴展了大量的模塊,其中非常核心的特點就是在 Nginx 中集成了 Lua 解釋器,實現(xiàn)了 Nginx 調(diào)用 Lua 腳本。同時 OpenResty 還提供了 Lua 語言實現(xiàn)的訪問 Redis 的代碼模塊。

Nginx 動態(tài)代理優(yōu)化 代理配置數(shù)據(jù)緩存

在實際測試過程中,當(dāng)訪問量較大時,由于 Nginx 服務(wù)器每次代理都會查詢 Redis ,可能是導(dǎo)致 Redis 壓力過大而無法響應(yīng),導(dǎo)致請求被阻塞。

為了應(yīng)對這一問題,在 Nginx 中,使用 Lua 腳本設(shè)置內(nèi)存緩存,從 Redis 獲取的代理數(shù)據(jù)將在一定時間內(nèi)保留在 Nginx 服務(wù)器的內(nèi)存中,在內(nèi)存緩存數(shù)據(jù)有效期內(nèi),將不會再重復(fù)向 Redis 請求數(shù)據(jù)。

經(jīng)過測試,在進(jìn)行數(shù)據(jù)緩存優(yōu)化后,極大的提高了 Redis 訪問的穩(wěn)定性。

Redis 集群化

由于單點 Redis 一旦無法提供服務(wù),將導(dǎo)致 Nginx 代理服務(wù)無法正常使用。針對這一問題,需要對 Redis 進(jìn)行集群化。

目前比較成熟的解決方案是對 Redis 進(jìn)行主從備份,一個主節(jié)點提供對外服務(wù),多個從節(jié)點進(jìn)行數(shù)據(jù)備份,并在主節(jié)點停止服務(wù)后產(chǎn)生新的主節(jié)點繼續(xù)提供服務(wù)。使用 Redis 提供的 Redis Sentinel 進(jìn)行主從節(jié)點監(jiān)控,并向 Nginx 提供最新的主節(jié)點信息。

Nginx 集群化

隨著訪問量逐漸增大,單機的 Nginx 將無法再支持過大的訪問量,同時單機 Nginx 一旦停止服務(wù),將影響整個系統(tǒng)的正常運行。因此需要將 Nginx 進(jìn)行集群化,部署多個 Nginx 反向代理服務(wù)器,提供同樣的服務(wù)。

基于 Nginx 的動態(tài)代理方案,提供的代理服務(wù)為無狀態(tài)服務(wù),因此可以直接復(fù)制 Nginx 以實現(xiàn)集群化。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/39359.html

相關(guān)文章

  • UCloud基于SD-WAN架構(gòu)GitHub加速方案

    摘要:客戶收益與展望利用的云網(wǎng)基礎(chǔ)架構(gòu),該公司通過較低的成本,在不到一周的時間內(nèi),快速搭建一套高速穩(wěn)定的加速平臺方案。背景Git是目前世界上最流行的分布式版本控制系統(tǒng),GitHub是一個基于Git的代碼托管平臺,一個擁有143萬開發(fā)者的社區(qū),是一個巨大的開源寶庫。作為全球程序員和編程愛好者的聚集地,諸多優(yōu)秀的開源項目代碼都托管于GitHub上。UCloud深圳某初創(chuàng)客戶,正在開發(fā)運營一款海外社交A...

    Tecode 評論0 收藏0
  • koa中利用nginx反向代理動態(tài)及靜態(tài)文件

    摘要:背景最近在做一個基于的微信公眾平臺腳手架,由于我只有一個域名,現(xiàn)在同時有好幾個應(yīng)用在上面掛載著,所以只能做一下反向代理,可是反向代理只能代理動態(tài)文件,對于靜態(tài)資源貌似沒有什么好的解決方法本文針對以上問題進(jìn)行逐步解決,通過修改相關(guān)配置,并結(jié)合 背景 最近在做一個基于koa的微信公眾平臺腳手架,由于我只有一個域名demozhan.com,現(xiàn)在同時有好幾個web應(yīng)用在上面掛載著,所以只能做一...

    opengps 評論0 收藏0
  • koa中利用nginx反向代理動態(tài)及靜態(tài)文件

    摘要:背景最近在做一個基于的微信公眾平臺腳手架,由于我只有一個域名,現(xiàn)在同時有好幾個應(yīng)用在上面掛載著,所以只能做一下反向代理,可是反向代理只能代理動態(tài)文件,對于靜態(tài)資源貌似沒有什么好的解決方法本文針對以上問題進(jìn)行逐步解決,通過修改相關(guān)配置,并結(jié)合 背景 最近在做一個基于koa的微信公眾平臺腳手架,由于我只有一個域名demozhan.com,現(xiàn)在同時有好幾個web應(yīng)用在上面掛載著,所以只能做一...

    figofuture 評論0 收藏0
  • 基于Linux環(huán)境搭建Nginx+uWSGI+Python框架方法介紹

    摘要:目前在和平臺下使用最廣泛的免費服務(wù)器有和。涉及到普通用戶執(zhí)行命令時權(quán)限不足的問題,可在命令前增加指令解決。是基于二進(jìn)制的線路協(xié)議,與協(xié)議作用相同,但屬于服務(wù)器自有協(xié)議是服務(wù)器,它實現(xiàn)了協(xié)議等協(xié)議安裝。 前言 瀏覽器上網(wǎng)的過程簡單來說即是瀏覽器從服務(wù)器中獲取網(wǎng)站信息,經(jīng)過渲染后將效果呈現(xiàn)給用戶。這里側(cè)重介紹下在幕后默默工作著的服務(wù)器。Web服務(wù)器是運行在物理服務(wù)器上的一個程序,永久地等待...

    spacewander 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<