反向代理Nginx簡介

什麼是 Nginx

Nginx 是俄羅斯人編寫的十分輕量級的 HTTP 服務器,Nginx,它的發音爲「engine X」,是一個高性能的HTTP和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器。Nginx 是由俄羅斯人 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超過兩年半了。Igor Sysoev 在創建的項目時,使用基於 BSD 許可。php

Nginx 特色

Nginx 作爲 HTTP 服務器,有如下幾項基本特性:html

  • 處理靜態文件,索引文件以及自動索引;打開文件描述符緩衝.
  • 無緩存的反向代理加速,簡單的負載均衡和容錯.
  • FastCGI,簡單的負載均衡和容錯.
  • 模塊化的結構。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。若是由 FastCGI 或其它代理服務器處理單頁中存在的多個 SSI,則這項處理能夠並行運行,而不須要相互等待。
  • 支持 SSL 和 TLSSNI.

Nginx 專爲性能優化而開發,性能是其最重要的考量,實現上很是注重效率 。它支持內核 Poll 模型,能經受高負載的考驗,有報告代表能支持高達 50,000 個併發鏈接數。
Nginx 具備很高的穩定性。
Nginx 支持熱部署。
Nginx 代碼質量很是高,代碼很規範,手法成熟,模塊擴展也很容易。nginx

Nginx概述

HTTP基礎功能:算法

  • 處理靜態文件,索引文件以及自動索引;
  • 反向代理加速(無緩存),簡單的負載均衡和容錯;
  • FastCGI,簡單的負載均衡和容錯;
  • 模塊化的結構。過濾器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI過濾器中,到同一個 proxy 或者 FastCGI 的多個子請求併發處理;
  • SSL 和 TLS SNI 支持;

IMAP/POP3 代理服務功能:apache

  • 使用外部 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 支持;

支持的操做系統:windows

  • 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;
  • windows 編譯版本支持 windows 系列操做系統;

結構與擴展:後端

  • 一個主進程和多個工做進程,工做進程運行於非特權用戶;
  • 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功能:api

  • 基於IP 和名稱的虛擬主機服務;
  • Memcached 的 GET 接口;
  • 支持 keep-alive 和管道鏈接;
  • 靈活簡單的配置;
  • 從新配置和在線升級而無須中斷客戶的工做進程;
  • 可定製的訪問日誌,日誌寫入緩存,以及快捷的日誌回捲;
  • 4xx-5xx 錯誤代碼重定向;
  • 基於 PCRE 的 rewrite 重寫模塊;
  • 基於客戶端 IP 地址和 HTTP 基本認證的訪問控制;
  • PUT, DELETE, 和 MKCOL 方法;
  • 支持 FLV (Flash 視頻);
  • 帶寬限制;

實驗特性:緩存

  • 內嵌的 perl
  • 經過 aio_read()/aio_write() 的套接字工做的實驗模塊,僅在 FreeBSD 下。
  • 對線程的實驗化支持,FreeBSD 4.x 的實現基於 rfork()

Nginx命令

工做目錄說明:要求在Nginx.exe目錄下執行
1.啓動命令
start nginx
Linux下命令: ./nginx
2.重起命令
nginx -s reload
Linux下命令: ./nginx -s reload
3.關閉命令
nginx -s stop
Linux下命令: ./nginx -s stoptomcat

Nginx反向代理的原理

反向代理:用戶訪問服務器,服務器知道客戶信息,客戶不知道服務器信息
正向代理:用戶訪問服務器,服務器不知道客戶信息,客戶知道服務器信息
默認訪問路徑:localhost:80
在conf目錄下nginx.conf
只有一個http協議

