Nginx學習筆記

1.   學習計劃

一、nginx的安裝javascript

二、Nginx配置虛擬機php

三、Nginx實現反向代理css

四、Nginx實現負載均衡 html

2.   nginx簡介及應用場景

Nginx是一款高性能的http 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。由俄羅斯的程序設計師Igor Sysoev所開發,官方測試nginx可以支支撐5萬併發連接,而且cpu、內存等資源消耗卻很是低,運行很是穩定。java

一、http服務器。Nginx是一個http服務能夠獨立提供http服務。能夠作網頁靜態服務器。【root】node

二、虛擬主機。能夠實如今一臺服務器虛擬出多個網站。例如我的網站使用的虛擬主機。【一個server節點就是一個虛擬主機】linux

三、反向代理負載均衡。當網站的訪問量達到必定程度後,單臺服務器不能知足用戶的請求時,須要用多臺服務器集羣可使用nginx作反向代理。而且多臺服務器能夠平均分擔負載,不會由於某臺服務器負載高宕機而某臺服務器閒置的狀況。【upstream  proxy_pass】nginx

3.   nginx安裝

下載nginx:c++

官方網站:web

http://nginx.org/

使用的版本是1.8.0版本。

 

 

Nginx提供的源碼。

3.1. 要求的安裝環境

一、須要安裝gcc的環境。yum install gcc-c++

二、第三方的開發包。

  • PCRE

       PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式,因此須要在linux上安裝pcre庫。

  yum install -y pcre pcre-devel

注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也須要此庫。

  • zlib

       zlib庫提供了不少種壓縮和解壓縮的方式,nginx使用zlib對http包的內容進行gzip,因此須要在linux上安裝zlib庫。

  yum install -y zlib zlib-devel

 

  • openssl

       OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。

       nginx不只支持http協議,還支持https(即在ssl協議上傳輸http),因此須要在linux安裝openssl庫。

  yum install -y openssl openssl-devel

 

3.2. 安裝步驟

 

第一步:把nginx的源碼包上傳到linux系統

第二步:解壓縮

[root@localhost ~]# tar zxf nginx-1.8.0.tar.gz

3.2.1. configure

第三步:使用configure命令建立一makeFile文件。

./configure \

--prefix=/usr/local/nginx \

--pid-path=/var/run/nginx/nginx.pid \

--lock-path=/var/lock/nginx.lock \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/temp/nginx/client \

--http-proxy-temp-path=/var/temp/nginx/proxy \

--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \

--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

--http-scgi-temp-path=/var/temp/nginx/scgi

 

注意:啓動nginx以前,上邊將臨時文件目錄指定爲/var/temp/nginx,須要在/var下建立temp及nginx目錄

[root@localhost sbin]# mkdir /var/temp/nginx/client -p

 

3.2.2. make&make install

第四步:make

第五步:make install

 

 

 

3.3. 啓動nginx

進入sbin目錄,nginx的啓動能夠直接執行nginx的bin文件, 當nginx啓動後,能夠經過-s 參數來控制nginx

[root@localhost sbin]# ./nginx 
nginx -s reload     #從新加載配置文件
nginx -s reopen     #從新打開log文件
nginx -s stop       #快速關閉nginx服務
nginx -s quit       #優雅的關閉nginx服務,等待工做進程處理完全部的請求 

3.4. 關閉nginx:

[root@localhost sbin]# ./nginx -s stop

 

推薦使用:

[root@localhost sbin]# ./nginx -s quit 

kill 進程號【正常關閉】

kill -9 進程號【暴力關閉】

3.5. 重啓nginx:

一、先關閉後啓動。

3.6. 刷新配置文件

二、修改了Nginx的配置文件後,在不用重啓Nginx的時候,能夠用以下命令刷新配置文件:

[root@localhost sbin]# ./nginx -s reload

 

Nginx從新加載配置文件的過程:主進程接受到加載信號後:

  • 首先會校驗配置的語法,而後生效新的配置,
  • 若是成功,則主進程會啓動新的工做進程,同時發送終止信號給舊的工做進程。
  • 不然主進程回退配置,繼續工做。

在第二步,舊的工做進程收到終止信號後,會中止接收新的鏈接請求,知道全部現有的請求處理完,而後退出。

3.4. 訪問nginx

 

默認是80端口。

注意:是否關閉防火牆。

3.5. 進程模型

