Nginx 簡介

[TOC]

Nginx 腦圖

簡介

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server

Nginx 是一款開源的輕量級的 Web 服務(wù)器邓厕,可以接受響應(yīng) HTTP 請求详恼,可以作為 反向代理服務(wù)器赚哗,郵件代理服務(wù)器和通用 TCP/UDP 代理服務(wù)器。

Nginx 采用 epoll(Linux 2.6 內(nèi)核)贿讹、kqueue(FreeBSD)、evenport(Solaris 10)作為網(wǎng)絡(luò) I/O 模型赊堪,因此具備極高的性能哭廉。在高并發(fā)連接請求的場景下遵绰,Nginx 能夠支持高達 50000 個并發(fā)連接數(shù)的響應(yīng)椿访,而同時對 CPU成玫,內(nèi)存等系統(tǒng)資源的消耗卻非常低虽画,運行非常穩(wěn)定码撰,幾乎可以做到 7x24 小時不間斷運行脖岛。

Nginx 通常用在 反向代理柴梆、負載均衡HTTP 緩存。其特點是高并發(fā)偿渡,高性能和低內(nèi)存溜宽。

特性

  • 高并發(fā)适揉,高性能嫉嘀,高可靠和低內(nèi)存占用剪侮。
  • 輕量級:功能模塊少(Nginx 僅保留 HTTP 需要的模塊红淡,其他模塊可以插件模式進行添加)在旱,代碼模塊化桶蝎。
  • 采用 io多路復用機制,事件驅(qū)動胜茧,異步非阻塞處理請求呻顽。
  • 單主多從(one Master廊遍,several Worker processes)模式喉前,Workder 進程以普通用戶身份運行。
  • 支持熱部署搪搏。
    ...

應(yīng)用場景

  • 靜態(tài)資源服務(wù)器
  • 正向代理服務(wù)器
  • 反向代理服務(wù)器(負載均衡)
  • 郵件代理服務(wù)器
  • 安全防御
    ...