#gzip  on;
#一個服務器,一個server
    server {
#端口通常不改
        listen       80;
#監聽域名  服務名稱不能重複
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
#開啓反向代理   表明所有請求
        location / {
#root關鍵字  代理的是一個目錄
            root   html;
#index關鍵字   表明默認頁面
            index  index.html index.htm;
        }

例如:

1.配置圖片代理

server {
          listen       80;
          server_name   image.jt.com;#域名

          location / {
              root D:/JT-SOFT/images;#本地磁盤位置
              }
         }
   #必須在協議以內完成

HOSTS文件

做用:實現本地域名與ip地址的映射
默認路徑:C:\Windows\System32\drivers\etc\hosts

實現域名代理

#實現默認80跳轉8091經過image.jt.com直接訪問
 server {
          listen       80;
          server_name   image.jt.com;
            location / {
#發起url請求地址
            proxy_pass http://localhost:8091;

          }

       }

Nginx實現集羣搭建

動態獲取端口號

@RestController
public class PortController {
    @Value("${server.port}")
    private int port;
    @RequestMapping("/getport")
    public String getport(){
        return "端口號"+port;
    }

項目打包

server{
         listen 80;
         server_name   manage.jt.com;
        location /{
            #proxy_pass http://localhost:8091;
            proxy_pass http://jtwindows;
}


}
      #配置tomacat服務器集羣
      upstream jtwindows{
                   server  127.0.0.1:8081;
                   server  127.0.0.1:8082;
                   server  127.0.0.1:8083;
}

打包項目三次 端口分別是8081,8082,8083
分別都運行到程序上經過域名/getport測試端口是否能實現輪訓
默認是輪訓策略
權重策論:weight數值越高訪問越頻繁數值越低基本不會被訪問:

#配置tomacat服務器集羣
      upstream jtwindows{
                   server  127.0.0.1:8081 weight=50;
                   server  127.0.0.1:8082 weight=1;
                   server  127.0.0.1:8083 weight=2;
}

iphash策論

upstream jtwindows{
                   ip_hash;
                   server  127.0.0.1:8081 weight=50;
                   server  127.0.0.1:8082 weight=1;
                   server  127.0.0.1:8083 weight=2;
}

缺點:1.容易形成負載不均

2.若是Ip地址與用戶綁定在一塊兒,若是tomcat服務器宕機,則直接影響用戶
  IPhash實用場景:通常進行壓力測試時使用
事件模型

Nginx支持以下處理鏈接的方法(I/O複用方法),這些方法能夠經過use指令指定。

  • select - 標準方法。 若是當前平臺沒有更有效的方法,它是編譯時默認的方法。你可使用配置參數 --with-select_module 和 --without-select_module 來啓用或禁用這個模塊。
  • poll - 標準方法。 若是當前平臺沒有更有效的方法,它是編譯時默認的方法。你可使用配置參數 --with-poll_module 和 --without-poll_module 來啓用或禁用這個模塊。
  • kqueue - 高效的方法,使用於 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的MacOS X系統使用kqueue可能會形成內核崩潰。
  • epoll - 高效的方法,使用於Linux內核2.6版本及之後的系統。在某些發行版本中,如SuSE 8.2, 有讓2.4版本的內核支持epoll的補丁。
  • rtsig - 可執行的實時信號,使用於Linux內核版本2.2.19之後的系統。默認狀況下整個系統中不能出現大於1024個POSIX實時(排隊)信號。這種狀況對於高負載的服務器來講是低效的;因此有必要經過調節內核參數 /proc/sys/kernel/rtsig-max 來增長隊列的大小。但是從Linux內核版本2.6.6-mm2開始, 這個參數就再也不使用了,而且對於每一個進程有一個獨立的信號隊列,這個隊列的大小能夠用 RLIMIT_SIGPENDING 參數調節。當這個隊列過於擁塞,nginx就放棄它而且開始使用 poll 方法來處理鏈接直到恢復正常。
  • /dev/poll - 高效的方法,使用於 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.
  • eventport - 高效的方法,使用於 Solaris 10. 爲了防止出現內核崩潰的問題, 有必要安裝 這個 安全補丁。
Nginx高級屬性

1.down屬性
說明:若是服務器宕機,則能夠經過down屬性把服務器宕掉

upstream jtwindows{
                   #ip_hash;
                   server  127.0.0.1:8081 weight=50 down;
                   server  127.0.0.1:8082 weight=1;
                   server  127.0.0.1:8083 weight=2;
}

2.backup屬性
備用機的設定,通常條件下備用機是不幹活的,可是當主機遇忙時,或者宕機是纔會啓用備用機
8081宕機了(down)啓用備用機

upstream jtwindows{
                   #ip_hash;
                   server  127.0.0.1:8081 weight=50 down;
                   server  127.0.0.1:8082 weight=1;
                   server  127.0.0.1:8083 weight=2 backup;
}

3.tomcat服務器高可用
說明:若是人爲添加down屬性,效率不高,自動檢測服務器是否宕機,若是宕機自動標識爲down
max_fails=1設置最大的失敗次數,若是超過最大次數則標識爲down
fail_timeout=60s 失效的超時時間(60s)

upstream jtwindows {
        #ip_hash;
        server localhost:8081 max_fails=1 fail_timeout=60s;
        server localhost:8082 max_fails=1 fail_timeout=60s;
        server localhost:8083 max_fails=1 fail_timeout=60s;
    }

Nginx常見問題

  • [#notwork 某些東東不工做 (URL重寫, 代理, 路徑, ...)]
  • [#other 有沒有其它相似的Web服務器]
  • [#chroot 對於chroot的支持是否在計劃之中?]
  • [#usecase 在什麼狀況下使用Nginx比使用squid要好?]
  • [#imapexample 有沒有人能給出一個完整的.conf配置文件來詳細的解讀一下怎麼配置和測試 IMAP 模塊, 而不僅是關於 IMAP 的隻言片語啊?]
  • [#smtpexample 怎麼讓Nginx成爲以postfix作爲後端的SMTP代理?]
  • [#loadbalancing Nginx使用什麼算法來實現負載均衡? 它能實現基於鏈接數的負載均衡嗎?]
  • [#proxy_buffering 我能關閉從代理服務器到後端服務器的緩存嗎或者使用上傳進度特性?]

某些東東不工做 (URL重寫, 代理, 路徑, ...)

例如: 如URL重寫(rewrite)不工做了或者是unix的路徑(/$PATH)的問題云云...

請仔細閱讀 [NginxDebugging] 而且 逐行 查看錯誤日誌。
若是你沒找到錯誤 打起精神 試着到IRC或郵件列表裏說明一下你碰到的問題。

有沒有其它相似的Web服務器

關於各自的優缺點請使用本身喜歡的搜索引摯查找  ;-)

對於chroot的支持是否在計劃之中?

有人知道嗎?

在什麼狀況下使用Nginx比使用squid要好? 反之亦然。

大致上來講nginx主要用於反向加速代理而不是像squid那樣作爲常規代理服務器。Nginx的最大優點在於高負載狀況下內存和CPU的低消耗。 我不認爲squid能給你帶來比nginx更好的性能。

有沒有人能給出一個完整的.conf配置文件來詳細的解讀一下怎麼配置和測試 IMAP 模塊, 而不僅是關於 IMAP 的隻言片語啊?

依照 [NginxImapProxyExample] 開始你的配置. 關於不一樣配置參數的具體信息, 請查看 [NginxMailCoreModule] 頁。

示例1: 用運行於apache上的php腳本作後端驗證

示例2: 使用運行於同一個服務器的 nginx-embedded-perl 模塊做爲 imap/pop代理和認證後端

怎麼讓Nginx成爲以postfix作爲後端的SMTP代理?

有人知道不?

Nginx使用什麼算法來實現負載均衡? 它能實現基於鏈接數的負載均衡嗎?

目前Nginx使用簡單的輪巡算法,因此沒法作基本連接計數的負載均衡。 這個可能會在未來的版本中有所改變。

我能關閉從代理服務器到後端服務器的緩存嗎或者使用上傳進度特性?

基於 太多人詢問下面的問題:

  • 我能爲了獲得上傳進度而關閉代理的緩存嗎
  • 使用nginx我怎麼才能給用戶顯示上傳進度
  • ...

到目前爲止 (2007-Apr-26) 尚未辦法關閉到後端服務器的緩存.

相關文章
相關標籤/搜索