Nginx進程模型:1個主進程,n個工做進程,主進程負責配置和工做進程的管理,實際的請求由工做進程進行處理。Nginx是基於事件驅動和多路複用的工做模型。

3.6. nginx.conf

nginx conf文件結構介紹以及相關配置:

 https://blog.csdn.net/anonymalias/article/details/50950910

3.6.1.  文件結構

nginx的配置由特定的標識符(指令符)分爲多個不一樣的模塊。 
指令符分爲簡單指令塊指令

  • 簡單指令格式:[name parameters;]
  • 塊指令格式:和簡單指令格式有同樣的結構,但其結束標識符不是分號,而是大括號{},塊指令內部能夠包含simple directives 和block directives, 能夠稱塊指令爲上下文(e.g. events, http, server, location)

conf文件中,全部不屬於塊指令的簡單指令都屬於main上下文的,http塊指令屬於main上下文,server塊指令http上下文。

...              #全局塊

events {         #events塊
   ...
}

http      #http塊
{
    ...   #http全局塊
    server        #server塊
    { 
        ...       #server全局塊
        location [PATTERN]   #location塊
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局塊
}

 

  一、全局塊:配置影響nginx全局的指令。通常有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,容許生成worker process數等。

  二、events塊:配置影響nginx服務器或與用戶的網絡鏈接。有每一個進程的最大鏈接數,選取哪一種事件驅動模型處理鏈接請求,是否容許同時接受多個網路鏈接,開啓多個網絡鏈接序列化等。

  三、http塊:能夠嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,鏈接超時時間,單鏈接請求數等。

  四、server塊:配置虛擬主機的相關參數,一個http中能夠有多個server。

  五、location塊:配置請求的路由,以及各類頁面的處理狀況。

 一個例子:

########### 每一個指令必須有分號結束。#################
#user administrator administrators;  #配置用戶或者組,默認爲nobody nobody。
#worker_processes 2;  #容許生成的進程數,默認爲1
#pid /nginx/pid/nginx.pid;   #指定nginx進程運行文件存放地址
error_log log/error.log debug;  #制定日誌路徑,級別。這個設置能夠放入全局塊,http塊,server塊,級別以此爲:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #設置網路鏈接序列化,防止驚羣現象發生,默認爲on
    multi_accept on;  #設置一個進程是否同時接受多個網絡鏈接,默認爲off
    #use epoll;      #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大鏈接數,默認爲512
}
http {
    include       mime.types;   #文件擴展名與文件類型映射表
    default_type  application/octet-stream; #默認文件類型,默認爲text/plain
    #access_log off; #取消服務日誌    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
    access_log log/access.log myFormat;  #combined爲日誌格式的默認值
    sendfile on;   #容許sendfile方式傳輸文件,默認爲off,能夠在http塊,server塊,location塊。
    sendfile_max_chunk 100k;  #每一個進程每次調用傳輸數量不能大於設定的值,默認爲0,即不設上限。
    keepalive_timeout 65;  #鏈接超時時間,默認爲75s,能夠在http,server,location塊。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #熱備
    }
    error_page 404 https://www.baidu.com; #錯誤頁
    server {
        keepalive_requests 120; #單鏈接請求上限次數。
        listen       4545;   #監聽端口
        server_name  127.0.0.1;   #監聽地址       
        location  ~*^.+$ {       #請求的url過濾,正則匹配,~爲區分大小寫,~*爲不區分大小寫。
           #root path;  #根目錄
           #index vv.txt;  #設置默認頁
           proxy_pass  http://mysvr;  #請求轉向mysvr 定義的服務器列表
           deny 127.0.0.1;  #拒絕的ip
           allow 172.18.5.54; #容許的ip           
        } 
    }
} 

 

3.6.2.  配置介紹

Nginx配置詳解 http://www.javashuo.com/article/p-xkijqyyb-hr.html

完整的基本配置文件以下:

#運行用戶
user www-data;  
#啓動進程,一般設置成和cpu的數量相等
worker_processes 1;
 
#全局錯誤日誌及PID文件
error_log /var/log/nginx/error.log;
pid    /var/run/nginx.pid;
 
