ansible是一款及其簡單的開源的自動化運維工具,基於python開發,集合了衆多運維工具(puppet、CFengine、chef、funct、fabric)的優點。實現了批次系統設定,批次程式部署,批次執行命令等功能。同時ansible是基於模組工作,其實現批次部署的是ansible所執行的模組。
ansible其他重要的優勢
1、跨平臺支援:ansible在物理、虛擬、雲和容器環境中爲linux、Windows、Unix和網路裝置提供無代理支援。
2、人類可讀的自動化:ansible playbook以yaml文字檔案的形式編寫,易於閱讀,有助於確保每個人都理解他們將要做的事情。
3、對於應用程式的完美描述:ansible playbook可以進行任何更更改,並且可以描述和記錄應用程式環境的每個細節。
4、易於管理的版本控制:ansible劇本和專案是純文字。他們可以像原始碼一樣處理,並放在現有的版本控制系統中。
5、支援動態庫存:ansible管理的機器列表可以從外部資源動態更新,以便隨時捕獲所有易於管伺服器的正確的當前列表,無論基礎設施或者位置如何。
6、易於與其他系統整合的編排:HP SA 、puppet、Jenkins、Redhat satellite,以及存在於環境中的其他子系統,都可以被利用並整合到ansible工作流中。
ansible是一款自動化運維工具,基於python開發,具有批次系統部署,批次程式部署、批次執行命令等功能。
其工作機制 機製如下:
1、使用者使用ansible或者playbook,在伺服器中端輸入ansible的AD-HOC命令集或playbook。
2、ansible遵循預先編排的規則將playbook逐條拆解爲play。
3、play組織成ansible可識別的任務(tack)
4、task會呼叫任務所涉及的所有模組(module)和外掛(plugin)
5、讀取inventory中定義的主機列表
6、通過SSH認證(預設)將任務集以臨時檔案或命令的形式傳輸到遠端用戶端執行並返回執行結果。
7、no agents :不需要在被管控主機上安裝任何用戶端,只需要SSH、python即可,建議python版本在2.6.6以上
8、no server:無伺服器端,使用時直接執行命令即可
9、modules in any languages :基於模組工作,豐富的內建模組,可使用任意語言開發模組;
10、yaml not code:使用yaml語言定製劇本playbook,易於管理,api簡單明瞭;
11、SSH by default:基於ssh工作,整個過程簡單、方便、安全,建議使用公鑰方式認證。
12、strong multi-tier solution :可實現多級指揮
在ansible內容中保留祕密數據並仍然公開共用,那麼可以在playbooks中使用Vault。Ansible Vault,它包含在Ansible中,可以加密和解密Ansible使用的任何結構化數據檔案。
Ansible將編排與設定管理、供應和應用程式部署結合並統一在一個易於使用的平臺上。Ansible的一些主要場景包括:
1、設定管理:集中組態檔管理和部署是Ansible的一個常見場景。
2、應用程式部署:當使用Ansible定義應用程式,並使用Ansible Tower管理部署時,團隊可以有效地管理從開發到生產的整個應用程式生命週期。
3、部署:當在系統上部署或安裝應用程式時,Ansible和Ansible Tower可以幫助簡化供應系統的流程,無論是PXE啓動的裸金屬伺服器或虛擬機器,還是從模板建立虛擬機器或雲實例。
4、持續交付:建立CI/CD管道需要許多團隊的協調和參與。如果沒有一個簡單的自動化平臺,團隊共同作業很難完成。而Ansible playbook在應用程式的整個生命週期中可以保持適當的部署(和管理)
5、安全性和審計:當安全策略在Ansible中定義時,可以將站點範圍的安全策略的掃描和修復整合到其他自動化流程中。安全性是部署的所有內容中不可或缺的一部分。
6、編排:設定本身不能定義環境,需要定義多個設定如何互動,並確保可以將不同的部分作爲一個整體來管理。
Ansible中受管主機列在主機清單(inventory)文字檔案中,清單還將這些系統組織成group,以便更容易地進行批次管理。一個Inventory定義了Ansible將管理的主機集合。這些主機還可以分配至組,可以對組進行批次管理。組可以包含子組,主機可以是多個組的成員。Inventory根據型別可分爲靜態清單和動態清單:
1、靜態主機Inventory可以由文字檔案定義。
2、動態主機Inventory可以由指令碼或其他程式根據需要使用外部資訊提供者生成。
Ansible 只使用最高優先順序組態檔中的設定,其它組態檔中的設定將被忽略。即使存在其他優先順序較低的檔案,它們的設定也將被忽略,並且不會與所選組態檔中的設定相結合。
$ANSIBLE_CONFIG環境變數指定的任何檔案都將覆蓋所有其他組態檔。如果沒有設定該變數,接下來將檢查執行ansible命令的目錄以查詢ansible.cfg檔案。如果該檔案不存在,則檢查使用者的主目錄以查詢.ansible.cfg檔案。如上組態檔都不存在時,才使用全域性/etc/ansible/ansible.cfg檔案。
Ad-Hoc命令是一種快速執行單個Ansible任務的方法,適合於不需要永久儲存該任務,臨時執行的場景。Ad-Hoc是簡單的控制檯操作,無需編寫劇本就可以執行。它們對於快速測試和更改非常有用。
1、Ad-Hoc 命令可以作爲一次性命令對一組目標主機執行單個、簡單的任務。
2、Ad-Hoc 不適合複雜設定管理或編配場景,Ad-Hoc 一次只能呼叫一個模組和一組參數。當需要多個操作時,必須使用多個 Ad-Hoc 來執行。
3、playbook可以實現以一種簡易重複的方式對一組目標主機執行多個複雜的任務。
4、Playbook 是描述要在受管主機上實施的必要設定或程式性步驟的檔案。
5、Playbook 爲設定管理和部署提供了強大而靈活的解決方案。
6、Playbook 可以將冗長而複雜的管理任務轉變爲可輕鬆重複的歷程,並且可預測成果然而。
7、playbook 是一個文字檔案,其中包含一個或多個按順序執行的play的列表。
8、playbook中,可以將playbook中的tasks儲存爲人類可讀且可立即執行的形式。
9、play 是一組有序的任務,應該對從目錄中選擇的主機執行。
Ansible 利用變數儲存整個 Ansible 專案檔案中可重複使用的值,從而可以簡化專案的建立和維護,並減少錯誤的發生率。在定義Ansible變數時,通常有如下三種範圍的變數:
global範圍:從命令列或Ansible設定中設定的變數;
play範圍:在 play 和相關結構中設定的變數;
host範圍:inventory、facts 或 register 的變數,在主機組和個別主機上設定的變數。
簡單回圈
1、Ansible支援使用loop在一組item上迭代任務;
2、loop可以使用列表中的每個項、列表中每個檔案的內容、生成的數位序列或使用更復雜的結構來重複任務。
3、使用loop使管理員不必編寫使用相同模組的多個任務。
複雜(巢狀)回圈
with_nested鍵用於巢狀回圈,回圈在回圈中執行。它需要一個包含兩個或多個列表的列表。例如,將一個列表劃分爲兩個列表,任務將迭代第一個列表中的每一項與第二個列表中的每一項。
Ansible模組被設計成冪等的,即在一個適當編寫的劇本中,劇本及其任務可以在不更改受管主機的情況下多次執行,除非它們需要進行更改以使受管主機達到所需的狀態。
然而,有時當一個任務對系統進行了更改後同時需要執行另一個任務。例如,對服務的組態檔的更改可能需要重新載入服務,以便更改後的設定生效。此時就需要使用hanlder程式。handler程式是響應由其他任務組成的通知的任務。每個handler程式都有一個全域性惟一的名稱,並在劇本中任務塊的末尾觸發。
如果沒有任務通過名稱呼叫handler程式,它將不會執行。
如果一個或多個任務都呼叫handler程式,它將在劇中的所有其他任務完成後僅執行一次。
因爲handler程式是任務,所以可以在handler程式中使用與處理任何其他任務相同的模組。通常,handler程式用於重新啓動主機和重新啓動服務。
handler程式可以視爲非活動任務,只有在使用notify語句顯式呼叫時纔會觸發這些任務。
在 playbook 中, blocks 是囊括了任務的子句;
blocks 允許對任務進行邏輯分組,並可用於控制任務的執行方式,例如,管理員可以定義一組主要任務和一組附加任務,附加任務僅在第一組失敗時執行。爲此,可利用三個關鍵字在 playbook 中使用塊:
block:定義要執行的主要任務;
rescue:定義將在 block 子句中定義的任務失敗時執行的任務;
always:定義始終都獨立執行的任務,不論 block 和 rescue 子句中定義的任務是成功還是失敗。
Ansible審查每個任務的返回程式碼,以確定任務是否成功或失敗。預設情況下,當一個任務失敗時,Ansible會立即中止該主機上的其他操作,並跳過所有後續任務。
實際生產中,若希望即使任務失敗也能繼續執行play,Ansible也包含了多種特性用於管理任務錯誤:
忽略任務失敗:在任務中使用ignore_errors關鍵字忽略錯誤,即使任務失敗,也繼續在主機上執行playbook。
數據中心有各種不同類型的主機。如web伺服器、數據庫伺服器,基於開發環境的伺服器。隨着時間的推移,具有處理所有這些情況的任務和人員的Ansible playbook將變得龐大而複雜。
1、角色允許將複雜的劇本組織成獨立的、更小的劇本和檔案。
2、角色提供了一種從外部檔案載入任務、處理程式和變數的方法。
3、角色也可關聯和參照靜態的檔案和模板。
4、角色可以編寫成滿足普通用途需求,並且能被重複利用。
5、定義角色的檔案具有特定的名稱,並以嚴格的目錄結構進行組織。
Ansible Galaxy是一個由各種Ansible管理員和使用者編寫的Ansible角色的公共庫。它是一個包含數千個Ansible角色的歸檔檔案,並且有一個可搜尋的數據庫,幫助Ansible使用者識別可能幫助他們完成管理任務的角色。Ansible Galaxy包括指向新使用者和角色開發人員的文件和視訊的鏈接。
通過在所有主機上並行執行任務,Ansible可以對劇本的執行進行更多的控制。預設情況下,Ansible預設最多並行5個,因此它將同時在5台不同的機器上執行一個特定的任務。Ansible可以通過設定forks來設定並行執行任務數量。
同時Ansible也可以通過serial來減少ork數量所指定的並行書,serial關鍵字主要用於控制卷動更新,避免一次性更新過多的節點。
1、日誌判斷:預設情況下,Ansible沒有設定爲將其輸出,記錄到任何日誌檔案中。可通過ansible.cfg組態檔default部分中的log_path參數或$ANSIBLE_LOG環境變數進行設定。然後通過日誌進行定位。
2、Debug模組:偵錯模組是Ansible可用的模組之一,它可以更好地瞭解控制節點上正在進行的操作。這個模組可以在playbook執行時爲某個變數提供值。
3、syntax-check:通過ansible-playbook 命令的 --syntax-check命選項檢查劇本的YAML語法。
4、diff:Ansible還提供了–diff選項。此選項報告對受管主機上的模板檔案所做的更改。如果與–check選項一起使用,這些更改將顯示出來,而不是實際執行。從而判斷Ansible整個過程需要做何種更改。
Ceph是一個分佈式的數據物件儲存,Ceph相對其他儲存系統具有如下優勢:
1、CRUSH演算法:ceph摒棄了傳統的集中式儲存元數據定址的方案,而使用CRUSH演算法完成數據的定址操作。能夠實現各類負載的副本放置規則,例如跨機房、機架感知等。Crush演算法有相當強大的擴充套件性,理論上支援數千個儲存節點,從而增強了Ceph彈性擴充套件和高可用性。
2、高可用:通過CRUSH演算法指定副本的物理儲存位置以分隔故障域,支援數據強一致性,ceph可以忍受多種故障場景並自動嘗試並行修復。
3、高擴充套件性:Ceph本身並沒有主控節點,擴充套件起來比較容易,並且理論上,它的效能會隨着磁碟數量的增加而線性增長。
4、特性豐富:Ceph支援三種呼叫介面:物件儲存,塊儲存,檔案系統掛載。三種方式可以一同使用。Ceph主要特點如下:
5、統一儲存;
6、無任何單點故障;
7、數據多份冗餘;
8、儲存容量可延伸;
9、自動容錯及故障自愈。
Ceph體系架構主要由RADOS和RADOS GW和RBD以及CephFS構成。
1、RADOS(Reliable, Autonomic Distributed Object Store)是Ceph的底層核心,RADOS本身也是分佈式儲存系統,CEPH所有的儲存功能都是基於RADOS實現。RADOS由兩個元件組成:OSD和Monitor。
①OSD主要提供儲存資源,每一個disk、SSD、RAID group或者一個分割區都可以成爲一個OSD,而每個OSD還將負責向該物件的複雜節點分發和恢復;
②Monitor維護Ceph叢集並監控Ceph叢集的全域性狀態,提供一致性的決策。
2、RADOS GW和RBD:RADOS GateWay、RBD其作用是在librados庫的基礎上提供抽象層次更高、更便於應用或用戶端使用的上層介面。其中,RADOS GW是一個提供與Amazon S3和Swift相容的RESTful API的gateway,以供相應的物件儲存應用開發使用。RBD則提供了一個標準的塊裝置介面,常用於在虛擬化的場景下爲虛擬機器建立volume。
3、CEPHFS:CEPHFS則提供了POSIX介面,使用者可直接通過用戶端掛載使用。
Ceph儲存池Pool是Ceph儲存叢集用於儲存物件的邏輯分割區。池型別確定池用於確保數據永續性的保護機制 機製,Ceph有兩種Pool型別:
replication型別:在叢集中分佈每個物件的多個副本。
erasure coding型別:將每個物件分割成塊,並將它們與其他擦除編碼塊一起分發,以使用自動糾錯機制 機製保護物件。
Ceph儲存池Pool是Ceph儲存叢集用於儲存物件的邏輯分割區。
Pool中存在一定的數量的PG,PG將物件儲存在一組由CRUSH演算法確定的osd中。
Ceph使用CRUSH演算法將物件分配給池中的一個PG,根據池的設定和CRUSH演算法,PG自動對映到一組OSDs。
一個PG裡包含一堆物件,一個物件只能屬於一個PG。
所有Ceph儲存叢集的部署都始於部署一個個Ceph節點、網路和Ceph儲存叢集。Ceph儲存叢集至少需要一個Ceph Monitor和兩個OSD守護行程。而執行Ceph檔案系統用戶端時,則必須要有元數據伺服器(Metadata Server)。
1、Ceph OSDs:Ceph OSD守護行程( Ceph OSD )的功能是儲存數據,處理數據的複製、恢復、回填、再均衡,並通過檢查其他OSD守護行程的心跳來向Ceph Monitors提供一些監控資訊。當Ceph儲存叢集設定爲有2個副本時,至少需要2個OSD守護行程,叢集才能 纔能達到active+clean狀態(Ceph預設有3個副本)。
2、Monitors:Ceph Monitor維護着展示叢集狀態的各種圖表,包括監視器圖、OSD圖、歸置組(PG)圖、和CRUSH 圖。
3、MDSs:Ceph元數據伺服器(MDS)爲Ceph檔案系統儲存元數據(也就是說,Ceph塊裝置和Ceph 物件儲存不使用MDS)。元數據伺服器使得POSIX檔案系統的用戶端,可以在不對Ceph儲存叢集造成負擔的前提下,執行諸如ls、find等基本命令。
Ceph的應用場景主要由它的架構確定,Ceph提供物件儲存、塊儲存和檔案儲存。
1、LIBRADOS應用
Librados提供了應用程式對RADOS的直接存取,目前Librados已經提供了對C、C++、Java、Python、Ruby和PHP的支援。
2、RADOSGW應用
此類場景基於Librados之上,增加了HTTP協定,提供RESTful介面並且相容S3、Swfit介面。RADOSGW將Ceph叢集作爲分佈式物件儲存,對外提供服務。
3、RBD應用
此類場景也是基於Librados之上的,細分爲下面 下麪兩種應用場景。
第一種應用場景爲虛擬機器提供塊裝置。通過Librbd可以建立一個塊裝置(Container),然後通過QEMU/KVM附加到VM上。通過Container和VM的解耦,使得塊裝置可以被系結到不同的VM上。
第二種應用場景爲主機提供塊裝置。這種場景是傳統意義上的理解的塊儲存。
以上兩種方式都是將一個虛擬的塊裝置分片儲存在RADOS中,都會利用數據條帶化提高數據並行傳輸,都支援塊裝置的快照、COW(Copy-On-Write)克隆。最重要的是RBD還支援Live migration。
CephFS(Ceph檔案系統)
此類應用是基於RADOS實現的PB級分佈式檔案系統,其中引入MDS(Meta Date Server),它主要爲相容POSIX檔案系統提供元數據,比如檔案目錄和檔案元數據。
Docker主要有如下特性:
1、標準化
保證一致的執行環境
彈性伸縮,快速擴容
方便遷移
持續整合、持續交付與持續部署
2、高效能
不需要進行硬體虛擬以及執行完整的操作系統
3、輕量級
快速啓動
隔離性
進程隔離
Docker容器可以有四種狀態:
執行
已暫停
重新啓動
已退出
Dockerfile 是軟體的原材料,Docker映象 是軟體的交付品,而 Docker容器 則可以認爲是軟體的執行態。從應用軟體的角度來看,Dockerfile、Docker 映象與 Docker 容器分別代表軟體的三個不同階段,Dockerfile 面向開發,Docker 映象成爲交付標準,Docker 容器則涉及部署與運維。
1、容器部署簡單,虛擬機器部署相對複雜。
虛擬化技術依賴物理CPU和記憶體,是硬體級別的;
而docker構建在操作系統上,利用操作系統的containerization技術,所以docker甚至可以在虛擬機器上執行。
2、容器秒級啓動,虛擬機器通常分鐘級啓動。
傳統的虛擬化技術在構建系統的時候較爲複雜,需要大量的人力;
而docker可以通過Dockfile來構建整個容器,重新啓動和構建速度很快。
容器需要的資源(如磁碟、CPU、記憶體)相對更少。
容器比較輕便,虛擬機器相對較重
虛擬化系統一般都是指操作系統級概念,比較複雜,稱爲「系統」;
而docker開源而且輕量,稱爲「容器」,單個容器適合部署少量應用,比如部署一個redis、一個memcached。
容器主要使用如下技術:
Cgroup:資源控制
Namespace:存取隔離
rootfs:檔案系統隔離
容器引擎(使用者態工具):生命週期控制
Docker體系相對簡單,主要涉及如下5個元件:
1、Docker用戶端 – Docker
docker用戶端則扮演着docker伺服器端的遠端控制器,可以用來控制docker的伺服器端進程。
2、Docker伺服器端 – Docker Daemon
docker伺服器端是一個服務進程,管理着所有的容器。
3、Docker映象 – Image
docker映象,一個能夠執行在docker容器上的一組程式檔案,是一個只讀的模板,不包含任何動態數據。
4、Docker容器 – Docker Container
docker容器,就是執行程式的載體,容器是映象執行時的實體。
5、Docker映象倉庫 – Registry
Docker倉庫是集中存放映象檔案的場所,Docker倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
Docker利用了網路的名稱空間特性,實現了不同容器之間的網路隔離。名稱空間可以支援網路協定棧的多個範例,獨立的協定棧被隔離到不同的名稱空間中。
因此處於不同名稱空間中的網路棧是完全隔離的,彼此之間無法通訊。每個獨立的名稱空間中可以有自己獨立的路由表及獨立的iptables設定來提供包轉發、NAT及IP包過濾等功能。
Linux檔案系統:由bootfs和rootfs組成,bootfs主要包含bootloader和kernel,bootloader主要是引導載入kernel,當kernel被載入到記憶體之後bootfs就被解除安裝掉了。rootfs包含的就是典型linux系統中/dev,/proc,/bin,/etc等標準目錄。
Docker檔案系統:Docker容器是建立在Aufs分層檔案系統基礎上的,Aufs支援將不同的目錄掛載到同一個虛擬檔案系統下,並實現一種layer的概念。Aufs將掛載到同一虛擬檔案系統下的多個目錄分別設定成read-only,read-write以及whiteout-able許可權。docker 映象中每一層檔案系統都是read-only。
Docker使用Linux的Namespaces技術來進行資源隔離,其中Network Namespace實現隔離網路。
一個Network Namespace提供了一份獨立隔離的網路環境,包括網絡卡、路由、Iptable規則等,Docker網路有如下四種模式:
1、host模式:host模式下容器將不會獲得獨立的Network Namespace,該模式下與宿主機共用一個Network Namespace。容器將不會虛擬出自己的網絡卡,不會設定獨有的IP等,而是使用宿主機的IP和埠。
2、container模式:Container 網路模式是 Docker 中一種較爲特別的網路的模式,處於container模式下的 Docker 容器會共用其他容器的網路環境,因此,兩個或以上的容器之間不存在網路隔離,而設定container模式的容器又與宿主機以及除此之外其他的容器存在網路隔離。
3、none模式:none模式下,Docker容器擁有自己的Network Namespace,但是,並不爲Docker容器進行任何網路設定和構造任何網路環境。Docker 容器採用了none 網路模式,那麼容器內部就只能使用loopback網路裝置,不會再有其他的網路資源。Docker Container的none網路模式意味着不給該容器建立任何網路環境,容器只能使用127.0.0.1的本機網路。
4、bridge模式:bridge模式是Docker預設的網路設定,此模式會爲每一個容器分配Network Namespace、設定IP等,並將該宿主機上的Docker容器連線到一個虛擬網橋上。
docker跨主機通訊按原理可通過以下三種方式實現:
1、直接路由方式:直接在不同宿主機之間新增靜態路由;
2、橋接方式(如pipework):通過靜態指定容器IP爲宿主機IP同一個網路的形式,即可實現。
3、Overlay隧道方式:使用overlay網路實現,Overlay網路指在現有網路層之上疊加的虛擬化技術,實現應用在網路上的承載,並能與其他網路業務分離,並且以基於IP的網絡技術爲主,如flannel、ovs+gre。
Flannel爲每個host分配一個subnet,容器從subnet中分配IP,這些IP可以在host間路由,容器間無需使用nat和埠對映即可實現跨主機通訊。每個subnet都是從一個更大的IP池中劃分的,flannel會在每個主機上運flanneld的agent,負責從池子中分配subnet。
Flannel使用etcd存放網路設定、已分配的subnet、host的IP等資訊,Flannel數據包在主機間轉發是由backend實現的,目前已經支援UDP、VxLAN、host-gw、AWS VPC和GCE路由等多種backend。
Apache伺服器是一個非常流行、功能強大並且開源的Web伺服器,基於HTTP超文字傳輸協定執行,這一協定提供了伺服器和用戶端Web瀏覽器通訊的標準。它支援SSL、CGI檔案、虛擬主機等許多功能特性。
Apache虛擬主機相當於一個在同一臺伺服器中卻相互獨立的站點,從而實現一臺主機對外提供多個 web 服務,每個虛擬主機之間是獨立的,互不影響的。Apache具有兩種型別的虛擬主機:基於名稱的虛擬主機和基於IP的虛擬主機。
它們都是MPM,Worker和Prefork有它們各自在Apache上的執行機制 機製,取決於哪種模式啓動Apache。Worker MPM和Prefork MPM基本的區別在於它們產生子進程的處理過程。
1、Prefork MPM中,一個主httpd進行被啓動,這個主進程會管理所有其它子進程爲用戶端請求提供服務。Worker MPM中一個httpd進程被啓用,則會使用不同的執行緒來爲用戶端請求提供服務.
2、Prefork MPM使用多個子進程,每一個進程帶有一個執行緒,Worker MPM使用多個子進程,每一個進程帶有多個執行緒。
3、Prefork MPM中的連線處理,每一個進程一次處理一個連線而在Worker MPM中每一個執行緒一次處理一個連線。
4、記憶體佔用Prefork MPM佔用龐大的記憶體,而Worker MPM佔用更小的記憶體。
Nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器。可以作爲一個HTTP伺服器進行網站的發佈處理,同時也可以作爲反向代理進行負載均衡的實現。其主要特點有:
1、佔有記憶體少,併發能力強。
2、Nginx使用基於事件驅動架構,使得其可以支援數以百萬級別的TCP連線。
3、高度的模組化和自由軟體許可證使得第三方模組非常豐富。
4、Nginx是一個跨平臺伺服器,可以執行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系統上。
1、Nginx是一個基於事件的Web伺服器,Apache是一個基於流程的伺服器;
2、Nginx所有請求都由一個執行緒處理,Apache單個執行緒處理單個請求;
3、Nginx避免子進程的概念,Apache是基於子進程的;
4、Nginx在記憶體消耗和連線方面更好,Apache在記憶體消耗和連線方面一般;
5、Nginx的效能和可伸縮性不依賴於硬體,Apache依賴於CPU和記憶體等硬體;
6、Nginx支援熱部署,Apache不支援熱部署;
7、Nginx對於靜態檔案處理具有更高效率,Apache相對一般;
8、Nginx在反向代理場景具有明顯優勢,Apache相對一般。
基於Nginx的特性,Nginx的應用場景主要有:
1、http伺服器:Nginx是一個http服務可以獨立提供http服務,可以做網頁靜態伺服器。
2、虛擬主機:可以實現在一臺伺服器虛擬出多個網站。
3、正反代理:負載均衡或加速,當網站的存取量達到一定程度後,單台伺服器不能滿足使用者的請求時,需要用多臺伺服器叢集可以使用Nginx做反向代理,並且多臺伺服器可以平均分擔負載。
HTTP是建立在TCP上,一次HTTP請求需要先建立TCP三次握手(稱爲TCP連線),在連線的基礎上再進行HTTP請求。
HTTP請求建立在一次TCP連線基礎上,對於HTTP對談,一次TCP連線可以建立多次HTTP請求。
1、連線限制:Nginx自帶的limit_conn_module模組(TCP連線頻率限制模組)和limit_req_mudule模組(HTTP請求頻率限制模組)支援對連線頻率以及請求頻率、來源進行限制,通常可可以用來防止DDOS攻擊。
2、IP限制:Nginx使用http_access_module模組可實現基於IP的存取控制,但通過代理可以繞過限制。
3、賬號限制:Nginx使用http_auth_basic_module模組可實現使用者密碼的登錄限制。
4、流量限制:Nginx使用http_core_moduleblock模組可實現用戶端傳送響應的速率限制。
1、master進程主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的執行狀態,當worker進程退出後(異常情況下),會自動重新啓動新的worker進程。
2、worker進程則是處理基本的網路事件。多個worker進程之間是對等的,他們同等競爭來自用戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。
1、首先,Nginx 在啓動時,會解析組態檔,獲取需要監聽的埠與 IP 地址,然後在 Nginx 的 Master 進程裏面先初始化好這個監控的Socket(建立 Socket,設定 addr、系結ip和埠,然後listen 監聽)。
2、然後,再 fork 出多個子進程出來。
3、之後,子進程會競爭 accept 新的連線。此時,用戶端就可以向 nginx 發起連線了。當用戶端與nginx完成TCP三次握手,與 nginx 建立好一個連線後。此時,某一個子進程會 accept 成功,得到這個建立好的連線的 Socket ,然後建立 nginx 對連線的封裝。
4、接着,設定讀寫事件處理常式,並新增讀寫事件來與用戶端進行數據的交換。
5、最後,Nginx 或用戶端來主動關掉連線,完成整個HTTP請求的處理。
Nginx 是一個高效能的 Web 伺服器,能夠同時處理大量的併發請求。它結合多進程機制 機製和非同步非阻塞機制 機製 。
1、多進程機制 機製:伺服器每當收到一個用戶端請求時,就有伺服器主進程 (master process)生成一個子進程(worker process)和用戶端建立連線進行互動,直到連線斷開,該子進程就結束了。
使用進程的好處是各個進程之間相互獨立,不需要加鎖,減少了使用鎖對效能造成影響。
其次,採用獨立的進程,可以讓進程互相之間不會影響 ,如果一個進程發生異常退出時,其它進程正常工作,master進程則很快啓動新的worker進程,確保服務不會中斷,從而將風險降到最低。
缺點是操作系統生成一個子進程需要進行 記憶體複製等操作,在資源和時間上會產生一定的開銷。當有大量請求時,會導致系統效能下降 。
2、非同步非阻塞機制 機製:每個工作進程使用非同步非阻塞方式,可以處理多個用戶端請求 。
當某個工作進程接收到用戶端請求以後,呼叫 IO 進行處理,如果不能立即得到結果,就去處理其他請求(即爲非阻塞 )。而用戶端在此期間也無需等待響應,可以進行其他任務(即爲 非同步 )。
當IO返回時,就會通知此工作進程。該進程得到通知,暫時掛起當前處理的事務去響應用戶端請求。
對於Nginx而言,每一個虛擬主機相當於一個在同一臺伺服器中卻相互獨立的站點,從而實現一臺主機對外提供多個 web 服務,每個虛擬主機之間是獨立的,互不影響的。通過 Nginx 可以實現虛擬主機的設定,Nginx 支援三種類型的虛擬主機設定:
1、基於 IP 的虛擬主機(較少使用)
2、基於域名的虛擬主機
3、基於埠的虛擬主機
快取對於Web至關重要,尤其對於大型高負載Web站點。Nginx快取可作爲效能優化的一個重要手段,可以極大減輕後端伺服器的負載。通常對於靜態資源,即較少經常更新的資源,如圖片,css或js等進行快取,從而在每次重新整理瀏覽器的時候,不用重新請求,而是從快取裏面讀取,這樣就可以減輕伺服器的壓力。
使用Nginx作爲代理快取後,可加快用戶端的存取,其過程大致如下:
1、第一步:用戶端第一次向Nginx請求數據A;
2、第二步:當Nginx發現快取中沒有數據A時,會向伺服器端請求數據A;
3、第三步:伺服器端接收到Nginx發來的請求,則返回數據A到Nginx,並且快取在Nginx;
4、第四步:Nginx返回數據A給用戶端應用;
5、第五步:用戶端第二次向Nginx請求數據A;
6、第六步:當Nginx發現快取中存在數據A時,則不會請求伺服器端;
7、第七步:Nginx把快取中的數據A返回給用戶端應用。
代理(forward)是一個位於用戶端和原始伺服器(origin server)之間的伺服器,即代理伺服器。爲了從原始伺服器取得內容,用戶端向代理伺服器發送一個請求並指定目標原始伺服器,然後代理伺服器向原始伺服器轉交請求並將獲得的內容返回給用戶端。其通常有如下三種代理模式:
1、正向代理(forward proxy):一個位於用戶端和原始伺服器(origin server)之間的伺服器,爲了從原始伺服器取得內容,用戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給用戶端。
2、反向代理(reverse proxy):指以代理伺服器來接受 Internet上的連線請求,然後將請求,發給內部網路上的伺服器並將從伺服器上得到的結果返回給 Internet 上請求連線的用戶端,此時代理伺服器對外就表現爲一個反向代理伺服器。
3、透明代理
盜鏈 指的是在自己的介面展示非本伺服器上的內容,通過技術手段獲得其他伺服器的資源。繞過他人資源展示頁面,在自己頁面向使用者提供此內容,從而減輕自己伺服器的負擔,因爲真實的空間和流量來自其他伺服器。
因此,通常爲了避免被盜鏈,通常Web伺服器建議設定防盜鏈。Nginx防盜鏈其主要防盜鏈思路是能區別哪些請求是非正常使用者請求,對於非正常使用者的請求直接反饋403或重定向至其他頁面。
負載均衡是將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度,帶給使用者更好的體驗。對於Web應用,通過負載均衡,可以將一臺伺服器的工作擴充套件到多臺伺服器中執行,提高整個網站的負載能力。其本質採用一個排程者,保證所有後端伺服器都將效能充分發揮,從而保持伺服器叢集的整體效能最優,這就是負載均衡。
Nginx作爲負載均衡器具有極大的優勢,主要體現在:
1、高併發連線
2、記憶體消耗少
3、組態檔非常簡單
4、成本低廉
5、支援Rewrite重寫規則
6、內建的健康檢查功能
7、節省頻寬
8、穩定性高
Nginx作爲負載均衡器具有極大的優勢,其負載均衡策略可以劃分爲兩大類:內建策略和擴充套件策略,擴充套件策略爲第三方提供。
內建策略
輪詢(預設):Nginx根據請求次數,將每個請求均勻分配到每台伺服器;
weight:加權輪詢,加權輪詢則是在第一種輪詢的基礎上對後臺的每台服務賦予權重,伺服器的權重比例越大,被分發到的概率也就越大。
least_conn:最少連線,將請求分配給連線數最少的伺服器。Nginx會統計哪些伺服器的連線數最少。
ip_hash:IP 雜湊,系結處理請求的伺服器。第一次請求時,根據該用戶端的IP算出一個HASH值,將請求分配到叢集中的某一臺伺服器上。後面該用戶端的所有請求,都將通過HASH演算法,找到之前處理這臺用戶端請求的伺服器,然後將請求交給它來處理。
擴充套件策略
1、fair:按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
2、url_hash:按存取url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器爲快取時比較有效。
nginx負載均衡(反向代理)包含內建的或第三方擴充套件來實現伺服器健康檢測的。如果後端某台伺服器響應失敗,nginx會標記該台伺服器失效,在特定時間內,請求不分發到該臺上。
1、fail_timeout:該指令定義了多長時間伺服器將被標記爲失敗。在fail_timeout後,伺服器還是failed,nginx將檢測該伺服器是否存活,如果探測成功,將標記爲活的。
2、max_fails:該指令設定在fail_timeout期間內連續的失敗嘗試。預設情況下,max_fails爲1。如果被設定爲0,該伺服器的健康檢測將禁用。
爲了提高網站的響應速度,減輕程式伺服器(Tomcat,Jboss等)的負載,對於靜態資源,如圖片、js、css等檔案,可以在反向代理伺服器中進行快取,這樣瀏覽器在請求一個靜態資源時,代理伺服器就可以直接處理,而不用將請求轉發給後端伺服器。對於使用者請求的動態檔案,如servlet、jsp,則轉發給Tomcat,Jboss伺服器處理,這就是動靜分離。即動態檔案與靜態檔案的分離。
動靜分離可通過location對請求url進行匹配,將網站靜態資源(HTML,JavaScript,CSS,img等檔案)與後臺應用分開部署,提高使用者存取靜態程式碼的速度,降低對後臺應用存取。通常將靜態資源放到nginx中,動態資源轉發到tomcat伺服器中。
同源策略是一個安全策略。同源,指的是協定,域名,埠相同。瀏覽器處於安全方面的考慮,只允許本域名下的介面互動,不同源的用戶端指令碼,在沒有明確授權的情況下,不能讀寫對方的資源。
從一個域名的網頁去請求另一個域名的資源,或任何協定、域名、埠有一處不同的請求,就被當作是跨域,即都被當成不同源。
通常基於安全考慮,Nginx啓用了同源策略,即限制了從同一個源載入的文件或指令碼如何與來自另一個源的資源進行互動。這是一個用於隔離潛在惡意檔案的重要安全機制 機製。
Nginx若要實現跨域存取,可通過JSONP和CORS進行實現。
重定向(Redirect)指通過各種方法將各種網路請求重新定個方向轉到其它位置(如:網頁重定向、域名的重定向、路由選擇的變化也是對數據報文經由路徑的一種重定向)。
URL重寫是指通過設定conf檔案,以讓網站的URL中達到某種狀態時則定向/跳轉到某個規則,比如常見的僞靜態、301重定向、瀏覽器定向等。當用戶端瀏覽某個網址時,將其存取導向到另一個網址的技術。
其主要場景有如下兩個:
1、將一串很長的網址,轉成較短的網址,從而實現便於傳播、易於記憶。
2、調整或更換Web伺服器,網址(域名)又必須要變更(如存取目錄、存取擴充套件名HTML變爲PHP、存取域名),爲了能使舊的存取依舊生效,從而實現自動重定向到新的網站。
1、地址重寫:爲了實現地址的標準化,如位址列中中輸入 www.baidu.com. 也可以輸入 www.baidu.cn。最後都會被重寫到 www.baidu.com 上。瀏覽器的位址列也會顯示www.baidu.com。即nginx把收到用戶端請求的內容所對應的伺服器地址發給用戶端,讓用戶端自己去獲取,nginx同時返回302正確資訊。
2、地址轉發:指在網路數據傳輸過程中數據分組到達路由器或橋接器後,該裝置通過檢查分組地址並將數據轉發到最近的區域網的過程。
3、反向代理:當瀏覽器存取網站時,nginx反向代理伺服器會代替用戶端向後端伺服器查詢所需的內容,然後nginx反向代理伺服器會把查詢的內容返回給用戶端。
地址重寫和地址轉發有以下不同點:
1、地址重寫會改變瀏覽器中的地址,使之變成重寫成瀏覽器最新的地址。而地址轉發不會改變瀏覽器的地址的。
2、地址重寫會產生兩次請求,而地址轉發只會有一次請求。
3、地址轉發一般發生在同一站點專案內部,而地址重寫且不受限制。
4、地址轉發的速度比地址重定向快。
301和302狀態碼都表示重定向,表示瀏覽器在拿到伺服器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取(用戶端輸入的地址A瞬間變成了另一個地址B)。其主要差異爲:
1、301:代表永久性轉移(Permanently Moved):舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜尋引擎在抓取新內容的同時也將舊的網址交換爲重定向之後的網址;
2、302:代表暫時性轉移(Temporarily Moved):舊地址A的資源還在(仍然可以存取),這個重定向只是臨時地從舊地址A跳轉到地址B,搜尋引擎會抓取新的內容而儲存舊的網
址。
Keepalived + Nginx 實現Nginx的高可用:通過Keepalived來實現同一個虛擬IP對映到多臺Nginx代理伺服器,從而實現Nginx的高可用性。
Heartbeat + Nginx 實現Nginx的高可用:通過Heartbeat的心跳檢測和資源接管、叢集中服務的監測、失效切換等功能,結合Nginx來實現高可用性。
SSL(Secure Socket Layer)安全通訊端層是一種數位憑證,它使用ssl協定在瀏覽器和web server之間建立一條安全通道,數據資訊在client與server之間的安全傳輸。
HTTPS(Hypertext Transfer Protocol Secure)是超文字傳輸協定和SSL/TLS的組合,用以提供加密通訊及對網路伺服器身份的鑑定。
HTTPS也可以理解爲HTTP over SSL,即HTTP連線建立在SSL安全連線之上。
原作者 :木二
鏈接 : https://www.yuque.com/docs/share/d3dd1e8e-6828-4da7-9e30-6a4f45c6fa8e