nginx學習總結

nginx

安裝

下載必要組件

  • nginx下載地址

    //nginx.org/en/download.html
    
  • pcre庫下載地址,nginx需要

    //sourceforge.net/projects/pcre/files/pcre/
    
  • zlib下載地址,nginx需要

    //www.zlib.net/
    
  • openssl下載地址,nginx需要

    //github.com/openssl/openssl
    

在同級目錄下,解壓安裝zlib、openssl、pcre

進入nginx目錄,進行配置安裝

./configure \
 --prefix=/usr/local/nginx \
 --with-http_ssl_module \
 --with-http_flv_module \
 --with-http_stub_status_module \
 --with-http_gzip_static_module \
 --with-pcre=../pcre-8.39 \
 --with-zlib=../zlib-1.2.8 \ 
 --with-openssl=../openssl-master

下面可直接複製粘貼

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=../pcre-8.39 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-master

編譯安裝

$ make && sudo make install

Nginx會被安裝在/usr/local/nginx目錄下(也可以使用參數–prefix=指定自己需要的位置), 安裝成功後 /usr/local/nginx 目錄下有四個子目錄分別是:conf、html、logs、sbin 。 其中 Nginx 的配置文件存放於 conf/nginx.conf, bin文件是位於 sbin 目錄下的 nginx 文件。 確保系統的 80 端口沒被其他程序佔用,運行 sbin/nginx 命令來啟動 Nginx,

啟動nginx

$sudo /usr/local/nginx/sbin/nginx
    #netstat -ano|grep 80
        tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      關閉 (0.00/0/0)
        unix  17     [ ]         數據報                10801    /dev/log

打開瀏覽器訪問此機器的 IP,如果瀏覽器出現 Welcome to nginx! 則表示 Nginx 已經安裝並運行成功

    # 檢查配置文件是否正確
    # /usr/local/sbin/nginx -t 
    # 可以看到編譯選項
    # /usr/local/sbin/nginx -V
    #重啟Nginx
    #sudo /usr/local/sbin/nginx -s reload
    #關閉Nginx
    #sudo /usr/local/sbin/nginx -s stop
    #優雅停止服務
    #sudo /usr/local/sbin/nginx -s quit
    #kill -s SIGQUIT pid_master
    #kill -s SIGWINCH pid_master

配置

nginx.conf配置文件,基本就分為以下幾塊:

main
events   {
  ....
}
http        {
  ....
  upstream myproject {
    .....
  }
  server  {
    ....
    location {
        ....
    }
  }
  server  {
    ....
    location {
        ....
    }
  }
  ....
}

nginx配置文件主要分為六個區域:

  • main(全局設置)
  • events(nginx工作模式)
  • http(http設置)
  • sever(主機設置)
  • location(URL匹配)
  • upstream(負載均衡服務器設置)

下面依次來看下具體內容

  • main模塊

下面時一個main區域,他是一個全局的設置:

user nobody nobody;
worker_processes 2;
error_log  /usr/local/var/log/nginx/error.log  notice;
pid        /usr/local/var/run/nginx/nginx.pid;
worker_rlimit_nofile 1024;

user 來指定Nginx Worker進程運行用戶以及用戶組,默認由nobody賬號運行。

worker_processes來指定了Nginx要開啟的子進程數。每個Nginx進程平均耗費10M~12M內存。根據經驗,一般指定1個進程就足夠了,如果是多核CPU,建議指定和CPU的數量一樣的進程數即可。我這裡寫2,那麼就會開啟2個子進程,總共3個進程。

error_log用來定義全局錯誤日誌文件。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。

pid用來指定進程id的存儲文件位置。

worker_rlimit_nofile用於指定一個nginx進程可以打開的最多文件描述符數目,這裡是65535,需要使用命令「ulimit -n 65535」來設置。

  • events 模塊

events模塊來用指定nginx的工作模式和工作模式及連接數上限,一般是這樣:

events {
    use epoll; #Linux平台
    worker_connections  1024;
}

use用來指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系統中,對於Linux系統,epoll工作模式是首選。

worker_connections用於定義Nginx每個進程的最大連接數,即接收前端的最大請求數,默認是1024。最大客戶端連接數由worker_processes和worker_connections決定,即Max_clients=worker_processes*worker_connections,在作為反向代理時,Max_clients變為:Max_clients = worker_processes * worker_connections/4。 進程的最大連接數受Linux系統進程的最大打開文件數限制,在執行操作系統命令「ulimit -n 65536」後worker_connections的設置才能生效。

  • http 模塊