#工做模式及鏈接數上限
events {
  use  epoll;       #epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能
  worker_connections 1024;#單個後臺worker process進程的最大併發連接數
  # multi_accept on; 
}
 
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
   #設定mime類型,類型由mime.type文件定義
  include    /etc/nginx/mime.types;
  default_type application/octet-stream;
  #設定日誌格式
  access_log  /var/log/nginx/access.log;
 
  #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
  #必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
  sendfile    on;
  #tcp_nopush   on;
 
  #鏈接超時時間
  #keepalive_timeout 0;
  keepalive_timeout 65;
  tcp_nodelay    on;
   
  #開啓gzip壓縮
  gzip on;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";
 
  #設定請求緩衝
  client_header_buffer_size  1k;
  large_client_header_buffers 4 4k;
 
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
 
  #設定負載均衡的服務器列表
   upstream mysvr {
  #weigth參數表示權值,權值越高被分配到的概率越大
  #本機上的Squid開啓3128端口
  server 192.168.8.1:3128 weight=5;
  server 192.168.8.2:80 weight=1;
  server 192.168.8.3:80 weight=6;
  }
 
 
  server {
  #偵聽80端口
    listen    80;
    #定義使用www.xx.com訪問
    server_name www.xx.com;
 
    #設定本虛擬主機的訪問日誌
    access_log logs/www.xx.com.access.log main;
 
  #默認請求
  location / {
     root  /root;   #定義服務器的默認網站根目錄位置
     index index.php index.html index.htm;  #定義首頁索引文件的名稱
 
     fastcgi_pass www.xx.com;
     fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
     include /etc/nginx/fastcgi_params;
    }
 
  # 定義錯誤提示頁面
  error_page  500 502 503 504 /50x.html; 
    location = /50x.html {
    root  /root;
  }
 
  #靜態文件,nginx本身處理
  location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    root /var/www/virtual/htdocs;
    #過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。
    expires 30d;
  }
  #PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置.
  location ~ \.php$ {
    root /root;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
    include fastcgi_params;
  }
  #設定查看Nginx狀態的地址
  location /NginxStatus {
    stub_status      on;
    access_log       on;
    auth_basic       "NginxStatus";
    auth_basic_user_file conf/htpasswd;
  }
  #禁止訪問 .htxxx 文件
  location ~ /\.ht {
    deny all;
  }
    
   }
}
View Code

 

以上是一些基本的配置,使用Nginx最大的好處就是負載均衡

若是要使用負載均衡的話,能夠修改配置http節點以下:

#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
   #設定mime類型,類型由mime.type文件定義
  include    /etc/nginx/mime.types;
  default_type application/octet-stream;
  #設定日誌格式
  access_log  /var/log/nginx/access.log;
 
  #省略上文有的一些配置節點
 
  #。。。。。。。。。。
 
  #設定負載均衡的服務器列表
   upstream mysvr {
  #weigth參數表示權值,權值越高被分配到的概率越大
  server 192.168.8.1x:3128 weight=5;#本機上的Squid開啓3128端口
  server 192.168.8.2x:80 weight=1;
  server 192.168.8.3x:80 weight=6;
  }
 
  upstream mysvr2 {
  #weigth參數表示權值,權值越高被分配到的概率越大
 
  server 192.168.8.x:80 weight=1;
  server 192.168.8.x:80 weight=6;
  }
 
  #第一個虛擬服務器
  server {
  #偵聽192.168.8.x的80端口
    listen    80;
    server_name 192.168.8.x;
 
   #對aspx後綴的進行負載均衡請求
  location ~ .*\.aspx$ {
 
     root  /root;   #定義服務器的默認網站根目錄位置
     index index.php index.html index.htm;  #定義首頁索引文件的名稱
 
     proxy_pass http://mysvr ;#請求轉向mysvr 定義的服務器列表
 
     #如下是一些反向代理的配置可刪除.
 
     proxy_redirect off;
 
     #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     client_max_body_size 10m;  #容許客戶端請求的最大單文件字節數
     client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,
     proxy_connect_timeout 90; #nginx跟後端服務器鏈接超時時間(代理鏈接超時)
     proxy_send_timeout 90;    #後端服務器數據回傳時間(代理髮送超時)
     proxy_read_timeout 90;     #鏈接成功後,後端服務器響應時間(代理接收超時)
     proxy_buffer_size 4k;       #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
     proxy_buffers 4 32k;        #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置
     proxy_busy_buffers_size 64k;  #高負荷下緩衝大小(proxy_buffers*2)
     proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
 
    }
 
   }
}
View Code

 

3.6.2.1.  server指令

一般狀況下,conf文件存在多個server塊,一個server就是一個虛擬主機經過listen的端口(默認是80端口)和server_name進行區分, 對不一樣的請求提供不一樣的服務,以下:

server {
    listen      80;
    server_name a.example.org;
    ...
}

 

