天天看點

nginx反向代理中負載均衡基礎配置

簡介

    以前聽過nginx,但是一直沒接觸過,現在有空,特地去了解并且基本的去使用nginx,網上很多配置介紹,自己寫一篇加深了解以防忘記。

    我主要是去了解怎麼用nginx去實行反向代理。簡單說下代理和反向代理吧。

    代理:

    主要是代理用戶端。

    例如:一個公司隻有一個外網ip,但是可能有幾十到上百台電腦,其中每台電腦都需要有上網的功能。那麼此時就可以弄個代理伺服器,公司中的每一個電腦的上網請求全部發送到這個代理伺服器,代理伺服器在利用外網ip去根據不同電腦執行不同的操作。相當就是個中介。這就是代理。

    反向代理:

    主要是代理伺服器。

    最通俗易懂的例子:假如你想查你手機還剩多少餘額。你隻需撥打對應的的營運商電話就可以了(10086/10010/10000),此時,你并不知道接你電話的這個客服代表是男是女,是帥是醜。因為他們有個類似代理伺服器的系統,會自動把你的通話轉接到空閑的客服那兒去。同理,一個伺服器也是這樣的,就像淘寶,在雙11的時候,訂單太多,一個伺服器是處理不過來的。他會把請求分别分發到相對比較空閑的伺服器上去(實際上不知道複雜多少倍.......)。

圖解如下,是在網上copy的一個圖...

nginx反向代理中負載均衡基礎配置

配置

官網下載下傳 http://nginx.org/en/download.html

我這兒是下載下傳的1.10.3的windows版本。下載下傳完解壓,找到conf檔案夾下 nginx.conf。在裡面進行配置。

1、在預設請求中添加代理伺服器配置proxy_pass 和proxy_redirect

#預設請求
        location / {
            #定義伺服器的預設網站根目錄位置
            root   html;
            #定義首頁索引檔案的名稱
            index  index.html index.htm;

            #代理伺服器的配置。與上訴的負載均衡的名要相同
            proxy_pass http://demo.com;  
            # 對發送的URL進行修改(很多時候代理的路徑出問題可以嘗試修改此處)
            proxy_redirect default;
        }
           

2、我這兒是同一個電腦的兩個不同tomcat伺服器,更改端口,在tomcat的conf目錄下找到server.xml更改 Connector。具體如下。也可以是不同電腦的不同路徑,以及各種的負載均衡配置,在下一篇介紹。

<!--tomcat預設端口配置--> 
<Connector port="8088" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
           

改完之後添加一個負載均衡配置,具體如下。 位址隻能到端口。我第一次配置想在端口後面加上具體的項目名,結果導緻nginx始終無法啟動。

#負載均衡配置。有多種配置方式,名稱與下面的配置要相同
    upstream demo.com{
        #服務 位址 權重,數字越大,被通路到的比例越大
        server 127.0.0.1:8080 weight=1;
        server 127.0.0.1:8088 weight=1;
    }
           

整個配置檔案以及詳解如下

#user  nobody;  #運作使用者

#啟動程序,一般設定為和cpu的數量相等
worker_processes  1; 

#全局錯誤日志和pid檔案
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


#工作模式以及連接配接上限數
events {
    
    #單個背景worker process程序的最大并發連結數
    worker_connections  1024;
    #并發總數(max_clients)為 程序數worker_process乘以worker_connections
    #如果作為伺服器的話這個并發總數(max_clients)要除以2。作為反向代理的話要除以4
    #為什麼除以2:該公式基于http 1.1協定,一次請求大多數浏覽器發送兩次連接配接,并不是request和response響應占用兩個線程
    #為什麼除以4:因nginx作為方向代理,用戶端和nginx建立連接配接,nginx和後端伺服器也要建立連接配接

    #worker_connerctions設定的值和實體記憶體大小有關。因為max_clients的數量必須得小于系統可打開的最大檔案數
    #系統可打開的檔案數和記憶體是成正比關系。實際最後的并發總量和配置的有一定的偏差。因為系統中還有其他的程序在運作。
}   


http {
    #設定mime類型,類型由mime.type檔案定義
    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可以指定mginx是否調用sendfile函數來輸出檔案,對應普通應用設定為on,
    #如果用來進行下載下傳等磁盤io負載較重的應用,可設定為off,可以平衡磁盤和網絡I/O的處理速度
    #詳細解釋如下
    #設定為on表示啟動高效傳輸檔案的模式。sendfile可以讓Nginx在傳輸檔案時直接在磁盤和tcp socket之間傳輸資料。
    #如果這個參數不開啟,會先在使用者空間(Nginx程序空間)申請一個buffer,用read函數把資料從磁盤讀到cache,
    #再從cache讀取到使用者空間的buffer,再用write函數把資料從使用者空間的buffer寫入到核心的buffer,
    #最後到tcp socket。開啟這個參數後可以讓資料不用經過使用者buffer。
    sendfile        on;
    #tcp_nopush     on;

    #連接配接逾時時間
    #keepalive_timeout  0;
    keepalive_timeout  65;


    #負載均衡配置。有多種配置方式,名稱與下面的配置要相同
    upstream demo.com{
        #服務 位址 權重,數字越大,被通路到的比例越大
        server 127.0.0.1:8080 weight=1;
        server 127.0.0.1:8088 weight=1;
    }


    #是否開啟gzip壓縮
    #gzip  on;

    #虛拟主機配置
    server {
        #監聽端口
        listen       80;
        #定義使用localhost通路
        server_name  localhost;


        #charset koi8-r;    

        #設定本虛拟主機的通路日志
        #access_log  logs/host.access.log  main;

        #預設請求
        location / {
            #定義伺服器的預設網站根目錄位置
            root   html;
            #定義首頁索引檔案的名稱
            index  index.html index.htm;

            #代理伺服器的配置。與上訴的負載均衡的名要相同
            proxy_pass http://demo.com;  
            # 對發送的URL進行修改(很多時候代理的路徑出問題可以嘗試修改此處)
            proxy_redirect default;
        }
        
             
        
        #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
        #

        #PHP 腳本請求全部轉發到FastCGI處理,使用FastCGI預設配置
        #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
        #

        #禁止通路.ht xxx檔案
        #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;
    #    }
    #}

}
           

       配置完後直接點選nginx.exe啟動,或者在指令行中鍵入到對應的檔案位置執行 start -nginx,啟動後在程序中能看到以下兩個程序。

nginx反向代理中負載均衡基礎配置

    随後打開浏覽器通路localhost:80就能看到效果了。具體效果如下,我是在同一台電腦上開了兩個tomcat,端口分别是8080和8088。有兩個不同的初始頁面,每次通路localhost:80的時候會随機通路其中一個tomcat。

nginx反向代理中負載均衡基礎配置

接下來介紹各種不同的負載均衡配置。

繼續閱讀