nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP三、SMTP代理服務器;nginx能夠做爲一個HTTP服務器進行網站的發佈處理,另外nginx能夠做爲反向代理進行負載均衡的實現。php
負載均衡創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性。負載均衡(Load Balance)其意思就是分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務。--百度百科css
nginx提供的負載均衡能力主要包括Http負載均衡,和UDP和TCP負載均衡;html
一、Round Robin:請求在服務器之間均勻分佈,並考慮服務器權重(默認算法)java
upstream backend { server backend1.example.com; server backend2.example.com; }
二、Least Connections:在考慮服務器權重的同時,向活動鏈接數最少的服務器發送請求nginx
upstream backend { least_conn; server backend1.example.com; server backend2.example.com; }
三、IP Hash:向其發送請求的服務器由客戶端IP地址肯定。在這種狀況下,要麼使用IPv4地址的前三個八位字節,要麼使用整個IPv6地址來計算哈希值。該方法保證來自同一地址的請求能夠到達同一服務器,除非該服務器不可用c++
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
若是其中一個服務器須要從負載均衡組中暫時移除,能夠用down參數標記它,以保持當前客戶端IP地址的散列。將由此服務器處理的請求自動發送到組中的下一個服務器。web
upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com down; }
四、Generic Hash:向其發送請求的服務器由用戶定義的鍵肯定,該鍵能夠是文本字符串、變量或組合。例如,密鑰能夠是成對的源IP地址和端口,或者是URI。正則表達式
upstream backend { hash $request_uri consistent; server backend1.example.com; server backend2.example.com; }
五、Least Time(NGINX Plus獨有):對於每一個請求,NGINX Plus選擇平均延遲最低且活動鏈接數最少的服務器,其中最低平均延遲是根據包含到最短期指令的如下哪些參數計算:
header :從服務器接收第一個字節的時間
last_byte:從服務器接收完整響應的時間
last_byte inflight:從服務器接收完整響應的時間,考慮到不完整的請求redis
upstream backend { least_time header; server backend1.example.com; server backend2.example.com; }
六、Random:每一個請求都將被傳遞到隨機選擇的服務器。若是指定了兩個參數,NGINX首先考慮服務器權重隨機選擇兩個服務器,而後使用指定的方法選擇其中一個服務器
least_conn:活動鏈接數最少
least_time=header(NGINX Plus):從服務器接收響應頭的最小平均時間($upstream_header_time)
least_time=last_byte(NGINX Plus):從服務器接收完整響應的最小平均時間($upstream_response_time)算法
upstream backend { random two least_time=last_byte; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; }
注意:在配置Round Robin之外的任何方法時,將相應的指令(hash、ip_hash、least_conn、least_time或random)放在upstream {}塊中服務器指令列表的上方
其餘設置:
Server Weights:默認狀況下,NGINX使用Round-Robin方法根據請求的權重在組中的服務器之間分發請求。server指令的weight參數設置服務器的權重;默認值爲1:
upstream backend { server backend1.example.com weight=5; server backend2.example.com; server 192.0.0.1 backup; }
第三方的負載均衡策略的實現須要安裝第三方插件
一、fair:按照服務器端的響應時間來分配請求,響應時間短的優先分配
#動態服務器組 upstream dynamic_zuoyu { server localhost:8080; server localhost:8081; server localhost:8082; fair; #實現響應時間短的優先分配 }
二、url_hash:按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,要配合緩存命中來使用。同一個資源屢次請求,可能會到達不一樣的服務器上,致使沒必要要的屢次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可使得同一個url(也就是同一個資源請求)會到達同一臺服務器,一旦緩存住了資源,再此收到請求,就能夠從緩存中讀取。
#動態服務器組 upstream dynamic_zuoyu { hash $request_uri; #實現每一個url定向到同一個後端服務器 server localhost:8080; server localhost:8081; server localhost:8082; }
緩存(cache),原始意義是指訪問速度比通常隨機存取存儲器(RAM)快的一種高速存儲器,一般它不像系統主存那樣使用DRAM技術,而使用昂貴但較快速的SRAM技術。緩存的設置是全部現代計算機系統發揮高性能的重要因素之一。--百度百科
通常一個請求有:客戶端緩存,代理端緩存(nginx),服務器緩存(redis、Memcache等)
Web服務器通常指網站服務器,是指駐留於因特網上某種類型計算機的程序,能夠向瀏覽器等Web客戶端提供文檔,也能夠放置網站文件,讓全世界瀏覽;能夠放置數據文件,讓全世界下載。目前最主流的三個Web服務器是Apache、 Nginx 、IIS。-- 百度百科
nginx做爲web服務器的優勢:
apache是同步多進程模型,一個鏈接對應一個進程;nginx是異步的,多個鏈接(萬級別)能夠對應一個進程,通常來講,須要性能的web 服務,用nginx 。若是不須要性能只求穩定,那就apache 吧。
當使用nginx做爲web服務器時,其必須經過fastcgi協議結合php-fpm使用,而不能像apache那樣直接將php做爲自身的一個模塊來處理請求。
當請求交給php-fpm處理以後,當前這個鏈接是不能斷開的,nginx怎麼處理這個鏈接?鏈接始終是存在,nginx要維持一段內存空間,保存鏈接的相關信息(客戶端信息,請求報文等),稱爲接收緩衝區,而當nginx準備好數據以後,是經過發送緩存區響應請求給客戶端,因此維持一個請求或者說是一段會話是須要空間的。
若是客戶端能理解fastcgi報文,nginx直接將php-fpm數據處理好的經過fastcgi協議傳送過來的響應報文給到客戶端,拿到一位數據就放到發送緩衝區中,客戶端直接拿到,這個過程就是同步的,nginx就是作了透明轉發。可是上述的過程是不行的,客戶端是沒法理解的,php-fpm處理以後的fastcgi協議報文徹底送給nginx以後,nginx須要處理成客戶端能識別的http報文才行,因此存儲fastcgi協議報文也是須要空間的,因此這種方式下是異步的
多個請求多是相同的資源,因此咱們能夠再nginx中加緩存,當請求過來時,先查看緩存是否存在且沒有過時,有的話,nginx取出緩存數據封裝響應報文給到客戶端,沒有緩存再向動態服務器php-fpm請求數據,php-fpm返回數據後,nginx先緩存起來,再響應給客戶端,這樣就大大減小了動態服務器的壓力。
正向代理:若是把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則須要經過代理服務器來訪問,這種代理服務就稱爲正向代理。
反向代理:其實客戶端對代理是無感知的,由於客戶端不須要任何配置就能夠訪問,咱們只須要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。
動靜分離:爲了提升網站的響應速度,減輕程序服務器(Tomcat,Jboss等)的負載,對於靜態資源好比圖片,js,css等文件,咱們能夠在反向代理服務器中進行緩存,這樣瀏覽器在請求一個靜態資源時,代理服務器就能夠直接處理,而不用將請求轉發給後端服務器。用戶請求的動態文件好比servlet,jsp則轉發給Tomcat,Jboss服務器處理,這就是動靜分離。這也是反向代理服務器的一個重要的做用。
動靜分離主要是經過nginx+tomcat來實現,其中nginx處理圖片、html、JS、CSS等靜態文件,tomcat處理jsp、servlet等動態請求。因此能夠利用nginx做爲文件服務器,在公司的內網搭建文件服務器,提供下載功能,挺方便。
動靜分離從目前實現角度來說大體分爲兩種:一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;另一種方法就是動態跟靜態文件混合在一塊兒發佈,經過 nginx 來分開。
壓縮響應一般顯著的減小傳輸數據的大小。然而,壓縮發生在運行時,它也會增長至關大的處理開銷對性能有負面的影響。Nginx在發送響應到客戶端時執行壓縮,但不對已經壓縮的響應「二次壓縮」。
默認狀況下,NGINX僅壓縮MIME類型的響應text/html。要壓縮其餘MIME類型的響應,請包含gzip_types指令並列出其餘類型。
高可用HA(High Availability)是分佈式系統架構設計中必須考慮的因素之一,它一般是指,經過設計減小系統不能提供服務的時間。若是一個系統可以一直提供服務,那麼這個可用性則是百分之百,可是天有不測風雲。因此咱們只能儘量的去減小服務的故障
Keepalived軟件起初是專爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗餘協議)功能。所以,Keepalived除了可以管理LVS軟件外,還能夠做爲其餘服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件
Keepalived高可用服務之間的故障切換轉移,是經過VRRP 來實現的。
在 Keepalived服務正常工做時,主 Master節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup節點本身還活着,當主 Master節點發生故障時,就沒法發送心跳消息,備節點也就所以沒法繼續檢測到來自主 Master節點的心跳了,因而調用自身的接管程序,接管主Master節點的 IP資源及服務。而當主 Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色
NGINX能夠將IMAP,POP3和SMTP協議代理到承載郵件賬戶的上游郵件服務器之一,所以能夠用做電子郵件客戶端的單個端點。這可能帶來許多好處,例如:
使用--with-mail用於電子郵件代理功能的--with-mail_ssl_module參數和用於SSL / TLS支持的參數編譯了Mail模塊
yum -y install gcc automake autoconf libtool make gcc-c++ #安裝pcre cd /usr/local/src wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz tar -zxvf pcre-8.44.tar.gz cd pcre-8.44 ./configure make make install #安裝zlib cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install #安裝openssl cd /usr/local/src wget http://www.openssl.org/source/openssl-1.1.1d.tar.gz tar -zxf openssl-1.1.1d.tar.gz cd openssl-1.1.1d ./Configure darwin64-x86_64-cc --prefix=/usr make make install
官網:https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#sources
cd /usr/local/src wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz cd nginx-1.18.0 ./configure \ --sbin-path=/usr/local/nginx/nginx \ --conf-path=/usr/local/nginx/nginx.conf \ --pid-path=/usr/local/nginx/nginx.pid \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-file-aio \ --with-http_realip_module \ --with-http_ssl_module \ --with-stream \ --with-mail=dynamic \ --with-pcre=/usr/local/src/pcre-8.44 \ --with-zlib=/usr/local/src/zlib-1.2.11 \ --with-openssl=/usr/local/src/openssl-1.1.1d make make install
make是用來編譯的,它從Makefile中讀取指令,而後編譯。
make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
configure命令是用來檢測你的安裝平臺的目標特徵的。它定義了系統的各個方面,包括nginx的被容許使用的鏈接處理的方法,好比它會檢測你是否是有CC或GCC,並非須要CC或GCC,它是個shell腳本,執行結束時,它會建立一個Makefile文件。nginx的configure命令支持如下參數:
--prefix=path #定義一個目錄,存放服務器上的文件 ,也就是nginx的安裝目錄。默認使用 /usr/local/nginx。
--sbin-path=path #設置nginx的可執行文件的路徑,默認爲 prefix/sbin/nginx.
--conf-path=path #設置在nginx.conf配置文件的路徑。nginx容許使用不一樣的配置文件啓動,經過命令行中的-c選項。默認爲prefix/conf/nginx.conf.
--pid-path=path #設置nginx.pid文件,將存儲的主進程的進程號。安裝完成後,能夠隨時改變的文件名 , 在nginx.conf配置文件中使用 PID指令。默認狀況下,文件名 爲prefix/logs/nginx.pid.
--error-log-path=path #設置主錯誤,警告,和診斷文件的名稱。安裝完成後,能夠隨時改變的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默認狀況下,文件名 爲prefix/logs/error.log.
--http-log-path=path #設置主請求的HTTP服務器的日誌文件的名稱。安裝完成後,能夠隨時改變的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默認狀況下,文件名 爲prefix/logs/access.log.
--user=name #設置nginx工做進程的用戶。安裝完成後,能夠隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的用戶名是nobody。
--group=name #設置nginx工做進程的用戶組。安裝完成後,能夠隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的爲非特權用戶。
--with-select_module --without-select_module #啓用或禁用構建一個模塊來容許服務器使用select()方法。該模塊將自動創建,若是平臺不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module --without-poll_module #啓用或禁用構建一個模塊來容許服務器使用poll()方法。該模塊將自動創建,若是平臺不支持的kqueue,epoll,rtsig或/dev/poll。
--without-http_gzip_module #不編譯壓縮的HTTP服務器的響應模塊。編譯並運行此模塊須要zlib庫。
--without-http_rewrite_module #不編譯重寫模塊。編譯並運行此模塊須要PCRE庫支持。
--without-http_proxy_module #不編譯http_proxy模塊。
--with-http_ssl_module #使用https協議模塊。默認狀況下,該模塊沒有被構建。創建並運行此模塊的OpenSSL庫是必需的。
--with-pcre=path #設置PCRE庫的源碼路徑。PCRE庫的源碼(版本4.4 - 8.30)須要從PCRE網站下載並解壓。其他的工做是Nginx的./ configure和make來完成。正則表達式使用在location指令和 ngx_http_rewrite_module 模塊中。
--with-pcre-jit #編譯PCRE包含「just-in-time compilation」(1.1.12中, pcre_jit指令)。
--with-zlib=path #設置的zlib庫的源碼路徑。要下載從 zlib(版本1.1.3 - 1.2.5)的並解壓。其他的工做是Nginx的./ configure和make完成。ngx_http_gzip_module模塊須要使用zlib 。
--with-cc-opt=parameters #設置額外的參數將被添加到CFLAGS變量。例如,當你在FreeBSD上使用PCRE庫時須要使用:--with-cc-opt="-I /usr/local/include。.如須要須要增長 select()支持的文件數量:--with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=parameters #設置附加的參數,將用於在連接期間。例如,當在FreeBSD下使用該系統的PCRE庫,應指定:--with-ld-opt="-L /usr/local/lib".
--add-module=<PATH> #靜態加載第三方模塊
--add-dynamic-module=<PATH> #動態加載第三方模塊
./nginx #啓動nginx
[root@lgh1 nginx]# ./nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit #顯示 nginx 的版本
-V : show version and configure options then exit #顯示 nginx 的版本,編譯器版本和配置參數
-t : test configuration and exit #測試配置參數並退出
-T : test configuration, dump it and exit# 測試配置參數,dump出並退出
-q : suppress non-error messages during configuration testing #在配置測試期間禁止顯示非錯誤消息
-s signal : send signal to a master process: stop, quit, reopen, reload #發送信號給主進程;包括stop(中止), quit(退出),reopen(從新打開日誌文件), reload(從新加載配置文件)
-p prefix : set prefix path (default: /usr/local/nginx/) #設置nginx的路徑
-c filename : set configuration file (default: /usr/local/nginx/nginx.conf) # 爲Nginx指定一個配置文件
-g directives : set global directives out of configuration file #從配置文件中設置全局指令
... #全局塊 events { #events塊 ... } http #http塊 { ... #http全局塊 server #server塊 { ... #server全局塊 location [PATTERN] #location塊 { ... } location [PATTERN] { ... } } server { ... } ... #http全局塊 }
一、全局塊:配置影響nginx全局的指令。通常有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,容許生成worker process數等。
二、events塊:配置影響nginx服務器或與用戶的網絡鏈接。有每一個進程的最大鏈接數,選取哪一種事件驅動模型處理鏈接請求,是否容許同時接受多個網路鏈接,開啓多個網絡鏈接序列化等。
三、http塊:能夠嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,鏈接超時時間,單鏈接請求數等。
四、server塊:配置虛擬主機的相關參數,一個http中能夠有多個server。
五、location塊:配置請求的路由,以及各類頁面的處理狀況
參考:
https://www.cnblogs.com/1214804270hacker/p/9325150.html
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
https://zhuanlan.zhihu.com/p/91296785
https://www.cnblogs.com/fuzhongfaya/p/8944951.html
https://www.cnblogs.com/crazymagic/p/11029487.html