listen指令的參數:能夠是ip, hostname, ip/hostname:port, port, UNIX-domain socket.例如:

listen 127.0.0.1:8000;listen 127.0.0.1;listen 8000;listen *:8000;listen localhost:8000;
listen unix:/var/run/nginx.sock;

 

server塊內部的listen和server_name不能和其餘server塊的徹底相同,不然啓動加載配置的時候會出錯:

當nginx決定了哪個server處理客戶端請求後,nginx會解析request header中URI(這裏以及後面提到的大部分都是指相對URI),而後匹配server塊中的location指令的參數,匹配規則下一節會介紹。例以下例:

server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
}  

 

location塊指令會用其參數與客戶端請求的URI進行匹配,匹配的URI請求會被定向到root指令定義的特殊本地文件系統目錄中重定向規則爲:將URI添加到root參數後面,生成一個本地文件路徑,即:root參數 + URI請求。這裏示例參數」/」會匹配全部的請求,通常都會默認存在。示例定位後的目錄爲html/,默認是定位到安裝目錄的路徑下的html/(相對路徑)。這裏location塊指令內部的兩個簡單指令的含義是:

  • root 指定重定向後uri的資源查找路徑,這裏html爲相對路徑,相對於nginx的安裝目錄。
  • index 指定首頁index文件的名稱,能夠配置多個,參數以空格分開,按配置順序查找。

默認的在nginx安裝目錄下都會存在一個html目標,在我電腦中爲:/usr/local/nginx-1.8.0/html, 而後裏面存在默認的nignx的歡迎界面,例如我安裝nginx後直接啓動nginx bin文件,而後訪問對應的域名就獲得了以下的頁面: 
這裏寫圖片描述 
若是有多個location指令塊匹配到,nginx的選擇策略是the longest prefix最長前綴匹配原則。 
例如,當上述的server中再增長一個location塊,匹配參數爲」/htdocs/」,重定向的資源路徑爲以下配置,

server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /htdocs {
            root   /home/anonymalias;
            index  index.html;
        }
}  

 

當訪問http://anonymalias.oicp.net:8008/htdocs/,就會匹配到/home/anonymalias/htdocs/index.html

3.6.2.2.  location指令

nginx的location指令是配置的核心,用於匹配client請求uri的path部分,而後對不一樣的請求提供不一樣的靜態內容,或者經過反向代理重定向到內部的server

對於client的request, nginx會進行預處理,nginx首先對採用 ’%XX’(uri採用%+十六進制格式用於在瀏覽器和插件中顯示非標準的字母和字符) 格式文本編碼的uri進行解碼。而後處理path中的相對路徑符號’.’和‘..’,而後對於含有兩個及以上的’/’壓縮成一個’/’。 這樣處理完後會獲得一個乾淨的path,而後會用這個path會在server的location指令的參數進行匹配。

location 語法:
    location [ = | ~ | ~* | ^~ ] uri { ... }
    location @name { ... }

 

location指令的參數

    • 能夠是一個前綴字符串,參數修飾符分爲: 
      • 無任何修飾符;
      • 「=」 修飾符:定義一個精確匹配,匹配是精確匹配優先級最高;
      • 「^~」 修飾符:對應的參數做爲最長字符串匹配到後,不會繼續去搜索參數爲正則表達式的location
    • 也能夠是一個正則表達式,參數修飾符分爲: 
      • 」~」 修飾符: location參數部分大小寫敏感
      • 「~*」 修飾符:location參數部分大小寫不敏感;
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration A ]
}

location ~ \.(gif|jpg|jpeg)$ {
    [ configuration B ]
}

若請求URI爲/images/a.JPG,只能匹配A。

location匹配的過程: 
1. 首先nginx會把request的uri在location正常字符串參數中匹配出符合的最長字符串,並保存這個結果; 
2. 若是最長前綴匹配結果前面有 」^~」修飾符,那麼中止繼續搜索; 
3. 若是最長匹配結果前有」=」修飾符,也會中止繼續搜索; 
4. 接下來,去匹配參數爲正則表達式的全部location,根據location的配置順序,在匹配到第一個正則表達式時,即中止搜索其餘的正則表達式; 
因此如官網上的下例:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

 

  • 當請求」/」時,匹配到A
  • 當請求」/index.html」,會匹配到B;
  • 當請求」documens/document.html」,會匹配到C;
  • 當請求」/images/1.gif」,會匹配到D;匹配流程:首先會匹配到D,因爲D的location的參數含有修飾符」^~」,當匹配到D後,不會再搜索參數爲正則表達式的location;
  • 當請求」/documents/1.jpg」,會匹配到E;匹配流程:首先會匹配到C,此時會保存C的匹配結果,而後繼續搜索參數爲正則的location,結果發現E匹配上了,那麼會丟棄以前匹配到的C

