【原創】nginx入門

 

 

1、簡介

Nginx (engine x) 是一個高性能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。2018年08月28日發佈1.15.3版本。html

其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。前端

2、功能概述

一、HTTP基礎功能:

    處理靜態文件,索引文件以及自動索引;nginx

    反向代理加速(無緩存),簡單的負載均衡和容錯;c++

    FastCGI,簡單的負載均衡和容錯;web

    模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;算法

    SSL 和 TLS SNI 支持;apache

二、IMAP/POP3 代理服務功能:

    使用外部 HTTP 認證服務器重定向用戶到 IMAP/POP3 後端;後端

    使用外部 HTTP 認證服務器認證用戶後鏈接重定向到內部的 SMTP 後端;瀏覽器

    認證方法:緩存

    POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;

    IMAP: IMAP LOGIN;

    SMTP: AUTH LOGIN PLAIN CRAM-MD5;

    SSL 支持;

    在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

三、支持的操做系統:

    FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

    Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

    Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;

    MacOS X (10.4) PPC;

四、結構與擴展:

    一個主進程和多個工做進程。工做進程是單線程的,且不須要特殊受權便可運行;

    kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;

    kqueue支持的不一樣功能包括 EV_CLEAR, EV_DISABLE (臨時禁止事件), NOTE_LOWAT, EV_EOF, 有效數據的數目,錯誤代碼;

    sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;

    輸入過濾 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;

    10,000 非活動的 HTTP keep-alive 鏈接僅須要 2.5M 內存。

    最小化的數據拷貝操做;

五、其餘HTTP功能:

    基於IP 和名稱的虛擬主機服務;

    Memcached 的 GET 接口;

    支持 keep-alive 和管道鏈接;

    靈活簡單的配置;

    從新配置和在線升級而無須中斷客戶的工做進程;

    可定製的訪問日誌,日誌寫入緩存,以及快捷的日誌回捲;

    4xx-5xx 錯誤代碼重定向;

    基於 PCRE 的 rewrite 重寫模塊;

    基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;

    PUT, DELETE, 和 MKCOL 方法;

    支持 FLV (Flash 視頻);

帶寬限制;

3、安裝與啓動

命令:

yum install -y gcc gcc-c++  pcre pcre-devel zlib zlib-devel # 安裝依賴

cd /usr/local/src

wget http://nginx.org/download/nginx-1.15.3.tar.gz # 下載源代碼

tar -xvzf nginx-1.15.3.tar.gz

cd nginx-1.15.3

./configure --prefix=/usr/local/nginx

make && make install #編譯、安裝

啓動:/usr/local/nginx/sbin/nginx

測試配置文件:/usr/local/nginx/sbin/nginx –t

重啓:/usr/local/nginx/sbin/nginx -s reopen

從新載入配置文件:/usr/local/nginx/sbin/nginx -s reload

快速關閉:/usr/local/nginx/sbin/nginx -s stop

優雅關閉:/usr/local/nginx/sbin/nginx -s quit

訪問:

http://192.168.141.130/

 

 

4、配置示例

1)、反向代理

正向代理-轉發代理(forward proxy):

 

 

反向代理(reverse proxy):

 

 

配置:

server {

        listen       80;

        server_name  fxdl.test.com;

 

        location /fxdl {

            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.141.130:8080/fxdl;

        }

    }

  

2)、動靜分離

 

 

配置:

server {

        listen       80;

        server_name  djfl.test.com;

 

        location ^~ /static/

        {

            alias /usr/local/nginx/djfl/;

            break;

        }

 

        location /djfl {

            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.141.130:8080/djfl;

        }

}

  

3)、負載均衡

 

 

配置:

upstream fzjh

{

    server 192.168.141.130:8080;

    server 192.168.141.130:9090;

}   

server

{

        listen       80;

        server_name  fzjh.test.com;

       

        location ^~ /static/

        {

            alias /usr/local/nginx/fzjh/;

            break;

        }

 

        location /fzjh {

            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://fzjh/fzjh;

        }

    }

  

負載均衡算法:

Nginx的upstream目前支持如下幾種方式的分配

(1)、輪詢(默認)

每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。

(2)、weight

指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。

(3)、ip_hash

每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。

(4)、fair(第三方)

按後端服務器的響應時間來分配請求,響應時間短的優先分配。

(5)、url_hash(第三方)

按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。

4)、FastCGI

FastCGI是一個可伸縮地、高速地在HTTP服務器和動態腳本語言間通訊的接口(FastCGI接口在Linux下是socket(能夠是文件socket,也能夠是ip socket)),主要優勢是把動態語言和HTTP服務器分離開來。多數流行的HTTP服務器都支持FastCGI,包括Apache、Nginx和lightpd。

同時,FastCGI也被許多腳本語言所支持,比較流行的腳本語言之一爲PHP。FastCGI接口方式採用C/S架構,能夠將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程執行,而後將獲得的結構返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。

FastCGI的重要特色:

一、FastCGI是HTTP服務器和動態腳本語言間通訊的接口或者工具。

二、FastCGI優勢是把動態語言解析和HTTP服務器分離開來。