幾個名詞釋義

  • 正向代理(proxy):通常意義上的代理疯溺,指的就是正向代理恃疯。
    其一般的流程為:個人客戶端通過將請求發(fā)送給到一個代理服務(wù)器(eg: Nginx)今妄,由代理服務(wù)器接收請求并真正去目的網(wǎng)站請求響應(yīng)盾鳞,最后將響應(yīng)回傳給到個人客戶端。
    可以看到推励,正向代理的整個過程中验辞,網(wǎng)站是看不到真正請求響應(yīng)的客戶端的,因此族购,正向代理可以隱藏真實的客戶端撑碴。如下圖所示:

    正向代理
  • 反向代理(reverse proxy):與正向代理代理客戶端請求不同,反向代理代理的是服務(wù)器付魔。
    其一般流程為:客戶端請求資源,反向代理服務(wù)器(eg:Nginx)接受到請求后懦鼠,從應(yīng)用服務(wù)器集群中選取一個響應(yīng)該請求。
    可以看到,在反向代理的整個過程中珊肃,客戶端只需發(fā)送請求厉亏,而無需關(guān)心是哪一臺服務(wù)器進行響應(yīng)叶堆。因此,反向代理隱藏了具體進行請求響應(yīng)的服務(wù)器忘渔。如下圖所示:

    反向代理

    Nginx 作為反向代理服務(wù)器的典型場景就是使用 負載均衡 來應(yīng)對有高并發(fā)請求的網(wǎng)站。

  • Web 服務(wù)器(Web Server):也稱為 WWW(World Wide Web)服務(wù)器乖阵,其主要功能就是讓用戶可以通過瀏覽器進行訪問儒将,其關(guān)注的焦點在于 HTTP 協(xié)議層面的傳輸和訪問控制。嚴格意義上來講砰逻,Web 服務(wù)器只負責處理 HTTP 協(xié)議蝠咆,只能發(fā)送靜態(tài)頁面的內(nèi)容闸翅,而對于一些動態(tài)內(nèi)容請求,就需要通過 CGI占卧、FastCGI、ISAPI 等接口將請求透傳(transparently forwards)給到給到特定應(yīng)用服務(wù)器處理豁遭。常見的 Nginx叭喜,Apache,IIS 等都屬于 Web 服務(wù)器蓖谢。

  • 應(yīng)用服務(wù)器(Application Server):是一個應(yīng)用執(zhí)行的容器捂蕴,所以其核心就是能夠運行一些應(yīng)用程序,本質(zhì)跟 HTTP 請求并沒有關(guān)系闪幽,只是孤立地運行一些自己的業(yè)務(wù)邏輯(所謂的動態(tài)內(nèi)容)。但是當前主流的 Web 應(yīng)用體系使用的是 B/S(Browser-Server)架構(gòu)级乍,因此大诸,應(yīng)用服務(wù)器通常也會集成 HTTP Server 功能,能夠接受和響應(yīng) HTTP 請求,但是不如專業(yè)的 Web 服務(wù)器功能那么強大沸手。常見的 Tomcat,Weblogic菲语,Jboss 等都屬于應(yīng)用服務(wù)器佩憾。

    :一般來說,開發(fā)階段直接使用應(yīng)用服務(wù)器進行調(diào)試即可(因為其提供了 HTTP Server 功能),而在項目部署階段婶恼,由于 Web 服務(wù)器性能更加優(yōu)秀眷篇,因此通常將 HTTP 請求的靜態(tài)資源直接交由其處理,而對于無法處理的請求,則通過反向代理等方式交由特定應(yīng)用服務(wù)器進行處理创肥。

  • 動靜分離:就是將靜態(tài)資源的請求和動態(tài)資源的請求進行區(qū)分,對于靜態(tài)資源(比如:*.html/*.png/*.jpg...)的請求,Web 服務(wù)器直接進行響應(yīng),而對于動態(tài)資源的請求睦擂,Web 服務(wù)器透傳給到應(yīng)用服務(wù)器進行處理摆马,并轉(zhuǎn)發(fā)響應(yīng)給到客戶端惩淳。

  • 負載均衡(Load Balance):當網(wǎng)站的并發(fā)量很大時,可以通過水平擴展服務(wù)器(集群)來分配負載棉磨,HTTP 請求按照一定的策略分發(fā)給到集群中的各個服務(wù)器衙傀,以達到最優(yōu)化資源使用、最大化吞吐率、最小化響應(yīng)時間、同時避免過載的目的叔锐。

安裝

這里我們采用源碼安裝解取,具體步驟如下(:本人的運行環(huán)境為:Windows Subsystem for Linux 2 - Ubuntu 18.04):

  1. 安裝編譯工具及一些庫文件:
$ sudo apt install make gcc gcc-c++ libtool 

# 或者:Ubuntu 可直接使用以下命令安裝平臺編譯環(huán)境
$ sudo apt install build-essential
$ sudo apt install libtool
  1. 安裝 PCRE 庫振乏,讓 Nginx 支持 Rewrite 功能:
$ cd /usr/local/src
$ wget -c "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

:安裝的是pcre而不是pcre2
:Rewrite 功能即能夠根據(jù)域名、URL 的不同,將 HTTP 請求轉(zhuǎn)發(fā)到不同的后端服務(wù)器群組中。

  1. 安裝 zlib 庫铁瞒,讓 Nginx 具備 gzip 壓縮功能:
$ cd /usr/local/src
$ wget -c 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
  1. 安裝 ssl芍碧,讓 Nginx 支持 https:
$ cd /usr/local/src
$ wget -c "https://www.openssl.org/source/openssl-1.1.1g.tar.gz"
$ tar -zxvf openssl-1.1.1g.tar.gz
$ cd openssl-1.1.1g
$ ./config
$ make
$ make install

:安裝完openssl后蔬浙,如果使用wget等工具遇到錯誤:Unable to locally verify the issuer's authority俱病,此時設(shè)置export SSL_CERT_DIR=/etc/ssl/certs即可擎勘。

  1. 下載 Nginx 源碼噪漾,官網(wǎng)下載地址為:download诈胜。
$ cd /usr/local/src
$ wget -c https://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-pcre=/usr/local/src/pcre-8.44        \
     --with-zlib=/usr/local/src/zlib-1.2.11      \
 --with-openssl=/usr/local/src/openssl-1.1.1g
$ make -j4
$ make install

其中:
--with-pcre=/usr/local/src/pcre-8.44:表示 PCRE 庫源碼路徑。
--with-zlib=/usr/local/src/zlib-1.2.11:表示 zlib 庫源碼路徑垦写。
--with-openssl=/usr/local/src/openssl-1.1.1g:表示 openssl 庫源碼路徑晚伙。

更多配置選項午磁,請查看:configure

  1. 上述過程完成后,Nginx 就已經(jīng)成功安裝到/usr/local/nginx中,下面將其添加到系統(tǒng)環(huán)境變量中:
$ cd /usr/local/nginx
$ ln -rs nginx /usr/local/bin/
  1. 此時,就可以使用命令sudo nginx來啟動 Nginx,然后瀏覽器輸入:http://localhost,就可以看到 Nginx 歡迎界面了:
Welcome to nginx

Nginx 進程架構(gòu)/執(zhí)行模型

Nginx 進程的架構(gòu)組成是:一個主進程(master process)和多個工作進程(worker process)藻烤。主進程主要用于讀取和檢測配置文件,以及維護各個工作進程。Nginx 工作進程具備 CPU 親和性,每個工作進程都固定在一個 CPU 上執(zhí)行,減少了切換 CPU 的 cache miss,從而提供了性能保障,其主要責職就是對實際請求進行處理。

Nginx 的執(zhí)行模型為:當主進程接受到一個客戶端請求時郭蕉,會將該請求通知到所有的工作進程拐袜,此時所有工作進程競爭該請求甜攀,最終由某個工作進程負責處理該請求谁撼。工作進程如果發(fā)現(xiàn)該請求請求的是靜態(tài)資源的話箍鼓,則自己進行響應(yīng)之剧。如果發(fā)現(xiàn)該請求請求的是動態(tài)資源蟹肘,則會將請求轉(zhuǎn)發(fā)給相應(yīng)的應(yīng)用服務(wù)器舵盈,等待應(yīng)用服務(wù)器處理該請求后赴蝇,最后由該工作進程將結(jié)果轉(zhuǎn)發(fā)給到客戶端熄阻。

Nginx 依據(jù)事件驅(qū)動模型和操作系統(tǒng)平臺獨特性實現(xiàn)請求快速分發(fā)給到各工作進程钾军。工作進程的數(shù)量由配置文件定義決定哀九,同時可以由給定配置進行重置或者根據(jù) CPU 核數(shù)進行動態(tài)更改息裸。一般將工作進程數(shù)設(shè)置為服務(wù)器 CPU 核心數(shù)是最適宜的访圃,因為 Nginx 采用了 io多路復用 機制漠另,每個工作進程都是一個獨立的進程,并且每個進程只有一個主線程,對請求的處理都是通過異步非阻塞方式报咳,對 CPU 親和性很高岩臣,可以將 CPU 性能發(fā)揮到極致焙压。

Nginx 常用命令

  • nginx -s reload:重新載入配置文件

  • nginx -s reopen:重啟 Nginx

  • nginx -s stop:停止 Nginx

  • nginx -c file:指定配置文件(不使用默認配置文件)

  • nginx -t:檢查配置文件 nginx.conf

更多命令行參數(shù)詳情,請參考:nginx -hCommand-line parameters

Nginx 模塊

Nginx 主要由兩部分內(nèi)容構(gòu)成:內(nèi)核 + 模塊(module)

Nginx 是典型的微內(nèi)核設(shè)計,其內(nèi)核簡潔優(yōu)雅,且具備極高擴展性。內(nèi)核提供了 Web 服務(wù)的基本功能,如啟用網(wǎng)絡(luò)協(xié)議蜕径,創(chuàng)建運行環(huán)境帕识,接收和分配客戶端請求伪货,處理模塊之間的交互...

同時 Nginx 又采用模塊化的開發(fā)方式,Nginx 的各種功能和操作都交由對應(yīng)模塊進行實現(xiàn)。

官網(wǎng)上,主要介紹了 Nginx 4 大模塊:

  • Core functionality:核心功能模塊:ngx_core_module让网,主要介紹了 Nginx 核心模塊配置的一些指令泞辐,eg:user锯茄、pid...

  • ngx_http_module:HTTP 模塊,主要是對 HTTP 進行操作的各個功能模塊組合,其包含的子模塊如下圖所示:

ngx_http_module
  • ngx_mail_module:MAIL 模塊步氏,郵件代理模塊,其包含的子模塊如下圖所示:
ngx_mail_module
  • ngx_stream_module:STREAM 模塊,是基于 tcp 協(xié)議的一些模塊写穴,其包含的子模塊如下圖所示:
ngx_stream_module

:各模塊的具體詳情及其配置語法,請參考:Modules reference

Nginx 的模塊默認編譯進 Nginx 中(可通過nginx -V查看編譯的具體模塊),如果需要增加或刪除模塊艾少,需要重新編譯 Nginx误堡。

Nginx 模塊化的設(shè)計使得 Nginx 具備極佳的擴展性悉抵,越來越多的第三方模塊開發(fā)也使得 Nginx 的功能越來越強大审磁。

Nginx 基本配置

Nginx 及其各個模塊的工作方式都由配置文件進行控制瓤介。默認的配置文件可能存放于以下路徑:

  • /usr/local/nginx/conf/nginx.conf
  • /etc/nginx/nginx.conf
  • usr/local/etc/nginx/nginx.conf

實際上闻察,我們可以通過前面介紹的配置文件檢測命令nginx -t钉嘹,該命令會打印出默認的配置文件路徑,如下圖所示:

nginx -t

可以看到利赋,本人機器上 Nginx 默認的配置文件路徑為:/usr/local/nginx/nginx.conf(其實是源碼安裝的時候手動進行指定的)

知道 Nginx 的配置文件路徑后褪那,我們就可以對其進行配置。但在此之前,需先了解一下 Nginx 配置文件組織架構(gòu):

  • 配置文件架構(gòu):Nginx 由多個模塊(module)組合而成熏矿,每個模塊的配置都由相應(yīng)的指令(directive)進行設(shè)置鲤竹。
    在 Nginx 配置文件中,有兩種 指令 類型:

    • 簡單指令(simple directives):簡單指令由名稱和參數(shù)組成勇边,以空格進行區(qū)分奕坟,以分號;作為結(jié)束。其格式如下所示:

      name parameter;
      
      name parameter1 parameter2;
      
      name parameter1 parameter2 ...;
      
    • 塊指令(block directives):塊指令也是由名稱和參數(shù)組成,只是相對與簡單指令以分號;進行結(jié)束最仑,塊指令以大括號作為結(jié)束,并且大括號內(nèi)可以添加一些額外指令。其格式如下所示:

      name {
          name1 parameter1;
          name2 {
              ...
          }
          ...
      }
      
      name parameter {
          name1 ...;
          name2 {
              ...
          }
          ...
      }
      
      name parameter1 parameter2 ... {
          name1 ...;
          name2 {
              ...
          }
          ...
      }
      

    :如果塊指令內(nèi)部有其他一些指令萤捆,則該塊指令稱之為 context(比如:eventshttpserver挽封,location...)
    配置文件內(nèi)的獨立于任何 context 之外的指令被稱為 main context阔蛉,比如:eventshttp 指令就屬于 main context通铲,server 就屬于 http context部服,location 也屬于 http context昌讲。

了解完配置文件的指令格式后窄驹,我們就可以進行具體配置了:以下是一個基本的配置結(jié)構(gòu):

main                         # 全局配置(main context)

events {                     # 事件模塊配置
    ...
}

http {                       # http模塊設(shè)置
    ....

    server {                 # 虛擬服務(wù)器
        ....
        location {           # 路由配置
            ....
        }

        location path {
            ....
        }

        location otherpath {
            ....
        }
    }

    server {
        ....

        location {
            ....
        }
    }

    upstream name {          # 負載均衡配置
        ....
    }
}

下面配置幾個實用的例子,促進理解:

  • 靜態(tài)資源服務(wù)器:將 Nginx 配置為一個能提供靜態(tài)資源下載的服務(wù)器徒像,具體配置如下:

    1. 假設(shè)靜態(tài)資源存放位置為:/data/www经备,現(xiàn)在我們創(chuàng)建該目錄,并且放入一個index.html文件:
    $ sudo mkdir -p /data/www
    $ echo '<h>Hello Nginx</h1>' | sudo tee /data/www/index.html
    
    1. 配置 Nginx 靜態(tài)資源目錄為:/data/www
    # nginx.conf
    
    http {                      # http 模塊配置
        server {                # 虛擬主機配置
    
            location / {        # 路由映射:/
                root /data/www; # 靜態(tài)資源路徑
            }
        }
    }
    
    1. 上述簡單幾行配置浸卦,其實就已經(jīng)完成了靜態(tài)服務(wù)器功能了炉抒,但是還未生效僚稿,我們還需通過nginx -s reload命令來讓 Nginx 重新加載配置文件。

    2. 經(jīng)過以上步驟,此時瀏覽器訪問http://localhost/index.html结序,就可以看到index.html顯示的內(nèi)容了。

    :當訪問出錯的時候经磅,可以查看下日志:access.logerror.log,一個記錄了訪問日志,一個記錄了訪問出錯日志怜庸。這兩個日志的位置位于:/usr/local/nginx/logs/var/log/nginx

    :上述示例是極簡配置趣钱,以下配置與上述極簡配置功能一致您旁,但配置內(nèi)容相對全面,更好理解。具體配置步驟如下:

    1. 首先創(chuàng)建一個普通用戶用于執(zhí)行 Nginx 進程厅目,假設(shè)該新用戶為:nginx墓塌,所屬組為:www,創(chuàng)建方式如下:
    # 創(chuàng)建用戶 nginx催蝗,-d:指定用戶主目錄 -m:當用戶主目錄不存在時,創(chuàng)建主目錄
    $ sudo useradd -d /home/nginx -m nginx  # 也可直接使用 sudo useradd nginx
    # 創(chuàng)建組 www
    $ sudo groupadd www
    # 將用戶 nginx 添加進組 www迂苛,-a:append 到組(不刪除本身所屬組)-G {groupname} username
    $ sudo usermod -a -G www nginx
    # 查看用戶 nginx 信息
    $ id nginx
    
    1. 配置文件配置如下內(nèi)容:
    user nginx www;                             # 以 www 組的用戶 nginx 運行
    worker_processes  1;                        # 工作進程數(shù)
    
    # 錯誤日志
    # error_log  logs/error.log;
    # error_log  logs/error.log  notice;
    # error_log  logs/error.log  info;
    
    # pid        logs/nginx.pid;
    
    
    events {                                    # 事件模塊
        worker_connections  1024;               # 工作進程連接數(shù)
    }
    
    
    http {                                      # http 模塊配置
        include       mime.types;               # include:表示導入配置文件 mime.types
        default_type  application/octet-stream; # response 的默認 MIME 類型
    
        sendfile        on;                     # 啟動高效傳輸文件模式
    
        keepalive_timeout  65;                  # 保持連接時間
    
        # gzip  on;
    
        server {                                # 虛擬主機配置
    
            listen 80;                          # 監(jiān)聽的 http 端口號(默認為 80)
            server_name  localhost;             # 虛擬主機對應(yīng)的域名/ip
    
            location / {                        # 路由映射:/
                root /data/www;                 # 靜態(tài)資源路徑
                index  index.html index.htm;    # 訪問根目錄對應(yīng)的默認請求文件
            }
    
            location /images/ {                 # 路由映射:/images/
                root /data/;                    # 靜態(tài)資源路徑
            }
    
            #error_page  404 /404.html;
    
            # redirect server error pages to the static page /50x.html
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    

    這里面我們主要來講一下location的配置選項爷恳,因為location的配置可能咋看起來沒問題魂务,但實際運行卻一直無法訪問纯陨,因此這里需要著重介紹下:

    location的作用是配置請求 URI量愧。Nginx 會從請求的 URI 中的path路徑解析到其對應(yīng)的location紊馏,然后從該location指定的配置中獲取到請求資源的真實路徑...其格式如下:

    Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
            location @name { ... }
    Default:    —
    Context:    server, location
    

    location 的路由映射是由:前綴 + 路由字符串 組合而成沛慢。從 location 的語法知道,其 前綴 字符有 4 種:

    • =:表示精確匹配(原意匹配)她按。
    • ~:表示正則匹配區(qū)分大小寫衰琐。
    • ~*:表示正則匹配不區(qū)分大小寫斗搞。
    • ^~:表示普通字符串匹配(原意匹配)
    • @:定義一個命名 location狞山,用于內(nèi)部重定向(@用于命名當前 location驳遵,不是前綴)来庭。

    從上述描述可以看到厉萝,location 的前綴中蚪缀,只有~廉油、~*會執(zhí)行正則匹配眨猎,這里我們將其稱之為 正則匹配汁果;
    =赡译、^~以及無任何前綴的都按原意進行匹配(不執(zhí)行正則匹配)成畦,我們將之稱其為 普通匹配跛梗。

    • 匹配規(guī)則:對于普通匹配,其遵循以下兩個規(guī)則:

      • URI 前綴匹配:只要請求 URI 前綴含有當前 location 指定的 URI,則匹配成功妇斤。

      • URI 最長匹配:請求 URI 優(yōu)先匹配指定了最長 URI 的 location。比如:

        location = /images/ {...}             # location A
        location  /images/ {...}              # location B
        location ^~ /images/volleyball/ {...} # location C
        

        如果此時請求為:http://localhost/images/素挽,則匹配前綴為=的 location旨袒,即 location A。
        如果此時請求為:http://localhost/images/voleeyball/..闸与,由于 location B 和 location C 同時滿足匹配請求 URI,但是 location C 指定的 URI 比 location B 更長廷臼,因此最終的匹配為 location C(優(yōu)先選擇最長匹配)。

        =執(zhí)行的是精確匹配,因此只能匹配對根目錄的請求。而^~執(zhí)行的單純的原意匹配,會遵頊最長匹配規(guī)則墩蔓,因此后面可攜帶子路徑。

    • 匹配順序:Nginx 會先進行普通匹配盒让,然后再執(zhí)行正則匹配彤路。具體過程如下:

      1. 先執(zhí)行精確匹配(=)裁蚁,如果找到管削,匹配完成塞弊,停止搜索咒精。
      2. 對帶前綴修飾符^~和未帶前綴修飾符的 location 進行匹配权旷,如果找到最長匹配,且最長匹配 location 帶有前綴^~,則匹配完成,停止搜索。否則速址,記錄該匹配。
      3. 對前綴~~*的 location 進行匹配(以配置文件聲明的順序依次進行匹配)舶胀,找到第一個匹配時弥臼,則匹配完成,停止搜索。
      4. 如果第 3 步匹配失敗剪廉,則結(jié)果為第 2 步的匹配結(jié)果队贱。

      :上述過程中杨赤,第 1干茉,2 步為普通匹配跑筝,第 3 步為正則匹配。

      舉個例子:

      server {
      
          listen 80;
          server_name  localhost;
      
          default_type text/html;                 # 響應(yīng)默認返回類型
      
          location / {                            # location A
              return 200 A;
          }
      
          location = /images/ {                   # location B
              return 200 B;
          }
      
          location /images/volleyball/test {      # location C
              return 200 C;
          }
          location /images/volleyball/test.html { # location D
              return 200 D;
          }
      
          location /images/volleyball/ {          # location E
              return 200 E;
          }
          location ^~ /images/volleyball/te {     # location F
              return 200 F;
          }
      
          location ~ /images/volleyball/te {      # location G
              return 200 G;
          }
      }
      

      以下分幾種情況進行請求:

      • curl localhost/images/:精確匹配,結(jié)果為B

      • curl localhost/images/xxx:過程如下:

        1. 精確匹配:/images/降盹,不滿足
        2. 帶前綴^~和普通未帶前綴的正則匹配:images/volleball/te剑辫,/产园,/images/volleyball/test募寨,/images/volleyball/test.html/images/volleyball/森缠,都沒有最長匹配(即都不包含請求全路徑/images/xxx
        3. ~/~*進行匹配:/images/volleyball/te拔鹰,不匹配
        4. 對未帶前綴的正則進行匹配,只有 location A 滿足贵涵,所以結(jié)果為A
      • curl localhost/images/volleyball/xxx:過程如下:

        1. 同上列肢,不匹配
        2. 同上,得到最長匹配為 location E宾茂,沒有帶前綴^~瓷马,則記錄 location E 即可
        3. 進行前綴~/~*匹配,不滿足
        4. 由于第 3 步匹配不到跨晴,故結(jié)果為第 2 步的最長匹配:location E欧聘,所以結(jié)果為E
      • curl localhost/images/volleyball/tes:過程如下:

        1. 同上,不匹配
        2. 同上端盆,得到的最長匹配為:location F怀骤,因為該最長匹配的 location 帶有前綴^~,因此結(jié)果為F焕妙,搜索結(jié)束
      • curl localhost/images/volleyball/test:過程如下:

        1. 同上蒋伦,不匹配
        2. 同上,location C 為最長匹配焚鹊,未帶前綴^~痕届,保留記錄
        3. 進行前綴~/~*匹配,location G 匹配,結(jié)果為G
      • curl localhost/images/volleyball/testxxx:過程如下:

        1. 同上研叫,不匹配
        2. 同上势决,location C 為最長匹配,未帶前綴^~蓝撇,保留記錄
        3. 進行前綴~/~*匹配,location G 匹配陈莽,結(jié)果為G
      • curl localhost/images/volleyball/test.html

        1. 同上渤昌,不匹配
        2. 同上,location D 為最長匹配走搁,未帶前綴^~独柑,保留記錄
        3. 進行前綴~/~*匹配,location G 匹配私植,結(jié)果為G

    然后 location 內(nèi)部用于指定路由對應(yīng)的實際目錄有如下兩個指令:

    • root:設(shè)置路由映射的根目錄忌栅,比如:
    location /i/ {
        root /data/www;
    }
    

    當我們請求/i/1.jpg的時候,對應(yīng)的資源的實際路徑就為:/data/www/i/1.jpg曲稼,這里需要注意的一個點就是請求攜帶的資源路徑必須存在root指定的目錄下索绪,比如當前這個例子的請求 URI 的path/i/1.jpg,因此/data/www內(nèi)就必須對應(yīng)有一個子目錄i贫悄,其內(nèi)有一張圖片1.jpg瑞驱,也即:/data/www/i/1.jpg。也即:請求資源實際路徑 = root+location

    • alias:使用root指定的資源目錄窄坦,請求路徑必須存在于root指定的目錄中唤反,資源是相對于root指定的路徑的。如果請求 URI 需要進行變動鸭津,則應(yīng)當使用alias指令來將請求path映射到一個絕對路徑彤侍,比如:
    location /i/ {
        alias /data/www/images/; # alias 必須以 / 結(jié)尾,表示一個目錄
    }
    

    當我們請求/i/1.jpg時逆趋,實際對應(yīng)的資源路徑為:/data/www/images/1.jpg盏阶,可以看到,不再是相對于root目錄闻书,而是使用了絕對路徑般哼。簡單理解就是:請求資源路徑 = alias路徑替換location

  • 正向代理服務(wù)器:Nginx 中一個最常見的場景之一就是將其作為代理服務(wù)器,可以將客戶端的請求轉(zhuǎn)發(fā)到目標服務(wù)器惠窄,再將結(jié)果轉(zhuǎn)發(fā)給到客戶端蒸眠,讓客戶端不必直接訪問目標網(wǎng)站也能訪問網(wǎng)站內(nèi)容。其具體配置如下所示:

    http {                                              # http 模塊配置
        ...
        server {                                        # 代理服務(wù)器
            resolver 114.114.114.114;                   # 指定DNS服務(wù)器IP地址
            listen 80;
            server_name localhost;
    
            location / {
                proxy_pass $scheme://$host$request_uri; # 正向代理杆融,轉(zhuǎn)發(fā)到目標服務(wù)器
            }
        }
    }
    

    上述代碼中我們配置了一個 HTTP 代理服務(wù)器http://localhost:80楞卡,它會將客戶端請求轉(zhuǎn)發(fā)給到目標服務(wù)器,$scheme://$host$request_uri就是目標服務(wù)器地址(網(wǎng)址),這里以$開頭的字符串是 Nginx 內(nèi)置的變量蒋腮,可用于獲取請求的一些信息淘捡,更多變量內(nèi)容,請查看:Nginx 內(nèi)置變量池摧。
    此時焦除,我們可以通過curl指令指定代理代理服務(wù)器訪問目標網(wǎng)址:

    $ curl -I --proxy http://localhost:80 http://www.baidu.com             # 請求成功后,可以看到響應(yīng)頭`Server: nginx/1.18.0`作彤,表示我們的確是通過 Nginx 代理進行訪問的
    

    :Nginx 默認不支持正向代理 HTTPS 請求膘魄,但是我們可以通過添加第三方模塊 ngx_http_proxy_connect_module 來使能 HTTPS 正向代理。
    具體搭建步驟如下所示:

    1. 下載擴展模塊:如下所示:
    $ cd /usr/local/src
    $ git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
    
    1. 安裝 pathch:如下所示:
    $ sudo apt install patch
    
    1. 選擇補丁包:根據(jù)自己 Nginx 的版本選擇合適的補丁包竭讳,對應(yīng)版本請查詢:[select-patch]
    $ patch -p1 < /usr/local/src/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch
    
    1. 安裝擴展模塊到 Nginx:如下所示:
    $ cd /usr/local/src/nginx-1.18.0
    $ sudo ./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-pcre=/usr/local/src/pcre-8.44        \
    --with-zlib=/usr/local/src/zlib-1.2.11      \
    --with-openssl=/usr/local/src/openssl-1.1.1g \
    --add-module=/usr/local/src/ngx_http_proxy_connect_module
    $ sudo make j4
    $ sudo make install
    

    以上创葡,就完成了第三方擴展模塊 ngx_http_proxy_connect_module 的安裝。

    下面就可以配置 Nginx 支持 HTTPS 正向代理绢慢,如下所示:

    server  {
        resolver 114.114.114.114; # DNS 服務(wù)器可根據(jù)實際情況單獨配置
        listen 80;
        server_name localhost;
        default_type text/html;
    
        underscores_in_headers on;
    
        proxy_connect;
        proxy_connect_allow all;
        proxy_connect_connect_timeout 10s;
        proxy_connect_read_timeout 10s;
        proxy_connect_send_timeout 10s;
    
        location / {
            proxy_pass $scheme://$host$request_uri; # 正向代理灿渴,轉(zhuǎn)發(fā)到目標服務(wù)器
        }
    }
    

    重新加載 Nginx 后,訪問 HTTPS 應(yīng)該就可以成功了胰舆,如下所示:

    $ curl -X GET 'https://www.baidu.com' --proxy 'http://localhost:80' -i
    

    關(guān)于 Nginx 無法直接支持 HTTPS 正向代理的具體原因骚露,可參考:使用 Nginx 搭建 HTTPS 正向代理服務(wù)

  • 反向代理服務(wù)器:反向代理就是將客戶端請求轉(zhuǎn)發(fā)到后臺應(yīng)用服務(wù)器集群中的一個進行處理,其具體配置如下:

    
    http {                                        # http 模塊配置
        ...
        server {                                  # 目標服務(wù)器
            listen 8080;
            root /data/realweb/;                  # 這里直接將 root 設(shè)置到 server 塊中缚窿,表示該 server 塊中所有 location 默認使用該 root荸百,
                                                  # location 內(nèi)部配置了 root 會覆蓋此處的 root
    
            default_type text/html;               # 響應(yīng)默認返回類型
    
            location / {
                return 200 "chosen to handler requests in cluster";
            }
        }
    
        server {                                  # 反向代理服務(wù)器
            listen 80;
            server_name localhost;
    
            location / {
                proxy_pass http://localhost:8080; # 反向代理配置,轉(zhuǎn)發(fā)到 8080 端口
                proxy_set_header  Host $http_host;
                proxy_set_header  X-Real-IP  $remote_addr;
                proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header  X-Forwarded-Proto $scheme;
            }
        }
    }
    

    其實反向代理的配置和正向代理的配置都是采用proxy_pass指令滨攻,兩者的配置形式上幾乎是一樣的够话,只是在概念上存在區(qū)別:正向代理知道要訪問的目標服務(wù)器地址,但是無法直接訪問光绕,因此通過代理進行訪問女嘲,而 Nginx 需要通過內(nèi)置變量提取出目標服務(wù)器地址,進行訪問诞帐;而反向代理可以直接訪問目標服務(wù)器欣尼,只是不知道具體進行請求處理的是哪一個應(yīng)用服務(wù)器,但對 Nginx 而言停蕉,就需要具體對集群服務(wù)器進行配置了愕鼓。

  • 動靜分離:動靜分離 其實與 反向代理 在配置上異曲同工,只不過 動靜分離 把請求識別為對靜態(tài)資源和動態(tài)資源的請求慧起,對于靜態(tài)資源的請求宪肖,Nginx 會直接響應(yīng)這些請求锰霜,對于動態(tài)資源西雀,Nginx 會扮演代理角色车份,將請求轉(zhuǎn)發(fā)給到對應(yīng)的應(yīng)用服務(wù)器驻子。具體配置如下:

    http {                                        # http 模塊配置
        ...
        server {                                  # 目標服務(wù)器
            listen 8080;
            server_name  localhost;
            root /data/realweb/;                  # 這里直接將 root 設(shè)置到 server 塊中,表示該 server 塊中所有 location 默認使用該 root估灿,
                                                  # location 內(nèi)部配置了 root 會覆蓋此處的 root
    
            default_type text/html;               # 響應(yīng)默認返回類型
    
            location / {
                return 200 "dynamic content";
            }
        }
    
        server {                                  # 代理服務(wù)器
            listen 80;
            server_name  localhost;
    
            location / {                          # 動態(tài)請求
                proxy_pass http://localhost:8080; # 代理崇呵,轉(zhuǎn)發(fā)請求給到 http://localhost:8080
            }
    
            location ~ \.(gif|jpg|png)$ {         # 靜態(tài)資源請求
                root /data/images/;               # 圖片靜態(tài)資源目錄
            }
        }
    }
    

    這里localhost:80的服務(wù)器作為動靜分離服務(wù)器,對于靜態(tài)資源\.(gif|jpg|png)$的請求馅袁,直接進行響應(yīng)域慷。對于其他請求,代理給到目標服務(wù)器localhost:8080汗销。

  • 負載均衡:當我們網(wǎng)站的并發(fā)量比較大的時候犹褒,這時候可能就需要搭建服務(wù)器集群,然后采用 負載均衡 分攤服務(wù)器集群壓力大溜。具體配置如下:

    http { 
        ...
        upstream localserver { # 集群服務(wù)器
            # 默認采用輪詢機制
            server 1xx.2x.1xx.2xx:9000; # 遠程服務(wù)器一
            server 1xx.2x.1xx.2xx:9001; # 遠程服務(wù)器二
        }
    
        server { # 網(wǎng)站
            listen 8080;
            server_name localhost;
    
            location / {
            proxy_pass http://localserver; # 請求轉(zhuǎn)向集群 localserver
            }
        }
    }
    

    這里我們采用upstream定義服務(wù)器集群,內(nèi)部我配置了兩個遠程服務(wù)器估脆,Nginx 默認采用的集群策略是輪詢機制钦奋,即第一次請求分發(fā)到第一臺服務(wù)器,第二次請求分發(fā)到第二臺服務(wù)器...以此類推疙赠。然后對我們的網(wǎng)站采用了proxy_pass將請求反向代理到了upstream定義的集群付材,現(xiàn)在,進行如下訪問:

    $ curl http://localhost:8080 # 9000 端口的服務(wù)器會響應(yīng)
    $ curl http://localhost:8080 # 9001 端口的服務(wù)器會響應(yīng)
    

    :負載均衡策略有很多種圃阳,比如 輪詢厌衔、權(quán)重ip_hash捍岳、fair富寿、url_hash...這里就不進行展開了。

  • Nginx 支持 HTTPS 傳輸:Nginx 可以配置開啟 HTTPS 服務(wù)锣夹,具體配置如下:

    server {
        #ssl參數(shù)
        listen              443 ssl;
        server_name         example.com;
        #證書文件
        ssl_certificate     example.com.crt;
        #私鑰文件
        ssl_certificate_key example.com.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        #...
    }
    

    上述配置中页徐,私鑰文件*.key和證書文件*.crt可以通過openssl命令生產(chǎn),比如:

    # C:Country 银萍,單位所在國家变勇,為兩位數(shù)的國家縮寫,如: CN 就是中國
    # ST 字段: State/Province 贴唇,單位所在州或省
    # L 字段: Locality 搀绣,單位所在城市 / 或縣區(qū)
    # O 字段: Organization ,此網(wǎng)站的單位名稱;
    # OU 字段: Organization Unit戳气,下屬部門名稱;也常常用于顯示其他證書相關(guān)信息链患,如證書類型,證書產(chǎn)品名稱或身份驗證類型或驗證內(nèi)容等;
    # CN 字段: Common Name 瓶您,網(wǎng)站的域名;
    
    openssl req -new -newkey rsa:2048 -sha256 -nodes -out example_com.csr -keyout example_com.key -subj "/C=CN/ST=ShenZhen/L=ShenZhen/O=Example Inc./OU=Web Security/CN=example.com"
    

    上述命令生產(chǎn)的證書文件*.crt還需要相關(guān) CA 機構(gòu)進行簽署锣险,成功后會得到一個新的證書文件蹄皱,然后才可以在 Nginx 中配置 HTTPS 服務(wù)。
    網(wǎng)上有證書的免費申請方式芯肤,這里就不加贅述了巷折。

附錄

這是在網(wǎng)上看到的一份比較詳細的 Nginx 配置文件釋義:

#安全問題,建議用nobody,不要用root.
#user  nobody;

#worker數(shù)和服務(wù)器的cpu數(shù)相等是最為適宜
worker_processes  4;

#work綁定cpu(4 work綁定4cpu) 這個配置項目前在我本機上有問題崖咨,先注釋掉
#worker_cpu_inffinity 0001 0010 0100 1000

#work綁定cpu (4 work綁定8cpu中的4個) 锻拘。
worker_cpu_inffinity 0000001 00000010 00000100 00001000

#全局錯誤日志定義類型,[debug | info | notice | warn | error | crit]
#error_log  /data/nginx/logs/error.log;
#error_log  /data/nginx/logs/error.log  notice;

#日志文件存放路徑 access_log path [format [buffer=size | off]]
access_log /data/nginx/logs/lazyegg.com/web/access.log combinedio;

#進程pid文件
#pid        logs/nginx.pid;

#指定進程可以打開的最大描述符:數(shù)目
#工作模式與連接數(shù)上限
##這個指令是指當一個nginx進程打開的最多文件描述符數(shù)目击蹲,理論值應(yīng)該是最多打開文件數(shù)(ulimit -n)與nginx進程數(shù)相除署拟,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致歌豺。
#這是因為nginx調(diào)度時分配請求到進程并不是那么的均衡推穷,所以假如填寫10240,總并發(fā)量達到3-4萬時就有進程可能超過10240了类咧,這時會返回502錯誤馒铃。
worker_rlimit_nofile 65535;

#################################  events  ###############################
events {
    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    use epoll
    #單個進程最大連接數(shù)(最大連接數(shù)=連接數(shù)+進程數(shù))
    worker_connections  1024;
    
    #keepalive 超時時間
    keepalive_timeout 60;
    
    #客戶端請求頭部的緩沖區(qū)大小痕惋。
    client_header_buffer_size 4k;
    
    #這個將為打開文件指定緩存区宇,默認是沒有啟用的,max指定緩存數(shù)量值戳,建議和打開文件數(shù)一致议谷,inactive是指經(jīng)過多長時間文件沒被請求后刪除緩存。
    open_file_cache max=65535 inactive=60s;
    #這個是指多長時間檢查一次緩存的有效信息堕虹。
    open_file_cache_valid 80s;
        #open_file_cache指令中的inactive參數(shù)時間內(nèi)文件的最少使用次數(shù)卧晓,如果超過這個數(shù)字,文件描述符一直是在緩存中打開的赴捞,如上例禀崖,如果有一個文件在inactive時間內(nèi)一次沒被使用,它將被移除螟炫。
    open_file_cache_min_uses 1;
    
    #語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤.
    open_file_cache_errors on;
}

##############################   http    ##################################

#設(shè)定http服務(wù)器波附,利用它的反向代理功能提供負載均衡支持
http{
    #文件擴展名與文件類型映射表
    include mime.types;
    
    #默認文件類型
    default_type application/octet-stream;
    
    #默認編碼
    charset utf-8;
    
    #服務(wù)器名字的hash表大小
    server_names_hash_bucket_size 128;
    
    #客戶端請求頭部的緩沖區(qū)大小。
    client_header_buffer_size 32k;
    
    #客戶請求頭緩沖大小昼钻。
    large_client_header_buffers 4 64k;
    
    #允許客戶端請求的最大單個文件字節(jié)數(shù)
    client_max_body_size 8m;
    
    #開啟高效文件傳輸模式掸屡,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來輸出文件,對于普通應(yīng)用設(shè)為 on然评,如果用來進行視頻下載等應(yīng)用磁盤IO重負載應(yīng)用仅财,可設(shè)置為off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度碗淌,降低系統(tǒng)的負載盏求。注意:如果圖片顯示不正常把這個改成off抖锥。
    sendfile on;
    
    #開啟目錄列表訪問,適合下載服務(wù)器碎罚,默認關(guān)閉磅废。
    autoindex on;
    
    #此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
    tcp_nopush on;
     
    tcp_nodelay on;
    
    #長連接超時時間荆烈,單位是秒
    keepalive_timeout 120;
    
    #FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用拯勉,提高訪問速度。下面參數(shù)看字面意思都能理解憔购。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    
    #gzip模塊設(shè)置
    gzip on; #開啟gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩沖區(qū)
    gzip_http_version 1.0; #壓縮版本(默認1.1宫峦,前端如果是squid2.5請使用1.0)
    gzip_comp_level 2;     #壓縮等級
    gzip_types text/plain application/x-javascript text/css application/xml;    #壓縮類型,默認就已經(jīng)包含textml玫鸟,所以下面就不用再寫了导绷,寫上去也不會有問題,但是會有一個warn屎飘。
    gzip_vary on;

    #開啟限制IP連接數(shù)的時候需要使用
    #limit_zone crawler $binary_remote_addr 10m;
    
        #負載均衡配置
    upstream lazyegg.net {
  
        #upstream的負載均衡妥曲,weight是權(quán)重,可以根據(jù)機器配置定義權(quán)重枚碗。weigth參數(shù)表示權(quán)值逾一,權(quán)值越高被分配到的幾率越大铸本。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

        #nginx的upstream目前支持4種方式的分配
        #1肮雨、輪詢(默認)
        #每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉箱玷,能自動剔除怨规。
        #2、weight
        #指定輪詢幾率锡足,weight和訪問比率成正比波丰,用于后端服務(wù)器性能不均的情況。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2舶得、ip_hash
        #每個請求按訪問ip的hash結(jié)果分配掰烟,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題沐批。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3纫骑、fair(第三方)
        #按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配九孩。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4先馆、url_hash(第三方)
        #按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器躺彬,后端服務(wù)器為緩存時比較有效煤墙。
        #例:在upstream中加入hash語句梅惯,server語句中不能寫入weight等其他的參數(shù),hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}

        #tips:
        #upstream bakend{#定義負載均衡設(shè)備的Ip及設(shè)備狀態(tài)}{
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        #}
        #在需要使用負載均衡的server中增加 proxy_pass http://bakend/;

        #每個設(shè)備的狀態(tài)設(shè)置為:
        #1.down表示單前的server暫時不參與負載
        #2.weight為weight越大仿野,負載的權(quán)重就越大铣减。
        #3.max_fails:允許請求失敗的次數(shù)默認為1.當超過最大次數(shù)時,返回proxy_next_upstream模塊定義的錯誤
        #4.fail_timeout:max_fails次失敗后设预,暫停的時間徙歼。
        #5.backup:其它所有的非backup機器down或者忙的時候,請求backup機器鳖枕。所以這臺機器壓力會最輕魄梯。

        #nginx支持同時設(shè)置多組的負載均衡,用來給不用的server來使用宾符。
        #client_body_in_file_only設(shè)置為On 可以講client post過來的數(shù)據(jù)記錄到文件中用來做debug
        #client_body_temp_path設(shè)置記錄文件的目錄 可以設(shè)置最多3層目錄
        #location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
    }
    
       #虛擬主機的配置
    server {
        #監(jiān)聽端口
        listen 80;

        #域名可以有多個酿秸,用空格隔開
        server_name lazyegg.net;
        #默認入口文件名稱
        index index.html index.htm index.php;
        root /data/www/lazyegg;

        #對******進行負載均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #圖片緩存時間設(shè)置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS緩存時間設(shè)置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式設(shè)定
        #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
        #$remote_user:用來記錄客戶端用戶名稱魏烫;
        #$time_local:用來記錄訪問時間與時區(qū)辣苏;
        #$request:用來記錄請求的url與http協(xié)議;
        #$status:用來記錄請求狀態(tài)哄褒;成功是200稀蟋,
        #$body_bytes_sent :記錄發(fā)送給客戶端文件主體內(nèi)容大小呐赡;
        #$http_referer:用來記錄從那個頁面鏈接訪問過來的退客;
        #$http_user_agent:記錄客戶瀏覽器的相關(guān)信息;
        #通常web服務(wù)器放在反向代理的后面链嘀,這樣就不能獲取到客戶的IP地址了萌狂,通過$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址。反向代理服務(wù)器在轉(zhuǎn)發(fā)請求的http頭信息中怀泊,可以增加x_forwarded_for信息茫藏,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務(wù)器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定義本虛擬主機的訪問日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #對 "/connect-controller" 啟用反向代理
        location /connect-controller {
            proxy_pass http://127.0.0.1:88; #請注意此處端口號不能與虛擬主機監(jiān)聽的端口號一樣(也就是server監(jiān)聽的端口)
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置霹琼,可選务傲。
            proxy_set_header Host $host;

            #允許客戶端請求的最大單文件字節(jié)數(shù)
            client_max_body_size 10m;

            #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù),
            #如果把它設(shè)置為比較大的數(shù)值枣申,例如256k售葡,那么,無論使用firefox還是IE瀏覽器糯而,來提交任意小于256k的圖片天通,都很正常。如果注釋該指令熄驼,使用默認的client_body_buffer_size設(shè)置像寒,也就是操作系統(tǒng)頁面大小的兩倍烘豹,8k或者16k,問題就出現(xiàn)了诺祸。
            #無論使用firefox4.0還是IE8.0携悯,提交一個比較大,200k左右的圖片筷笨,都返回500 Internal Server Error錯誤
            client_body_buffer_size 128k;

            #表示使nginx阻止HTTP應(yīng)答代碼為400或者更高的應(yīng)答憔鬼。
            proxy_intercept_errors on;

            #后端服務(wù)器連接的超時時間_發(fā)起握手等候響應(yīng)超時時間
            #nginx跟后端服務(wù)器連接超時時間(代理連接超時)
            proxy_connect_timeout 90;

            #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時)
            #后端服務(wù)器數(shù)據(jù)回傳時間_就是在規(guī)定時間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)
            proxy_send_timeout 90;

            #連接成功后,后端服務(wù)器響應(yīng)時間(代理接收超時)
            #連接成功后_等候后端服務(wù)器響應(yīng)時間_其實已經(jīng)進入后端的排隊之中等候處理(也可以說是后端服務(wù)器處理請求的時間)
            proxy_read_timeout 90;

            #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小
            #設(shè)置從被代理服務(wù)器讀取的第一部分應(yīng)答的緩沖區(qū)大小胃夏,通常情況下這部分應(yīng)答中包含一個小的應(yīng)答頭轴或,默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區(qū)的大小,不過可以將其設(shè)置為更小
            proxy_buffer_size 4k;

            #proxy_buffers緩沖區(qū)仰禀,網(wǎng)頁平均在32k以下的設(shè)置
            #設(shè)置用于讀取應(yīng)答(來自被代理服務(wù)器)的緩沖區(qū)數(shù)目和大小照雁,默認情況也為分頁大小,根據(jù)操作系統(tǒng)的不同可能是4k或者8k
            proxy_buffers 4 32k;

            #高負荷下緩沖大写鸲瘛(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #設(shè)置在寫入proxy_temp_path時數(shù)據(jù)的大小饺蚊,預(yù)防一個工作進程在傳遞文件時阻塞太長
            #設(shè)定緩存文件夾大小,大于這個值悬嗓,將從upstream服務(wù)器傳
            proxy_temp_file_write_size 64k;
        }
        
        #本地動靜分離反向代理配置
        #所有jsp的頁面均交由tomcat或resin處理
        location ~ .(jsp|jspx|do)?$ {
            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://127.0.0.1:8080;
        }
    }
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末污呼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子包竹,更是在濱河造成了極大的恐慌燕酷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件映企,死亡現(xiàn)場離奇詭異悟狱,居然都是意外死亡静浴,警方通過查閱死者的電腦和手機堰氓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苹享,“玉大人双絮,你說我怎么就攤上這事〉梦剩” “怎么了囤攀?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宫纬。 經(jīng)常有香客問我焚挠,道長,這世上最難降的妖魔是什么漓骚? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任蝌衔,我火速辦了婚禮榛泛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘噩斟。我一直安慰自己曹锨,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布剃允。 她就那樣靜靜地躺著沛简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斥废。 梳的紋絲不亂的頭發(fā)上椒楣,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音牡肉,去河邊找鬼撒顿。 笑死,一個胖子當著我的面吹牛荚板,可吹牛的內(nèi)容都是我干的凤壁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跪另,長吁一口氣:“原來是場噩夢啊……” “哼拧抖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起免绿,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唧席,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘲驾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淌哟,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年辽故,在試婚紗的時候發(fā)現(xiàn)自己被綠了徒仓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡誊垢,死狀恐怖掉弛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喂走,我是刑警寧澤殃饿,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芋肠,受9級特大地震影響乎芳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一奈惑、第九天 我趴在偏房一處隱蔽的房頂上張望谬晕。 院中可真熱鬧,春花似錦携取、人聲如沸攒钳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽不撑。三九已至,卻和暖如春晤斩,著一層夾襖步出監(jiān)牢的瞬間焕檬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工澳泵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留实愚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓兔辅,卻偏偏與公主長得像腊敲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子维苔,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354