4.   配置靜態訪問

關鍵配置root

Web server很重要一部分工做就是提供靜態頁面的訪問(作http服務器,提供服務),例如images, html page。nginx能夠經過不一樣的配置,根據request請求,從本地的目錄(有root指定,當配置了proxy_pass代理時候,nginx將再也不直接提供服務,而只作請求轉發)提供不一樣的文件返回給客戶端。 

打開安裝目錄下的nginx.conf文件,默認配置文件已經在http指令塊中建立了一個空的server塊,在nginx-1.8.0中的http塊中已經建立了一個默認的server塊。內容以下:

server {
        listen       80; server_name localhost; location / { root  html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } 

5.   配置虛擬主機

就是在一臺服務器啓動多個網站。一個server就是一個虛擬主機。

如何區分不一樣的網站:

一、域名不一樣

二、端口不一樣

 

5.1. 經過端口區分不一樣虛擬機

Nginx的配置文件:

/usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;

#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;
}


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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    #一個server節點就是一個虛擬主機
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
       #Html是nginx安裝目錄下的html目錄(靜態頁面存放的位置,也可使用絕對路徑)
            root   html;
            index  index.html index.htm;
        }
    }
}

 

能夠配置多個server,配置了多個虛擬主機。

 

添加虛擬主機:

#user  nobody;
worker_processes  1;

#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;
}


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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;(域名)

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        Location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       81;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html-81;
            index  index.html index.htm;
        }
    }
}

 

從新加載配置文件

[root@localhost nginx]# sbin/nginx -s reload

 

 

5.2. 經過域名區分虛擬主機

5.2.1.    什麼是域名

域名就是網站。

www.baidu.com

www.taobao.com

www.jd.com

Tcp/ip

 

Dns服務器:把域名解析爲ip地址。保存的就是域名和ip的映射關係。

一級域名:

Baidu.com

Taobao.com

Jd.com

二級域名:

www.baidu.com

Image.baidu.com

Item.baidu.com

三級域名:

1.Image.baidu.com

Aaa.image.baidu.com

 

一個域名對應一個ip地址,一個ip地址能夠被多個域名綁定。

 

本地測試能夠修改hosts文件。

修改window的hosts文件:(C:\Windows\System32\drivers\etc)

能夠配置域名和ip的映射關係,若是hosts文件中配置了域名和ip的對應關係,不須要走dns服務器。

 

 

5.2.2.    Nginx的配置

 

#user  nobody;
worker_processes  1;

#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;
}


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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       81;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html-81;
            index  index.html index.htm;
        }
    }
    server {
        listen       80;
        server_name  www.taobao.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html-taobao;
            index  index.html index.htm;
        }
    }
    server {
        listen       80;
        server_name  www.baidu.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html-baidu;
            index  index.html index.htm;
        }
    }
}
View Code

 

域名的配置:

192.168.25.148 www.taobao.com

192.168.25.148 www.baidu.com

 

 

 

6.   反向代理

Nginx代理功能與負載均衡詳解:

http://www.javashuo.com/article/p-xkijqyyb-hr.html

http://www.cnblogs.com/knowledgesea/p/5199046.html

6.1. 什麼是反向代理

正向代理

(代理客戶端)接收到客戶端,替代客戶端去完成上網,將得到的結果返回給客戶端。

 

反向代理:(代理服務端)

 

 

反向代理服務器決定哪臺服務器提供服務

返回代理服務器不提供服務器。只是請求的轉發。

Nginx在作反向代理時,提供性能穩定,而且可以提供配置靈活的轉發功能Nginx能夠根據不一樣的正則匹配,採起不一樣的轉發策略,好比圖片文件結尾的走文件服務器,動態頁面走web服務器,只要你正則寫的沒問題,又有相對應的服務器解決方案,你就能夠爲所欲爲的玩。而且Nginx對返回結果進行錯誤頁跳轉,異常判斷等。若是被分發的服務器存在異常,他能夠將請求從新轉發給另一臺服務器,而後自動去除異常服務器。

下面是nginx官方最簡單的一個proxy server的配置示例:

 

server {
    location / {
        proxy_pass http://localhost:8080/;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

 

配置的含義:全部URI中以.gif, .jpg, .png結尾的請求都會被映射到/data/images本地磁盤目錄,把全部其餘的URI請求都傳給配置的被代理的serverhttp://localhost:8080/

 6.2. 重要的參數

6.2.1.  proxy_pass: 

  該指令是反向代理的基本指令,用於設置代理服務器的協議和地址;對於一個client的請求,proxy_pass指令經過如下方式進行uri的轉發: 

  • 若是proxy_pass指令的參數沒有URI,那麼請求的URI會被原樣的傳遞給internal server。
  • 若是proxy_pass指令的參數含有URI,client請求的URI匹配該location的部分將會被proxy_pass的path參數替換。
  • 例如:請求爲127.0.0.1/name/index.html 會被轉發爲:127.0.0.1/remote/index.html

6.2.2.  proxy_pass_header: 

  語法:proxy_pass_header field 
  field參數是http全部的header名字,具體能夠參考: [HTTP/1.1協議][1] P100 chapter14關於HTTP協議全部header field的定義。

6.2.3.  proxy_set_header: 

  語法:proxy_set_header field value; 
  該指令用於將client傳遞給proxy server的request header從新定義或者添加字段。Value能夠是文本,變量和二者結合。 
  若是set 的header field的值爲空,那麼這個header是不會傳遞給proxy server的

6.3. Nginx實現反向代理

兩個域名指向同一臺nginx服務器,用戶訪問不一樣的域名顯示不一樣的網頁內容。

兩個域名是www.sian.com.cn和www.sohu.com

nginx服務器使用虛擬機192.168.25.148

 

第一步:安裝兩個tomcat,分別運行在8080和8081端口。

第二步:啓動兩個tomcat。

第三步:反向代理服務器的配置

複製一個server節點,將root改爲proxy_pass,配置了proxy_pass以後服務器不提供服務器,只是請求的轉發。

配置upstream

upstream tomcat1 {

                         server 192.168.25.148:8080;

    }

    server {

        listen       80;

        server_name  www.sina.com.cn;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

        location / {

            proxy_pass   http://tomcat1;

            index  index.html index.htm;

        }

    }

    upstream tomcat2 {

                         server 192.168.25.148:8081;

    }

    server {

        listen       80;

        server_name  www.sohu.com;

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

        location / {

            proxy_pass   http://tomcat2;

            index  index.html index.htm;

        }

    }

第四步:nginx從新加載配置文件

第五步:配置域名

在hosts文件中添加域名和ip的映射關係

192.168.25.148 www.sina.com.cn

192.168.25.148 www.sohu.com

 

7.   負載均衡

若是一個服務由多臺服務器提供,須要把負載分配到不一樣的服務器處理,須要負載均衡。

Nginx提供的負載均衡策略有2種:內置策略擴展策略內置策略爲輪詢,加權輪詢,Ip hash。擴展策略,就天馬行空,只有你想不到的沒有他作不到的。

 upstream tomcat2 {

       server 192.168.25.148:8081;

       server 192.168.25.148:8082;

  }

 

能夠根據服務器的實際狀況調整服務器權重weight。權重越高分配的請求越多,權重越低,請求越少。默認是都是1,是輪詢機制。

 upstream tomcat2 {

       server 192.168.25.148:8081;

       server 192.168.25.148:8082 weight=2;

    }

 

8.   Nginx負載均衡高可用

要實現nginx的高可用,須要實現備份機

8.1. 什麼是負載均衡高可用

       nginx做爲負載均衡器,全部請求都到了nginx(對外服務的惟一入口,惟一公網IP),可見nginx處於很是重點的位置,若是nginx服務器宕機後端web服務將沒法提供服務,影響嚴重。

       爲了屏蔽負載均衡服務器的宕機,須要創建一個備份機。主服務器和備份機上都運行高可用(High Availability)監控程序,經過傳送諸如「I am alive」這樣的信息來監控對方的運行情況。當備份機不能在必定的時間內收到這樣的信息時,它就接管主服務器的服務IP並繼續提供負載均衡服務;當備份管理器又從主管理器收到「I am alive」這樣的信息時,它就釋放服務IP地址,這樣的主服務器就開始再次提供負載均衡服務。

8.2. keepalived+nginx實現主備

  一般說的雙機熱備是指兩臺機器都在運行,但並非兩臺機器都同時在提供服務。 
  當提供服務的一臺出現故障的時候,另一臺會立刻自動接管而且提供服務,並且切換的時間很是短。

8.2.1.    什麼是keepalived

       keepalived是集羣管理中保證集羣高可用的一個服務軟件,用來防止單點故障

      Keepalived的做用是檢測web服務器的狀態(健康監測),若是有一臺web服務器死機,或工做出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工做正常後Keepalived自動將web服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的web服務器。

8.2.2.    keepalived工做原理

       keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議

       虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(VIP = Virtual IP Address,虛擬IP地址,該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到VRRP包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。

       keepalived主要有三個模塊,分別是corecheckVRRP。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。VRRP模塊是來實現VRRP協議的。 

詳細參考:Keepalived權威指南中文.pdf

8.2.3.    keepalived+nginx實現主備過程

  nginx和keepalived實現nginx高可用:

  https://blog.csdn.net/u012453843/article/details/69668663

8.2.3.1.    初始狀態:

  初始時候,nginx主服務器正常,將vip綁定到自身,對外提供服務,從服務器始終與主服務器保持通訊,監測主服務器的健康狀態。

 

8.2.3.2.    主機宕機:

  當nginx主服務器宕機或發生異常,總之以任何理由形成服務器上的健康監測程序發生異常,沒法和從服務器上的健康監測程序通訊,此時從服務器上的健康監測機制就會認爲主服務器掛了,從而將vip綁定到自身,成功上位,充當主服務器的角色。

 

8.2.3.3.    主機恢復:

  在keepalive機制中,主服務器終究是主服務器,一旦主服務器恢復,邊重新綁定vip,繼續充當主服務器,而從服務器又成爲了熱備。

 

8.2.4.    高可用環境

兩臺nginx,一主一備:192.168.101.3和192.168.101.4

兩臺tomcat服務器:192.168.101.五、192.168.101.6

8.2.5.    安裝keepalived

       一、分別在主備nginx上安裝keepalived,參考「安裝筆記」進行安裝:

  二、Keepalived安裝與配置:

        https://blog.csdn.net/xyang81/article/details/52554398

8.2.6.   配置keepalived

 

修改主和備nginx服務器上的keepalived 配置文件 /etc/keepalived/keepalived.conf 文件

 

8.2.6.1.   主nginx

修改主nginx下/etc/keepalived/keepalived.conf文件

 

! Configuration File for keepalived

#全局配置
global_defs {
   notification_email {  #指定keepalived在發生切換時須要發送email到的對象,一行一個
     XXX@XXX.com
   }
   notification_email_from XXX@XXX.com  #指定發件人
   #smtp_server XXX.smtp.com                             #指定smtp服務器地址
   #smtp_connect_timeout 30                               #指定smtp鏈接超時時間
   router_id LVS_DEVEL                                    #運行keepalived機器的一個標識
}

vrrp_instance VI_1 { 
    state MASTER           #標示狀態爲MASTER 備份機爲BACKUP
    interface eth0         #設置實例綁定的網卡
    virtual_router_id 51   #同一實例下virtual_router_id必須相同
    priority 100           #MASTER權重要高於BACKUP 好比BACKUP爲99  
    advert_int 1           #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {       #設置認證
        auth_type PASS     #主從服務器驗證方式
        auth_pass 8888
    }
    virtual_ipaddress {    #設置vip
        192.168.101.100       #能夠多個虛擬IP,換行便可
    }
}

 

 

 

8.2.6.2.   備nginx

修改備nginx下/etc/keepalived/keepalived.conf文件

配置備nginx時須要注意:須要修改state爲BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived

#全局配置
global_defs {
   notification_email {  #指定keepalived在發生切換時須要發送email到的對象,一行一個
    XXX@XXX.com
   }
   notification_email_from XXX@XXX.com                  #指定發件人
   #smtp_server XXX.smtp.com                                 #指定smtp服務器地址
   #smtp_connect_timeout 30                               #指定smtp鏈接超時時間
   router_id LVS_DEVEL                                    #運行keepalived機器的一個標識
}

vrrp_instance VI_1 { 
    state BACKUP           #標示狀態爲MASTER 備份機爲BACKUP
    interface eth0         #設置實例綁定的網卡
    virtual_router_id 51   #同一實例下virtual_router_id必須相同
    priority 99            #MASTER權重要高於BACKUP 好比BACKUP爲99  
    advert_int 1           #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
    authentication {       #設置認證
        auth_type PASS     #主從服務器驗證方式
        auth_pass 8888
    }
    virtual_ipaddress {    #設置vip
        192.168.101.100       #能夠多個虛擬IP,換行便可
    }
}

 

8.2.7.   測試

主備nginx都啓動keepalived及nginx。

service keepalived start

./nginx

8.2.7.1.   初始狀態

查看主nginx的eth0設置:

vip綁定在主nginx的eth0上。

查看備nginx的eth0設置:

vip沒有綁定在備nginx的eth0上。

訪問ccc.test.com,能夠訪問。

 8.2.7.2.   主機宕機

將主nginx的keepalived中止或將主nginx關機(至關於模擬宕機),查看主nginx的eth0:

eth0沒有綁定vip

注意這裏模擬的是中止 keepalived進程沒有模擬宕機,因此還要將nginx進程也中止表示主nginx服務沒法提供。

 

查看備nginx的eth0:

vip已經漂移到備nginx。

 

訪問ccc.test.com,能夠訪問。

8.2.7.3.   主機恢復

將主nginx的keepalived和nginx都啓動。

查看主nginx的eth0:

 

查看備nginx的eth0:

vip漂移到主nginx。

查看備nginx的eth0:

eth0沒有綁定vip

訪問:ccc.test.com,正常訪問。

注意:主nginx恢復時必定要將nginx也啓動(一般nginx啓動要加在開機啓動中),不然即便vip漂移到主nginx也沒法訪問。

8.2.8.   解決nginx進程和keepalived不一樣時存在問題

8.2.8.1.   問題描述

         keepalived是經過檢測keepalived進程是否存在判斷服務器是否宕機,若是keepalived進程在可是nginx進程不在了那麼keepalived是不會作主備切換,因此咱們須要寫個腳原本監控nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉

8.2.8.2.   nginx進程檢測腳本

         在主nginx上須要編寫nginx進程檢測腳本(check_nginx.sh),判斷nginx進程是否存在,若是nginx不存在就將keepalived進程殺掉,check_nginx.sh內容以下:

 

#!/bin/bash

# 若是進程中沒有nginx則將keepalived進程kill掉

A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx進程 把值賦給變量A

if [ $A -eq 0 ];then                    ## 若是沒有進程值得爲 零

       service keepalived stop          ## 則結束 keepalived 進程

fi

將check_nginx.sh拷貝至/etc/keepalived下

腳本測試:

將nginx中止,將keepalived啓動,執行腳本:sh /etc/keepalived/check_nginx.sh

 

從執行能夠看出自動將keepalived進程kill掉了。

8.2.8.3.   修改keepalived.conf

修改主nginx的keepalived.conf,添加腳本定義檢測:

注意下邊紅色標識地方:

 

#全局配置

global_defs {

   notification_email {  #指定keepalived在發生切換時須要發送email到的對象,一行一個

     XXX@XXX.com

   }

   notification_email_from miaoruntu@itcast.cn  #指定發件人

   #smtp_server XXX.smtp.com                             #指定smtp服務器地址

   #smtp_connect_timeout 30                               #指定smtp鏈接超時時間

   router_id LVS_DEVEL                                    #運行keepalived機器的一個標識

}

vrrp_script check_nginx {  script "/etc/keepalived/check_nginx.sh"         ##監控腳本
 interval 2                                    ##時間間隔,2秒
 weight 2                                      ##權重
 } 
vrrp_instance VI_1 {

    state MASTER           #標示狀態爲MASTER 備份機爲BACKUP

    interface eth0         #設置實例綁定的網卡

    virtual_router_id 51   #同一實例下virtual_router_id必須相同

    priority 100           #MASTER權重要高於BACKUP 好比BACKUP爲99

    advert_int 1           #MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒

    authentication {       #設置認證

        auth_type PASS     #主從服務器驗證方式

        auth_pass 8888

    }

 track_script {  check_nginx  #監控腳本
 }

    virtual_ipaddress {    #設置vip

        192.168.101.100       #能夠多個虛擬IP,換行便可

    }

 

}

修改後重啓keepalived

 

8.2.8.4   測試

回到負載均衡高可用的初始狀態,保證主、備上的keepalived、nginx所有啓動。

中止主nginx服務

 

觀察keepalived日誌:

tail -f /var/log/keepalived.log

 

查看keepalived進程已經不存在。

查看eth0已經沒有綁定vip。

相關文章
相關標籤/搜索