三、Nginx、Apache、Lighttpd以及多數動態語言都支持FastCGI。

四、FastCGI接口方式採用C/S架構,分爲客戶端(HTTP服務器)和服務端(動態語言解析服務器)。

五、PHP動態語言服務端能夠啓動多個FastCGI的守護進程。

六、HTTP服務器經過FastCGI客戶端和動態語言FastCGI服務端通訊。

Nginx FastCGI的運行原理

Nginx不支持對外部動態程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用。FastCGI接口在Linux下是socket(能夠是文件socket,也能夠是ip socket)。爲了調用CGI程序,還須要一個FastCGI的wrapper,這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接收到請求,而後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個運做過程。

 

 

FastCGI的主要優勢是把動態語言和HTTP服務器分離開來,是Nginx專注處理靜態請求和向後轉發動態請求,而PHP/PHP-FPM服務器專注解析PHP動態請求。

5)、rewrite

看下面兩張圖:

 

 

 

 

配置:

server {

        listen       80;

        server_name  old.test.com;

       rewrite ^(.*)$  http://new.test.com$1 permanent;

       #return 301 http://new.test.com$request_uri;

    }

    server {

        listen       80;

        server_name  new.test.com;

 

 

        location / {

            root   html;

            index  index.html index.htm;

        }

    }

  

5、nginx和apache httpd服務器的對比

server

Apache

Nginx     

Proxy代理

很是好

很是好

Rewriter

很是好

Fcgi

很差

熱部署

不支持

支持

系統壓力比較

很大

很小

穩定性

很是好

安全性

通常

技術支持

很是好

不多

靜態文件處理

通常

很是好

Vhosts虛擬主機

支持

不支持

反向代理

通常

很是好

Session sticky

支持

不支持

Apache和Nginx比較

功能對比

Nginx和Apache同樣,都是HTTP服務器軟件,在功能實現上都採用模塊化結構設計,都支持通用的語言接口,如PHP、Perl、Python等,同時還支持正向和反向代理、虛擬主機、URL重寫、壓縮傳輸、SSL加密傳輸等。

  1. 在功能實現上,Apache的全部模塊都支持動、靜態編譯,而Nginx模塊都是靜態編譯的,
  2. 對FastCGI的支持,Apache對Fcgi的支持很差,而Nginx對Fcgi的支持很是好;
  3. 在處理鏈接方式上,Nginx支持epoll,而Apache卻不支持;
  4. 在空間使用上,Nginx安裝包僅僅只有幾百K,和Nginx比起來Apache絕對是龐然大物。

Nginx相對apache的優勢

  • 輕量級,一樣起web 服務,比apache 佔用更少的內存及資源
  • 靜態處理,Nginx 靜態處理性能比 Apache 高 3倍以上
  • 抗併發,nginx 處理請求是異步非阻塞的,而apache則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能。在Apache+PHP(prefork)模式下,若是PHP處理慢或者前端壓力很大的狀況下,很容易出現Apache進程數飆升,從而拒絕服務的現象。
  • 高度模塊化的設計,編寫模塊相對簡單
  • 社區活躍,各類高性能模塊出品迅速啊

apache相對nginx的優勢

  • rewrite,比nginx 的rewrite 強大
  • 模塊超多,基本想到的均可以找到
  • 少bug,nginx的bug相對較多
  • 超穩定
  • Apache對PHP支持比較簡單,Nginx須要配合其餘後端用

選擇Nginx的優點所在

  1. 做爲Web服務器: Nginx處理靜態文件、索引文件,自動索引的效率很是高。
  2. 做爲代理服務器,Nginx能夠實現無緩存的反向代理加速,提升網站運行速度。
  3. 做爲負載均衡服務器,Nginx既能夠在內部直接支持Rails和PHP,也能夠支持HTTP代理服務器對外進行服務,同時還支持簡單的容錯和利用算法進行負載均衡。
  4. 在性能方面,Nginx是專門爲性能優化而開發的,在實現上很是注重效率。它採用內核Poll模型(epoll and kqueue ),能夠支持更多的併發鏈接,最大能夠支持對50 000個併發鏈接數的響應,並且只佔用很低的內存資源。
  5. 在穩定性方面,Nginx採起了分階段資源分配技術,使得CPU與內存的佔用率很是低。Nginx官方表示,Nginx保持10 000個沒有活動的鏈接,而這些鏈接只佔用2.5MB內存,所以,相似DOS這樣的攻擊對Nginx來講基本上是沒有任何做用的。
  6. 在高可用性方面,Nginx支持熱部署,啓動速度特別迅速,所以能夠在不間斷服務的狀況下,對軟件版本或者配置進行升級,即便運行數月也無需從新啓動,幾乎能夠作到7×24小時不間斷地運行。

同時使用Nginx和Apache

因爲Nginx和Apache各自的優點,如今不少人選擇了讓二者在服務器中共存。在服務器端讓Nginx在前,Apache在後。由Nginx作負載均衡和反向代理,而且處理靜態文件,講動態請求(如PHP應用)交給Apache去處理。

相關文章
相關標籤/搜索