自動(dòng)化Nginx服務(wù)器的反向代理的配置方法

如果可以減少過(guò)多的外部隔離的API和簡(jiǎn)化部署的細(xì)節(jié) 這會(huì)是非常好的。
在以前的文章中,我解釋了"一些使用反向代理的好處"。在我目前的項(xiàng)目里,我們已經(jīng)構(gòu)建分布式面向服務(wù)的架構(gòu),也顯式提供了一個(gè)HTTP API,我們使用反向代理將請(qǐng)求路由通過(guò)API路由給單個(gè)組件。我們選擇了Nginx Web這個(gè)優(yōu)秀的服務(wù)器作為我們的反向代理,它快速、可靠且易于配置。我們通過(guò)它將多個(gè)HTTP的API服務(wù)聚合到一個(gè)URL空間。舉例來(lái)說(shuō),當(dāng)你鍵入:
http://api.example.com/product/pinstripe_suit
它將被路由到:
http://10.0.1.101:8001/product/pinstripe_suit
但當(dāng)你訪問(wèn):
http://api.example.com/customer/103474783
它將被路由到:
http://10.0.1.104:8003/customer/103474783
對(duì)使用者來(lái)言,他們覺(jué)得是在使用同一個(gè)URL空間(http://api.example.com/blah/blah),但在后端不同的頂級(jí)分類(lèi)的URL被路由到不同的后端服務(wù)器。 /prodect/...路由到 10.0.1.101:8001, /customer/…則路由到10.0.1.104:8003。 我們也希望這是自動(dòng)配置。比如說(shuō)我想創(chuàng)建一個(gè)新的組件來(lái)記錄的庫(kù)存水平。相比于擴(kuò)展現(xiàn)有的組件,我更希望能夠?qū)懥硪粋€(gè)獨(dú)立的可執(zhí)行文件或提供服務(wù)的HTTP端點(diǎn),然后自動(dòng)部署成為我的云計(jì)算基礎(chǔ)架構(gòu)中的主機(jī)之一,并使Nginx的自動(dòng)將http ://api.example.com/sock/whatever 路由我新組件。 我們也想進(jìn)行 后端服務(wù)的負(fù)載平衡,我們也想部署我們的股票 新API的多個(gè)服務(wù)實(shí)例間的Nginx自動(dòng)輪詢。
我們稱每個(gè)頂級(jí)分類(lèi)(/stock、/produck、/customer)為一個(gè)聲明。 A組件上線時(shí)通過(guò)RabbitMQ發(fā)布了一個(gè)'AddApiClaim'。此消息有3個(gè)字段:'聲明','IP地址','端口地址'。我們有一個(gè)'ProxyAutomation'的特殊組件,這個(gè)組件接收這些消息并按要求重寫(xiě)Nginx配置項(xiàng)。它使用SSH和SCP登錄到nginx服務(wù)器,傳輸各種配置文件,并指示Nginx的重新加載配置。我們使用the excellent SSH.NET庫(kù)來(lái)進(jìn)行自動(dòng)化。
Nginx的配置是一個(gè)非常好的事情是支持通配符??匆豢次覀兊捻敿?jí)配置文件:
...
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
如16行所描述, 將conf.d目錄的所有.conf引用到此處.
在conf.d文件夾內(nèi),有一個(gè)文件包含了所有api.example.com的請(qǐng)求配置:
include /etc/nginx/conf.d/api.example.com.conf.d/upstream.*.conf;
server {
listen 80;
server_name api.example.com;
include /etc/nginx/conf.d/api.example.com.conf.d/location.*.conf;
location / {
root /usr/share/nginx/api.example.com;
index index.html index.htm;
}
}
這段配置讓 Nginx 偵聽(tīng)來(lái)自 80 端口的 api.example.com 的請(qǐng)求。
這里包括兩部分。第一個(gè)部分是第一行,我將在以后討論。第7行表述了將子目錄"api.example.com.conf.d"中的location.*.conf引用到配置中來(lái)。我們代理服務(wù)器的自動(dòng)化組件添加新的組件(AKA API claims)通過(guò)引入新的location.*.conf。舉個(gè)例子,我們的股票組件可能創(chuàng)建一個(gè)location.stock.conf配置文件,像這樣:
location /stock/ {
proxy_pass http://stock;
}
這只是簡(jiǎn)單的告訴Nginx將所有api.example.com/stock/…的代理請(qǐng)求轉(zhuǎn)發(fā)到'stock'中定義的后端服務(wù)器,這些定義存放在'upstream.*.conf'中。代理自動(dòng)化組件也引入了一個(gè)名為upstream.stock.conf文件,它看起來(lái)像這樣:
upstream stock {
server 10.0.0.23:8001;
server 10.0.0.23:8002;
}
這些配置告訴Nginx將所有到api.example.com/stock/的請(qǐng)求輪詢到給定的地址,在這個(gè)例子中兩個(gè)實(shí)例在同一臺(tái)機(jī)器(10.0.0.23)上,一個(gè)在8001端口,一個(gè)在8002端口。
正如股票組件的部署一樣,添加新條目可以同樣增加到upstream.stock.conf中。同樣,當(dāng)組件卸載時(shí),只要?jiǎng)h除對(duì)應(yīng)條目就可以了,當(dāng)所有組件移除時(shí),將整個(gè)文件已就刪除。
這種基礎(chǔ)架構(gòu)可以讓我們聚合組件的基礎(chǔ)設(shè)備。我們可以 通過(guò)簡(jiǎn)單地添加新的組件實(shí)例來(lái)擴(kuò)展應(yīng)用程序。作為組件開(kāi)發(fā)人員也不需要做任何代理配置,只需要確保組件發(fā)送了添加或刪除API聲明的消息就可以了。
相關(guān)文章
pycharm右鍵沒(méi)有run,run不了問(wèn)題的解決
這篇文章主要介紹了pycharm右鍵沒(méi)有run,run不了問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python使用matplotlib創(chuàng)建Gif動(dòng)圖的思路
這篇文章主要介紹了Python使用matplotlib創(chuàng)建Gif動(dòng)圖,我們將討論matplotlib提供的名為“Animation”的動(dòng)畫(huà)庫(kù)之一,Python二維繪圖庫(kù)是Matplolib可以輕松創(chuàng)建繪圖、直方圖、條形圖、散點(diǎn)圖等,需要的朋友可以參考下2022-04-04
Python自動(dòng)化辦公之創(chuàng)建PPT文件
python-pptx模塊是Python中用于PPT操作的模塊。本文將利用這一模塊實(shí)現(xiàn)創(chuàng)建PPT文件。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05
跟老齊學(xué)Python之玩轉(zhuǎn)字符串(2)更新篇
本文是玩轉(zhuǎn)字符串的續(xù)篇,繼續(xù)對(duì)字符串的連接方法進(jìn)行介紹,以及字符串復(fù)制、字符串長(zhǎng)度、字符大小寫(xiě)的轉(zhuǎn)換。非常不錯(cuò)的文章,希望對(duì)大家有所幫助2014-09-09
關(guān)于python列表相關(guān)知識(shí)點(diǎn)
這篇文章主要介紹了關(guān)于python列表相關(guān)知識(shí)點(diǎn),變量可以存儲(chǔ)一個(gè)元素,而列表是一個(gè)大容器,可以存儲(chǔ)N多個(gè)元素,程序可以方便的對(duì)這些數(shù)據(jù)進(jìn)行整體操作,需要的朋友可以參考下2023-04-04
在jupyter notebook 添加 conda 環(huán)境的操作詳解
這篇文章主要介紹了在jupyter notebook 添加 conda 環(huán)境的操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python非對(duì)稱加密算法RSA實(shí)現(xiàn)原理與應(yīng)用詳解
RSA加密算法是一種非對(duì)稱加密算法,RSA算法的安全性基于大數(shù)分解的困難性,即已知兩個(gè)大素?cái)?shù)p和q的乘積n,求解p和q非常困難,RSA算法廣泛應(yīng)用于數(shù)據(jù)加密和數(shù)字簽名等領(lǐng)域,本文將詳細(xì)介紹如何在Python中使用RSA算法進(jìn)行加密和解密,需要的朋友可以參考下2024-09-09
PYTHON 中使用 GLOBAL引發(fā)的一系列問(wèn)題
這篇文章主要介紹了PYTHON 中使用 GLOBAL引發(fā)的一系列問(wèn)題的相關(guān)資料,需要的朋友可以參考下2016-10-10
matplotlib多子圖實(shí)現(xiàn)共享坐標(biāo)軸的示例詳解
這篇文章主要為大家詳細(xì)介紹了matplotlib繪制多子圖師如何實(shí)現(xiàn)共享坐標(biāo)軸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