http模塊可以說是最核心的模塊了,它負責HTTP服務器相關屬性的配置,它裏面的server和upstream子模塊,至關重要,等到反向代理和負載均衡以及虛擬目錄等會仔細說。

http{
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /usr/local/var/log/nginx/access.log  main;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  10;
    #gzip  on;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}

下面詳細介紹下這段代碼中每個配置選項的含義。

include 來用設定文件的mime類型,類型在配置文件目錄下的mime.type文件定義,來告訴nginx來識別文件類型。

default_type設定了默認的類型為二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置asp 的locate 環境時,Nginx是不予解析的,此時,用瀏覽器訪問asp文件就會出現下載了。

log_format用於設置日誌的格式,和記錄哪些參數,這裡設置為main,剛好用於access_log來紀錄這種類型。

main的類型日誌如下:也可以增刪部分參數。

127.0.0.1 - - [21/Apr/2015:18:09:54 +0800] "GET /index.php HTTP/1.1" 200 87151 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"

access_log

用來紀錄每次的訪問日誌的文件地址,後面的main是日誌的格式樣式,對應於log_format的main。

sendfile參數用於開啟高效文件傳輸模式。將tcp_nopush和tcp_nodelay兩個指令設置為on用於防止網絡阻塞。

keepalive_timeout設置客戶端連接保持活動的超時時間。在超過這個時間之後,服務器會關閉該連接。

  • server 模塊

sever 模塊是http的子模塊,它用來定一個虛擬主機,我們先講最基本的配置,這些在後面再講。

我們看一下一個簡單的server 是如何做的?

server {
        listen       8080;
        server_name  localhost 192.168.12.10 www.yangyi.com;
        # 全局定義,如果都是這一個目錄,這樣定義最簡單。
        root   /Users/yangyi/www;
        index  index.php index.html index.htm; 
        charset utf-8;
        access_log  usr/local/var/log/host.access.log  main;
        aerror_log  usr/local/var/log/host.error.log  error;
        ....
}

server標誌定義虛擬主機開始。

listen用於指定虛擬主機的服務端口。

server_name用來指定IP地址或者域名,多個域名之間用空格分開。

root 表示在這整個server虛擬主機內,全部的root web根目錄。注意要和locate {}下面定義的區分開來。

index 全局定義訪問的默認首頁地址。注意要和locate {}下面定義的區分開來。

charset用於設置網頁的默認編碼格式。

access_log用來指定此虛擬主機的訪問日誌存放路徑,最後的main用於指定訪問日誌的輸出格式。

  • location 模塊

location模塊是nginx中用的最多的,也是最重要的模塊了,什麼負載均衡啊、反向代理啊、虛擬域名啊都與它相關。慢慢來講:

location 根據它字面意思就知道是來定位的,定位URL,解析URL,所以,它也提供了強大的正則匹配功能,也支持條件判斷匹配,用戶可以通過location指令實現Nginx對動、靜態網頁進行過濾處理。像我們的php環境搭建就是用到了它。

我們先來看這個,設定默認首頁和虛擬機目錄。

location / {
            root   /Users/yangyi/www;
            index  index.php index.html index.htm;
        }

location /表示匹配訪問根目錄。

root指令用於指定訪問根目錄時,虛擬主機的web目錄,這個目錄可以是相對路徑(相對路徑是相對於nginx的安裝目錄)。也可以是絕對路徑。

  #反向代理配置
  location /itcast/ {
             proxy_pass //127.0.0.1:12345;
             proxy_set_header X-real-ip $remote_addr;
             proxy_set_header Host $http_host;
         }


  #採用uwsgi方式
  location /python/ {
             include uwsgi_params;
             uwsgi_pass 127.0.0.1:33333;
         }



    #訪問nginx本機目錄的文件
    location / {
            root   /home/itcast/xwp/itcast/;
            index  index.html index.htm;
        }

    location  /static/ {
             alias /var/static/;
        }
  • upstram 模塊

upstream 模塊負債負載均衡模塊,通過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡。我先學習怎麼用,具體的使用實例以後再說。

upstream test.com{
    ip_hash;
    server 192.168.123.1:80;
    server 192.168.123.2:80 down;
    server 192.168.123.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.123.4:8080;
}

在上面的例子中,通過upstream指令指定了一個負載均衡器的名稱test.com。這個名稱可以任意指定,在後面需要的地方直接調用即可。

裏面是ip_hash這是其中的一種負載均衡調度算法。

Nginx的負載均衡模塊目前支持4種調度算法:

  • weight 輪詢(默認)。每個請求按時間順序逐一分配到不同的後端服務器,如果後端某台服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。weight。指定輪詢權值,weight值越大,分配到的訪問機率越高,主要用於後端每個服務器性能不均的情況下。
  • ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端服務器,有效解決了動態網頁存在的session共享問題。
  • fair。比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊。
  • url_hash。按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,可以進一步提高後端緩存服務器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調度算法,必須安裝Nginx 的hash軟件包。

在HTTP Upstream模塊中,可以通過server指令指定後端服務器的IP地址和端口,同時還可以設定每個後端服務器在負載均衡調度中的狀態。常用的狀態有:

down,表示當前的server暫時不參與負載均衡。

backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這台機器的壓力最輕。

max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。

fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。

注意 當負載調度算法為ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。

備註: nginx的worker_rlimit_nofile達到上限時,再有客戶端鏈接報502錯誤. 用了log_format指令設置了日誌格式之後,需要用access_log指令指定日誌文件的存放路徑.

反向代理

正向代理,也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,於是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然後返回給我。 從網站的角度,只在代理服務器來取內容的時候有一次記錄,有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。結論就是,正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。

從用途上來講:

   正向代理的典型用途是為在防火牆內的局域網客戶端提供訪問Internet的途徑。
   正向代理還可以使用緩衝特性減少網絡使用率。反向代理的典型用途是將防火牆後面的服務器提供給Internet用戶訪問。
   反向代理還可以為後端的多台服務器提供負載平衡,或為後端較慢的服務器提供緩衝服務。
   另外,反向代理還可以啟用高級URL策略和管理技術,從而使處於不同web服務器系統的web頁面同時存在於同一個URL空間下。

反向代理服務器的基本配置

  1. proxy_pass

        proxy_pass URL;
        配置塊 location if
        此配置將當前請求代理到URL參數指定的服務器上,URL可以是主機名或者IP地址加PORT的形式
        proxy_pass //localhost:8000;
        也可以結合負載均衡實用<負載均衡會說明這種情況>
        也可以吧HTTP轉換成HTTPS
        proxy_pass //192.168.0.1;
        默認情況反向代理不轉發請求中的Host頭部,如果需呀設置抓發頭部
            則 proxy_set_header Host $host;
    
  2. proxy_method

        proxy_method method_name;
        配置塊 http server location
        此配置項表示轉發時的協議方法名:
            proxy_method POST;
        那麼客戶端發來的GET請求在轉發時方法改為POST;
    
  3. proxy_hide_header

        proxy_hide_header header1;
        配置塊 http server location;
        Nginx會將上游服務器的響應轉發給客戶端,但默認不轉發HTTP頭部字段(Date Server X-Pad X-Accel-* )
        使用proxy_hide_header可以指定任意頭部不能被轉發
        proxy_hide_header Cache-Control;
        proxy_hide_header MicrosoftOfficeWebServer;
    
  4. proxy_pass_header

        proxy_pass_header header1;
        配置塊 http server location
        功能與 proxy_hide_header相反,是設置哪些頭部允許轉發.
        proxy_pass_header X-Accel-Redirect;
    
  5. proxy_pass_request_body

        proxy_pass_request_body off|on;
        默認 on
        配置塊 http server location;
        確定上游服務器是否向上游服務器轉發HTTP包體
    
  6. proxy_pass_request_header

        proxy_pass_request_header on | off;
        默認on
        配置塊 http server location
        確定是否轉發HTTP頭部
    
  7. proxy_redirect

        proxy_redirect [default | off |redirect |replacement]
        默認default
        配置塊 http server location
        當上游服務響應時重定向或刷新(HTTP 301 302),proxy_redirect可以重設HTTP頭部的location或refresh字段
    
        proxy_redirect //locahost:8000/two/ //frontend/one/;
        上游響應302,location是URI是//locahost:8000/two/some/uri/
        那是實際轉發給客戶端的是 //frontend/one/some/uri/;
        可以使用前面提到的ngx_http_core_module模塊提供的變量 
        proxy_redirect //locahost:8000/two/ //$host:server_port/;
        可以省略replacement參數的主機名部分,這時候用虛擬主機名填充
        proxy_redirect //locahost:8000/two/ /one/;
    
        使用off參數的時候,將使location和refresh的字段維持不變
        proxy_redirect off;
    
        如果使用的 proxy_redirect default;
        下面兩種配置是等效的
            location /{
                proxy_pass //upstream:port/two/;
                proxy_redirect default;
            }
            location /{
                proxy_pass //upstream:port/two/;
                proxy_redirect //upstream:port/two/ /one/;
            }
    
  8. proxy_next_upstream

        proxy_next_upstream [error |timeout |invalid_header |http_500 |http_502~504 |http_404 | off]
        默認 proxy_next_upstream error timeout;
        配置塊 http server location
    
        此配置表示上游一台服務器轉發請求出現錯誤時,繼續換一套服務器處理這個請求
        其參數用來說明在那些情況下繼續選擇下一台上游服務器轉發請求.
        error 向上游發起連接 發送請求 讀取響應時出錯
        timeout 發送請求或讀取響應時出錯
        invalid_header 上游服務器發送的響應時不合法
        http_500 上游響應500
        http_502 上游響應502
        http_503 上游響應503
        http_504 上游響應504
        http_404 上游響應404
        off      關閉proxy_next_upstream功能 只要一出錯就選擇另外一台上游再次出發
    Nginx反向代理模塊中還提供很多配置,如設置連接的超時時間,臨時文件如何存儲,如何緩存上游服務器響應等功能.
    

可以通過閱讀 ngx_http_proxy_module了解更多詳細情況

            #sudo vim /usr/local/nginx/conf/nginx.conf 

            server {
                listen       80;
                server_name  localhost;
                location / {
                #保證代理機器能訪問到 下面的機器並裝有nginx  在主機號為100的機器上有響應網頁
                proxy_pass //192.168.1.100;
                root   html;
                index  index.html index.htm;
                }
            }
            sudo /usr/local/nginx/sbin/nginx -s reload

加一些判斷條件 獲取到 對方請求的主機 防止別人代理到自己的主機上

負載均衡

負載均衡是由多台服務器以對稱的方式組成一個服務器集合,每台服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助。通過某種負載分擔技術,將外部發送來的請求按照事先設定分配算法分配到對稱結構中的某一台服務器上,而接收到請求的服務器獨立地回應客戶的請求。

均衡負載能夠平均分配客戶請求到服務器列陣,籍此提供快速獲取重要數據,解決大量並發訪問服務問題。

  1. upstream塊

    upstream name {...}
    配置塊 http
    upstream塊定義一個上游服務器的集群,便於反向代理中的proxy_pass使用
    
    upstream mynet{
        server www.wopai1.com;
        server www.wopai2.com;
        server www.wopai3.com;
    }
    server {
        location /{
            proxy_pass //mynet;
        }
    }
    
  2. server

    server name [paramenters]
    配置塊upstream
    server配置項指定了一台上游服務器的名字,可以是域名 IP地址端口 UNIX句柄
    weight= number;設置向這台服務器轉發的權重,默認為1
    max_fails=number;該選項域fail_timeout配合使用
            指在fail_timeout時間段內如果轉發上游失敗超過number次就認為當前的fail_timeout時間內
            這台服務器不可用,max_fails默認為1 如果設置為0 表示不檢查失敗次數
    fail_timeout=time; fail_timeout表示該時間內轉發多少次失敗後就認為上游不可用.默認10s
    down    表示上游服務器永久下線,只能在ip_hash配置時才有效
    backup  在ip_hash配置時無效.只有所有非備份機都失敗,才向上游備份服務器轉發請求.
    upstream mynet{
        server www.wopai1.com weight=5;
        server www.wopai2.com:8081 max_fails=3 fail_timeout=300s;
        server www.wopai2.com down;
    }
    
  3. ip_hash

    配置塊 upstream
    希望來自某一個用戶的請求始終落在固定的一台服務器上進行處理.
    根據客戶端的IP散列計算出一個key,將key按照upstream集群中的上游服務器進行取模,求得的值對應的主機接收轉發請求.
    ip_hash不可以與weight同時使用
    如果upstream配置中有一台服務器暫時不可用,不能直接刪除該配置,而應該使用down標識.
    upstream mynet{
        ip_hash;
        server www.wowpai1.top;
        server www.wowpai2.top;  
        server www.wowpai3.top down;
    }
    

例子,服務器負載均衡基本配置,nginx中可以進行負載均衡的相關設置:

        upstream my.net{    #my.net是自定義的命名 在server結構中引用即可

        #代理服務器為 兩台機器192.168.22.136 192.168.22.147做負載均衡操作 
        #兩台機器上 可以跑apache負載功能更為強大的網頁相關任務

        #max_fails 表示嘗試出錯最大次數 即可認為該服務器 在fail_timeout時間內不可用
        # server servername:port   servername可以寫主機名 或者點分式IP
        server 192.168.22.136:80 max_fails=1 fail_timeout=300s;
        server 192.168.22.147:80 max_fails=1 fail_timeout=300s;  
        }


        server {
        listen       80;
        server_name  localhost; 
        location / {
            #upstream 塊名
            proxy_pass //my.net;
            root   html;
            index  index.html index.htm;
        }
Tags: