nginx功能介紹和基本安裝


一、簡介

  nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;nginx可以作為一個HTTP服務器進行網站的發布處理,另外nginx可以作為反向代理進行負載均衡的實現。

二、功能介紹

2.1、nginx負載均衡

  負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。負載均衡(Load Balance)其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。--百度百科

  nginx提供的負載均衡能力主要包括Http負載均衡,和UDP和TCP負載均衡;

2.1.1、負載均衡算法

1、Round Robin:請求在服務器之間均勻分布,並考慮服務器權重(默認算法)

upstream backend {
   server backend1.example.com;
   server backend2.example.com;
}

2、Least Connections:在考慮服務器權重的同時,向活動連接數最少的服務器發送請求

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

3、IP Hash:向其發送請求的服務器由客戶端IP地址確定。在這種情況下,要么使用IPv4地址的前三個八位字節,要么使用整個IPv6地址來計算哈希值。該方法保證來自同一地址的請求可以到達同一服務器,除非該服務器不可用

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

如果其中一個服務器需要從負載均衡組中暫時移除,可以用down參數標記它,以保持當前客戶端IP地址的散列。將由此服務器處理的請求自動發送到組中的下一個服務器。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
}

4、Generic Hash:向其發送請求的服務器由用戶定義的鍵確定,該鍵可以是文本字符串、變量或組合。例如,密鑰可以是成對的源IP地址和端口,或者是URI。

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

5、Least Time(NGINX Plus獨有):對於每個請求,NGINX Plus選擇平均延遲最低且活動連接數最少的服務器,其中最低平均延遲是根據包含到最短時間指令的以下哪些參數計算:
header :從服務器接收第一個字節的時間
last_byte:從服務器接收完整響應的時間
last_byte inflight:從服務器接收完整響應的時間,考慮到不完整的請求

upstream backend {
    least_time header;
    server backend1.example.com;
    server backend2.example.com;
}

6、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;
}

2.1.2、第三方算法

第三方的負載均衡策略的實現需要安裝第三方插件

1、fair:按照服務器端的響應時間來分配請求,響應時間短的優先分配

#動態服務器組
upstream dynamic_zuoyu {
    server localhost:8080;  
    server localhost:8081;  
    server localhost:8082;  
    fair;    #實現響應時間短的優先分配
}

2、url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,要配合緩存命中來使用。同一個資源多次請求,可能會到達不同的服務器上,導致不必要的多次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一台服務器,一旦緩存住了資源,再此收到請求,就可以從緩存中讀取。

#動態服務器組
upstream dynamic_zuoyu {
    hash $request_uri;    #實現每個url定向到同一個后端服務器
    server localhost:8080;  
    server localhost:8081;  
    server localhost:8082; 
}

2.2、緩存

  緩存(cache),原始意義是指訪問速度比一般隨機存取存儲器(RAM)快的一種高速存儲器,通常它不像系統主存那樣使用DRAM技術,而使用昂貴但較快速的SRAM技術。緩存的設置是所有現代計算機系統發揮高性能的重要因素之一。--百度百科

一般一個請求有:客戶端緩存,代理端緩存(nginx),服務器緩存(redis、Memcache等)

  1. 客戶端第一次向Nginx請求數據a;
  2. 當Nginx發現緩存中沒有數據a時,會向服務端請求數據a;
  3. 服務端接收到Nginx發來的請求,則返回數據a到Nginx,並且緩存在Nginx;
  4. Nginx返回數據a給客戶端應用;
  5. 客戶端第二次向Nginx請求數據a;
  6. 當Nginx發現緩存中存在數據a時,則不會請求服務端;
  7. Nginx把緩存中的數據a返回給客戶端應用

2.2、web服務器

  Web服務器一般指網站服務器,是指駐留於因特網上某種類型計算機的程序,可以向瀏覽器等Web客戶端提供文檔,也可以放置網站文件,讓全世界瀏覽;可以放置數據文件,讓全世界下載。目前最主流的三個Web服務器是Apache、 Nginx 、IIS。-- 百度百科

nginx作為web服務器的優點:

  1. 輕量級,同樣起web 服務,比apache占用更少的內存及資源 ,支持更多的並發連接,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。在高連接並發的情況下,Nginx是Apache服務器不錯的替代品: Nginx在美國是做虛擬主機生意的老板們經常選擇的軟件平台之一. 能夠支持高達 50,000 個並發連接數的響應, 這歸功於Nginx為我們選擇了 epoll and kqueue 作為開發模型.
  2. 抗並發,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高並發下nginx 能保持低資源低消耗高性能
  3. 高度模塊化的設計,編寫模塊相對簡單
  4. 社區活躍,各種高性能模塊出品迅速啊
  5. Nginx本身就是一個反向代理服務器
  6. 負載均衡能力突出,Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務, 也可以支持作為 HTTP代理 服務器對外進行服務. Nginx采用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多

  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先緩存起來,再響應給客戶端,這樣就大大減少了動態服務器的壓力。

2.3、反向代理

  正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。

  反向代理:其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據后,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。

2.4、動靜分離

  動靜分離:為了提高網站的響應速度,減輕程序服務器(Tomcat,Jboss等)的負載,對於靜態資源比如圖片,js,css等文件,我們可以在反向代理服務器中進行緩存,這樣瀏覽器在請求一個靜態資源時,代理服務器就可以直接處理,而不用將請求轉發給后端服務器。用戶請求的動態文件比如servlet,jsp則轉發給Tomcat,Jboss服務器處理,這就是動靜分離。這也是反向代理服務器的一個重要的作用。

  動靜分離主要是通過nginx+tomcat來實現,其中nginx處理圖片、html、JS、CSS等靜態文件,tomcat處理jsp、servlet等動態請求。所以可以利用nginx作為文件服務器,在公司的內網搭建文件服務器,提供下載功能,挺方便。

  動靜分離從目前實現角度來講大致分為兩種:一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;另外一種方法就是動態跟靜態文件混合在一起發布,通過 nginx 來分開。

2.5、壓縮和解壓縮

  壓縮響應通常顯著的減少傳輸數據的大小。然而,壓縮發生在運行時,它也會增加相當大的處理開銷對性能有負面的影響。Nginx在發送響應到客戶端時執行壓縮,但不對已經壓縮的響應“二次壓縮”。

  默認情況下,NGINX僅壓縮MIME類型的響應text/html。要壓縮其他MIME類型的響應,請包含gzip_types指令並列出其他類型。

2.6、高可用性

  高可用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資源及服務,恢復到原來的備用角色

2.7、郵件代理

  NGINX可以將IMAP,POP3和SMTP協議代理到承載郵件帳戶的上游郵件服務器之一,因此可以用作電子郵件客戶端的單個端點。這可能帶來許多好處,例如:

  1. 輕松擴展郵件服務器的數量
  2. 根據不同的規則選擇郵件服務器,例如,根據客戶的IP地址選擇最近的服務器
  3. 在郵件服務器之間分配負載

  使用--with-mail用於電子郵件代理功能的--with-mail_ssl_module參數和用於SSL / TLS支持的參數編譯了Mail模塊

三、編譯安裝

3.1、安裝依賴

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

3.2、安裝nginx

官網: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

3.3、編譯參數

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   #啟動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全局塊
}

  

1、全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日志存放路徑,配置文件引入,允許生成worker process數等。
2、events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。
3、http塊:可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日志自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
4、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
5、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

https://www.nginx.cn/install

https://www.cnblogs.com/knowledgesea/p/5175711.html

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM