nginx實現負載均衡+文件服務器

這是我參與更文挑戰的第26天,活動詳情查看: 更文挑戰php

中大型項目都會考慮到分佈式,前面幾篇文章着重介紹了數據處理的技術集羣。今天來研究一下關於服務器的負載均衡--Nginx。他除了靜態資源的處理外還有能夠決定將請求置於那臺服務上。html

Nginx的安裝

點我下載nginx

  • 下載好以後咱們能夠直接點擊進行服務開啓

友情提醒:nginx的路徑不能有漢字 這裏寫圖片描述web

  • 或者咱們經過cmd命令來開啓服務。首先到D:\Chirs\Downloads\nginx-1.11.11\nginx-1.11.11目錄下執行命令
nginx
複製代碼
  • 順便說一下關閉命令:
nginx -s  stop 
複製代碼
  • 就這麼簡單nginx開啓了。查看是否開啓成功只須要打開瀏覽器輸入127.0.0.1或者localhost

這裏寫圖片描述

Nginx的基本命令

  • 上面已經提到了啓動命令: nginx.exe

重啓: nginx.exe -s reload 關閉:nginx.exe -s stop 檢測配置合法性:nginx.exe -tspring

友情提醒:儘可能在重啓的時候用重啓命令。有的人喜歡先關閉服務在開啓服務。這樣作若是修改後的配置是錯誤的,就會影響到nginx的使用。而若是用重啓命令,就算修改後的配置錯誤了,僅僅影響新修改的功能,以前的服務仍然能夠執行。windows

Nginx與Tomcat實現負載均衡

  • 在如今數萬訪問量的大數據時代,分佈式是咱們所必需要考慮的一個因素。那麼nginx就能夠幫助咱們緩解大數據的壓力。咱們能夠經過Nginx的反向代理將請求發送到不一樣的tomat,這樣就大大的緩解了咱們服務器的壓力了。

準備兩個Tomcat

  • 想要實現負載均衡咱們就得有多個服務器,這樣nginx纔可以將請求平均分配在不一樣的服務上。因此這裏爲了掩飾效果咱們只准備兩個服務 器(Tomcat)。配置不一樣的訪問端口就能夠了。

nginx.conf

首先貼出一段官網的windows的配置文件。下面逐條解釋。瀏覽器

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

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

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

複製代碼
  • #user nobody; : user屬性在windows中不用設置,人家註釋寫的很清楚 nobody,可是在Linux系統中咱們建議寫 user nginx(用戶) nginx(組) 。服務器

  • worker_processes 1; : 工做進程 正常是CPU*2markdown

  • error_log : nginx 的錯誤日誌記錄的文件地址網絡

  • pid : 在windows中每一個進程在後臺都是有一個pid的。

這裏寫圖片描述

  • events : 裏面設置一些屬性好比鏈接數 worker_connections

  • http : http就是nginx經過設置的http實現負載均衡的

-  `include mime.types;` : 設定mime類型,類型由mime.type文件定義

-  `default_type application/octet-stream;` : 設置默認的請求類型

- `log_format`  : 日誌的輸出格式。

-  日誌格式參數解釋:
-  `$remote_addr`與`$http_x_forwarded_for`用以記錄客戶端的ip地址;

-  $remote_user:用來記錄客戶端用戶名稱;

-  $time_local: 用來記錄訪問時間與時區;

-  $request: 用來記錄請求的url與http協議;

-  $status: 用來記錄請求狀態;成功是200,

-  $body_bytes_sent :記錄發送給客戶端文件主體內容大小;

-  $http_referer:用來記錄從那個頁面連接訪問過來的;

-  $http_user_agent:記錄客戶瀏覽器的相關信息;

-  `sendfile on;` : sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,下降系統uptime。
複製代碼

 

-  `tcp_nopush on;`: 此選項容許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用   
複製代碼

詳細   

nginx.conf修改

  • 上面咱們已經詳細的介紹了nginx的各個參數的設置了。在配置以前咱們先看看nginx初始配置http的location

這裏寫圖片描述

  • 經過上面的咱們能夠看出,當咱們訪問localhost(server_name):80(listen)的時候,nginx就會自動跳轉到html文件夾中的index.html或者是index.htm的頁面上了。

這裏寫圖片描述

  • 咱們如今要作的就是在訪問nginx是隨機的跳轉到咱們指定的Tomcat上。相信你們都知道了,就是修改location的映射路徑就好了。可是咱們的映射路徑是個選擇器,因此咱們首先構造一個選擇器出來
upstream mynginxserver {
        server 192.168.1.183:8888 weight=2;
        server 192.168.1.183:8080 weight=1;
  }
複製代碼
  • 其中weight是權重,就是nginx在隨機選擇的時候回根據這個權重去選擇服務。

  • 而後咱們將location的映射路徑映射到mynginserver上就好了。

location / {
			proxy_pass http://mynginxserver;
        }
複製代碼

注意: proxy_pass 後必須以http://開頭。

  • 一切配置好以後咱們重啓nginx(nginx.exe -s reload)。這個時候咱們先分別看看兩個Tomcat訪問的效果

注意看路徑的端口是不一樣的 Tomcat1: 這裏寫圖片描述

Tomcat2: 這裏寫圖片描述

而後咱們這個時候在訪問nginx的端口:http://192.168.1.183:802/springtests/

這裏寫圖片描述 這裏寫圖片描述

  • 上面的效果就是同一個請求可是請求的頁面是兩個頁面,其實是請求的兩個Tomcat。咱們實際運行中會在兩個Tomcat上放置徹底相同的項目。這樣用戶體驗就是使用的同一個項目,可是咱們已經實現了負載均衡了。

負載均衡的幾個策略

  • 上面咱們已經實現了負載均衡。nginx給我提供了關於負載均衡的策略。

  • 默認策略--輪詢:

upstream mynginxserver {
        server 192.168.1.183:8888;
        server 192.168.1.183:8080;
    }
複製代碼

經過請求的時間順序請求不一樣的Tomcat。若是某一個宕機了,則自動忽略。

  • 最少連接 : 顧名思義就是在選擇的時候誰的鏈接數最少,就選擇誰
upstream mynginxserver {
	least_conn;
        server 192.168.1.183:8888;
        server 192.168.1.183:8080;
    }
複製代碼
  • weight權重: 這種方式也是我上面實現負載均衡採用的方式。默認值是1 。就是在選擇具體發送到哪個Tomcat的時候是根據Tomcat的權重判斷的。
upstream mynginxserver {
        server 192.168.1.183:8888 weight=2;
        server 192.168.1.183:8080 weight=1;
    }
複製代碼
  • ip_hash : 這個就是根據當前請求的ip,根據ip算出對應的hash值,而後在根據hash值選擇對應的Tomcat。這種效果就是一臺客戶端至始至終訪問的都是同一臺Tomcat。這裏的session就是同樣的。
upstream mynginxserver {
	ip_hash;
        server 192.168.1.183:8888 ;
        server 192.168.1.183:8080 ;
    }
複製代碼
  • url_hash: 和ip_hash是一個效果
upstream mynginxserver {
	hash $request_url;
        server 192.168.1.183:8888;
        server 192.168.1.183:8080;
    }
複製代碼
  • fair:根據響應時間來定的。誰的響應時間短,就連誰。
upstream mynginxserver {
        server 192.168.1.183:8888 ;
        server 192.168.1.183:8080 ;
        fair;
    }
複製代碼

nginx地址映射

  • nginx除了做爲服務器的負載均衡外,還有一個亮點就是地址映射。做爲資源服務器來使用。在咱們的web開發中常常須要上傳資源到服務上。咱們總不能將資源放在Tomcat上。這樣會大大增長Tomcat的壓力的。並且這樣數據很容易丟失的。nginx就能夠解決這個問題。

  • 其實在上面實現負載均衡的時候就已經實現了地址映射。location就是地址映射的橋樑。

location ~ ^/images/(.*) 

         # location ~ ^/images/(.*\.jpg) 

         #「.」表示任何字符,「*」表示任意數量,

         #「\.jpg」表示jpg後綴名的文件

      {

         expires 1s;

         alias D:/zxh/test/$1;   #「$1」表是location後面()的內容

         index  index.html index.htm;

         break;

      }
複製代碼

上面的location表示在經過server+port+^images^.^的形式就會映射到D:/zxh/test這個文件夾下。 好比我在瀏覽器中訪問:http://192.168.1.183:802/images/test.jpg

這個時候nginx就會去訪問D:/zxh/test下時候有test.jpg的圖片。 這裏寫圖片描述

這裏寫圖片描述

相關文章
相關標籤/搜索