使用nginx負(fù)載均衡nodejs

個(gè)人博客: http://zhangsunyucong.top

前言

這篇文章適合熟悉nodejs的同學(xué)觀看善绎。主要是關(guān)于如何使用nginx做反向代理和負(fù)載均衡nodejs的多個(gè)實(shí)例的配置流程兆解,nodejs實(shí)例可以是分布在同一臺(tái)主機(jī)上或者不同的主機(jī)上的多個(gè)實(shí)例族购。

主要內(nèi)容有

  • 在同一主機(jī)創(chuàng)建nodejs多個(gè)實(shí)例
  • 詳細(xì)講解ngnix.conf文件的每項(xiàng)配置的作用

在同一主機(jī)創(chuàng)建nodejs多個(gè)實(shí)例

我的nodejs環(huán)境:

  • window 7 64位
  • nodejs v8.1.3
  • webstorm 2017版

根目錄/server.js文件

'use strict';

var express = require('express');
var timeout = require('connect-timeout');
var path = require('path');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var app = express();

// 設(shè)置模板引擎,路徑在根目錄+public中
app.set('views', path.join(__dirname, 'public'));
app.set('view engine', 'ejs');

app.use(express.static('public'));

app.use(express.static(path.join(__dirname, 'public')));

// 設(shè)置默認(rèn)超時(shí)時(shí)間
app.use(timeout('15s'));
//請(qǐng)求體
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
//cookie
app.use(cookieParser());
//注冊(cè)HTTP消息頭部信息
app.use(
    function(req, res, next) {
        res.set(
            {
                'Content-Type': 'text/html',
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Rememberme': true,
                'Access-Control-Allow-HttpOnly': false,
                'Access-Control-Allow-Methods': 'POST, GET, PUT, DELETE, OPTIONS',
                'Access-Control-Allow-Credentials': true, //false,
                'Access-Control-Max-Age': '86400', // 24 hours
                'Access-Control-Allow-Headers': 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
            }
        );

        //decodeURI(req.url)
        console.log('%s %s', req.method, req.url);
        next();
    }
);

//首頁(yè)
app.get('/', function(req, res) {
    res.render('index1', { currentTime: new Date() });
});

app.use(function(req, res, next) {
    // 如果任何一個(gè)路由都沒(méi)有返回響應(yīng),則拋出一個(gè) 404 異常給后續(xù)的異常處理器
    if (!res.headersSent) {
        var err = new Error('Not Found');
        err.status = 404;
        next(err);
    }
});

// 錯(cuò)誤處理
app.use(function(err, req, res, next) {
    if (req.timedout && req.headers.upgrade === 'websocket') {
        // 忽略 websocket 的超時(shí)
        return;
    }

    var statusCode = err.status || 500;
    if (statusCode === 500) {
        console.error(err.stack || err);
    }
    if (req.timedout) {
        console.error('請(qǐng)求超時(shí): url=%s, timeout=%d, 請(qǐng)確認(rèn)方法執(zhí)行耗時(shí)很長(zhǎng),或沒(méi)有正確的 response 回調(diào)。', req.originalUrl, err.timeout);
    }
    res.status(statusCode);
    // 默認(rèn)不輸出異常詳情
    var error = {};
    if (app.get('env') === 'development') {
        // 如果是開(kāi)發(fā)環(huán)境,則將異常堆棧輸出到頁(yè)面靠抑,方便開(kāi)發(fā)調(diào)試
        error = err;
    }
    res.render('error', {
        message: err.message,
        error: error
    });
});

function catchGlobalError(err) {
    // 注冊(cè)全局未捕獲異常處理器
    process.on('uncaughtException', function(err) {
        console.error('Caught exception:', err.stack);
    });
    process.on('unhandledRejection', function(reason, p) {
        console.error('Unhandled Rejection at: Promise ', p, ' reason: ', reason.stack);
    });
}

//創(chuàng)建兩個(gè)服務(wù)器實(shí)體
var server = require('http').createServer(app);
var server1 = require('http').createServer(app);

//服務(wù)器監(jiān)聽(tīng)端口
var PORT = parseInt(process.env.PORT || 3000);
var PORT1 = PORT + 1;

server.listen(PORT, function (err) {
    console.log('Node app is running on port:', PORT);
    catchGlobalError(err);
});

server1.listen(PORT1, function (err) {
    console.log('Node app is running on port:', PORT1);
    catchGlobalError(err);
});

根目錄/views/error.ejs

<!DOCTYPE HTML>
<html>
  <head>
    <title>Error</title>
    <link rel="stylesheet" href="/stylesheets/style.css">
  </head>
  <body>
    <h1><%= message %></h1>
    <h2><%= error.status %></h2>
    <pre><%= error.stack %></pre>
  </body>
</html>

根目錄/views/index.ejs

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>nodejs 和 nginx</title>
    
  <link rel="stylesheet" href="./stylesheets/style.css">

</head>
      <body>
      <p><h3>Hello world</h3></p>
      </body>
</html>

ngnix配置文件

nginx.config

#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;
    
    upstream nodeproxy {
        server 192.168.10.137:3000 weight=10;       
        server 127.0.0.1:3001 weight=12;   
    }

    server {
        listen       8089;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass  http://nodeproxy; #與upstream的名稱(chēng)一致
            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
        #
        #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;
    #    }
    #}

}

nginx常用命令

在nginx的安裝根目錄下,打開(kāi)命令行工具适掰,運(yùn)行颂碧。

啟動(dòng)nginx:start nginx
重新加載配置:nginx -s reload
重新打開(kāi)日志:nginx -s reopen

關(guān)閉nginx:
快速停止:nginx -s stop
有序關(guān)閉:nginx -s quit

如果遇到啟動(dòng)不了nginx,可能是監(jiān)聽(tīng)的端口被占用类浪。
使用命令:netstat -aon | findstr :80
查詢(xún)一下

用瀏覽器訪問(wèn)localhost:8089,我的測(cè)試的結(jié)果是:

"D:\WebStorm 2017.2.1\bin\runnerw.exe" D:\nodejs\node.exe D:\collect\leancloud\jiangebuluo\NodeTestDemo\myServer.js
Node app is running on port: 3000
Node app is running on port: 3001
服務(wù)器監(jiān)聽(tīng)的IP: 192.168.10.137
服務(wù)器監(jiān)聽(tīng)的IP: 192.168.10.137
服務(wù)器監(jiān)聽(tīng)的IP: 127.0.0.1
服務(wù)器監(jiān)聽(tīng)的IP: 127.0.0.1
服務(wù)器監(jiān)聽(tīng)的IP: 127.0.0.1
服務(wù)器監(jiān)聽(tīng)的IP: 127.0.0.1
服務(wù)器監(jiān)聽(tīng)的IP: 127.0.0.1
服務(wù)器監(jiān)聽(tīng)的IP: 127.0.0.1
服務(wù)器監(jiān)聽(tīng)的IP: 192.168.10.137
服務(wù)器監(jiān)聽(tīng)的IP: 192.168.10.137


最后

另外貼出一個(gè)ubuntu的詳細(xì)配置講解载城。來(lái)自獵手家園的博客

#定義Nginx運(yùn)行的用戶(hù)和用戶(hù)組
user www www;

#nginx進(jìn)程數(shù),建議設(shè)置為等于CPU總核心數(shù)费就。
worker_processes 8;
 
#全局錯(cuò)誤日志定義類(lèi)型诉瓦,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;

#進(jìn)程pid文件
pid /usr/local/nginx/logs/nginx.pid;

#指定進(jìn)程可以打開(kāi)的最大描述符:數(shù)目
#工作模式與連接數(shù)上限
#這個(gè)指令是指當(dāng)一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開(kāi)文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除力细,但是nginx分配請(qǐng)求并不是那么均勻睬澡,所以最好與ulimit -n 的值保持一致。
#現(xiàn)在在linux 2.6內(nèi)核下開(kāi)啟文件打開(kāi)數(shù)為65535眠蚂,worker_rlimit_nofile就相應(yīng)應(yīng)該填寫(xiě)65535煞聪。
#這是因?yàn)閚ginx調(diào)度時(shí)分配請(qǐng)求到進(jìn)程并不是那么的均衡,所以假如填寫(xiě)10240逝慧,總并發(fā)量達(dá)到3-4萬(wàn)時(shí)就有進(jìn)程可能超過(guò)10240了昔脯,這時(shí)會(huì)返回502錯(cuò)誤。
worker_rlimit_nofile 65535;


events
{
    #參考事件模型笛臣,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本內(nèi)核中的高性能網(wǎng)絡(luò)I/O模型云稚,linux建議epoll,如果跑在FreeBSD上面沈堡,就用kqueue模型碱鳞。
    #補(bǔ)充說(shuō)明:
    #與apache相類(lèi),nginx針對(duì)不同的操作系統(tǒng)踱蛀,有不同的事件模型
    #A)標(biāo)準(zhǔn)事件模型
    #Select、poll屬于標(biāo)準(zhǔn)事件模型贵白,如果當(dāng)前系統(tǒng)不存在更有效的方法率拒,nginx會(huì)選擇select或poll
    #B)高效事件模型
    #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統(tǒng)使用kqueue可能會(huì)造成內(nèi)核崩潰。
    #Epoll:使用于Linux內(nèi)核2.6版本及以后的系統(tǒng)禁荒。
    #/dev/poll:使用于Solaris 7 11/99+猬膨,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    #Eventport:使用于Solaris 10勃痴。 為了防止出現(xiàn)內(nèi)核崩潰的問(wèn)題谒所, 有必要安裝安全補(bǔ)丁。
    use epoll;

    #單個(gè)進(jìn)程最大連接數(shù)(最大連接數(shù)=連接數(shù)*進(jìn)程數(shù))
    #根據(jù)硬件調(diào)整沛申,和前面工作進(jìn)程配合起來(lái)用劣领,盡量大,但是別把cpu跑到100%就行铁材。每個(gè)進(jìn)程允許的最多連接數(shù)尖淘,理論上每臺(tái)nginx服務(wù)器的最大連接數(shù)為。
    worker_connections 65535;

    #keepalive超時(shí)時(shí)間著觉。
    keepalive_timeout 60;

    #客戶(hù)端請(qǐng)求頭部的緩沖區(qū)大小村生。這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來(lái)設(shè)置,一般一個(gè)請(qǐng)求頭的大小不會(huì)超過(guò)1k饼丘,不過(guò)由于一般系統(tǒng)分頁(yè)都要大于1k趁桃,所以這里設(shè)置為分頁(yè)大小。
    #分頁(yè)大小可以用命令getconf PAGESIZE 取得肄鸽。
    #[root@web001 ~]# getconf PAGESIZE
    #4096
    #但也有client_header_buffer_size超過(guò)4k的情況卫病,但是client_header_buffer_size該值必須設(shè)置為“系統(tǒng)分頁(yè)大小”的整倍數(shù)。
    client_header_buffer_size 4k;

    #這個(gè)將為打開(kāi)文件指定緩存贴捡,默認(rèn)是沒(méi)有啟用的忽肛,max指定緩存數(shù)量,建議和打開(kāi)文件數(shù)一致烂斋,inactive是指經(jīng)過(guò)多長(zhǎng)時(shí)間文件沒(méi)被請(qǐng)求后刪除緩存屹逛。
    open_file_cache max=65535 inactive=60s;

    #這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息。
    #語(yǔ)法:open_file_cache_valid time 默認(rèn)值:open_file_cache_valid 60 使用字段:http, server, location 這個(gè)指令指定了何時(shí)需要檢查open_file_cache中緩存項(xiàng)目的有效信息.
    open_file_cache_valid 80s;

    #open_file_cache指令中的inactive參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù)汛骂,如果超過(guò)這個(gè)數(shù)字罕模,文件描述符一直是在緩存中打開(kāi)的,如上例帘瞭,如果有一個(gè)文件在inactive時(shí)間內(nèi)一次沒(méi)被使用淑掌,它將被移除。
    #語(yǔ)法:open_file_cache_min_uses number 默認(rèn)值:open_file_cache_min_uses 1 使用字段:http, server, location  這個(gè)指令指定了在open_file_cache指令無(wú)效的參數(shù)中一定的時(shí)間范圍內(nèi)可以使用的最小文件數(shù),如果使用更大的值,文件描述符在cache中總是打開(kāi)狀態(tài).
    open_file_cache_min_uses 1;
    
    #語(yǔ)法:open_file_cache_errors on | off 默認(rèn)值:open_file_cache_errors off 使用字段:http, server, location 這個(gè)指令指定是否在搜索一個(gè)文件是記錄cache錯(cuò)誤.
    open_file_cache_errors on;
}
 
 
 
#設(shè)定http服務(wù)器蝶念,利用它的反向代理功能提供負(fù)載均衡支持
http
{
    #文件擴(kuò)展名與文件類(lèi)型映射表
    include mime.types;

    #默認(rèn)文件類(lèi)型
    default_type application/octet-stream;

    #默認(rèn)編碼
    #charset utf-8;

    #服務(wù)器名字的hash表大小
    #保存服務(wù)器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的抛腕。參數(shù)hash bucket size總是等于hash表的大小,并且是一路處理器緩存大小的倍數(shù)媒殉。在減少了在內(nèi)存中的存取次數(shù)后担敌,使在處理器中加速查找hash表鍵值成為可能。如果hash bucket size等于一路處理器緩存的大小廷蓉,那么在查找鍵的時(shí)候全封,最壞的情況下在內(nèi)存中查找的次數(shù)為2。第一次是確定存儲(chǔ)單元的地址,第二次是在存儲(chǔ)單元中查找鍵 值刹悴。因此行楞,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一個(gè)參數(shù)的大小.
    server_names_hash_bucket_size 128;

    #客戶(hù)端請(qǐng)求頭部的緩沖區(qū)大小土匀。這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來(lái)設(shè)置子房,一般一個(gè)請(qǐng)求的頭部大小不會(huì)超過(guò)1k,不過(guò)由于一般系統(tǒng)分頁(yè)都要大于1k恒削,所以這里設(shè)置為分頁(yè)大小池颈。分頁(yè)大小可以用命令getconf PAGESIZE取得。
    client_header_buffer_size 32k;

    #客戶(hù)請(qǐng)求頭緩沖大小钓丰。nginx默認(rèn)會(huì)用client_header_buffer_size這個(gè)buffer來(lái)讀取header值躯砰,如果header過(guò)大,它會(huì)使用large_client_header_buffers來(lái)讀取携丁。
    large_client_header_buffers 4 64k;

    #設(shè)定通過(guò)nginx上傳文件的大小
    client_max_body_size 8m;

    #開(kāi)啟高效文件傳輸模式琢歇,sendfile指令指定nginx是否調(diào)用sendfile函數(shù)來(lái)輸出文件,對(duì)于普通應(yīng)用設(shè)為 on梦鉴,如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用李茫,可設(shè)置為off,以平衡磁盤(pán)與網(wǎng)絡(luò)I/O處理速度肥橙,降低系統(tǒng)的負(fù)載魄宏。注意:如果圖片顯示不正常把這個(gè)改成off。
    #sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來(lái)輸出文件存筏,對(duì)于普通應(yīng)用宠互,必須設(shè)為on。如果用來(lái)進(jìn)行下載等應(yīng)用磁盤(pán)IO重負(fù)載應(yīng)用椭坚,可設(shè)置為off予跌,以平衡磁盤(pán)與網(wǎng)絡(luò)IO處理速度,降低系統(tǒng)uptime善茎。
    sendfile on;

    #開(kāi)啟目錄列表訪問(wèn)券册,合適下載服務(wù)器,默認(rèn)關(guān)閉垂涯。
    autoindex on;

    #此選項(xiàng)允許或禁止使用socke的TCP_CORK的選項(xiàng)烁焙,此選項(xiàng)僅在使用sendfile的時(shí)候使用
    tcp_nopush on;
     
    tcp_nodelay on;

    #長(zhǎng)連接超時(shí)時(shí)間,單位是秒
    keepalive_timeout 120;

    #FastCGI相關(guān)參數(shù)是為了改善網(wǎng)站的性能:減少資源占用耕赘,提高訪問(wèn)速度骄蝇。下面參數(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; #開(kāi)啟gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩沖區(qū)
    gzip_http_version 1.0;    #壓縮版本(默認(rèn)1.1鞠苟,前端如果是squid2.5請(qǐng)使用1.0)
    gzip_comp_level 2;    #壓縮等級(jí)
    gzip_types text/plain application/x-javascript text/css application/xml;    #壓縮類(lèi)型,默認(rèn)就已經(jīng)包含textml,所以下面就不用再寫(xiě)了当娱,寫(xiě)上去也不會(huì)有問(wèn)題吃既,但是會(huì)有一個(gè)warn。
    gzip_vary on;

    #開(kāi)啟限制IP連接數(shù)的時(shí)候需要使用
    #limit_zone crawler $binary_remote_addr 10m;



    #負(fù)載均衡配置
    upstream piao.jd.com {
     
        #upstream的負(fù)載均衡跨细,weight是權(quán)重鹦倚,可以根據(jù)機(jī)器配置定義權(quán)重。weigth參數(shù)表示權(quán)值冀惭,權(quán)值越高被分配到的幾率越大震叙。
        server 127.0.0.1:3000 weight=3;
        server 127.0.0.1:3001 weight=2;

        #nginx的upstream目前支持4種方式的分配
        #1、輪詢(xún)(默認(rèn))
        #每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器散休,如果后端服務(wù)器down掉媒楼,能自動(dòng)剔除。
        #2戚丸、weight
        #指定輪詢(xún)幾率划址,weight和訪問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況限府。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2夺颤、ip_hash
        #每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器胁勺,可以解決session的問(wèn)題世澜。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3、fair(第三方)
        #按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求署穗,響應(yīng)時(shí)間短的優(yōu)先分配寥裂。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4、url_hash(第三方)
        #按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求蛇捌,使每個(gè)url定向到同一個(gè)后端服務(wù)器抚恒,后端服務(wù)器為緩存時(shí)比較有效。
        #例:在upstream中加入hash語(yǔ)句络拌,server語(yǔ)句中不能寫(xiě)入weight等其他的參數(shù)俭驮,hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}

        #tips:
        #upstream bakend{#定義負(fù)載均衡設(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;
        #}
        #在需要使用負(fù)載均衡的server中增加 proxy_pass http://bakend/;

        #每個(gè)設(shè)備的狀態(tài)設(shè)置為:
        #1.down表示單前的server暫時(shí)不參與負(fù)載
        #2.weight為weight越大,負(fù)載的權(quán)重就越大春贸。
        #3.max_fails:允許請(qǐng)求失敗的次數(shù)默認(rèn)為1.當(dāng)超過(guò)最大次數(shù)時(shí)混萝,返回proxy_next_upstream模塊定義的錯(cuò)誤
        #4.fail_timeout:max_fails次失敗后,暫停的時(shí)間萍恕。
        #5.backup: 其它所有的非backup機(jī)器down或者忙的時(shí)候逸嘀,請(qǐng)求backup機(jī)器。所以這臺(tái)機(jī)器壓力會(huì)最輕允粤。

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

        #域名可以有多個(gè),用空格隔開(kāi)
        server_name www.jd.com jd.com;
        index index.html index.htm index.php;
        root /data/www/jd;

        #對(duì)******進(jìn)行負(fù)載均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #圖片緩存時(shí)間設(shè)置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS緩存時(shí)間設(shè)置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日志格式設(shè)定
        #$remote_addr與$http_x_forwarded_for用以記錄客戶(hù)端的ip地址司光;
        #$remote_user:用來(lái)記錄客戶(hù)端用戶(hù)名稱(chēng)琅坡;
        #$time_local: 用來(lái)記錄訪問(wèn)時(shí)間與時(shí)區(qū);
        #$request: 用來(lái)記錄請(qǐng)求的url與http協(xié)議残家;
        #$status: 用來(lái)記錄請(qǐng)求狀態(tài)榆俺;成功是200,
        #$body_bytes_sent :記錄發(fā)送給客戶(hù)端文件主體內(nèi)容大形牖础茴晋;
        #$http_referer:用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的;
        #$http_user_agent:記錄客戶(hù)瀏覽器的相關(guān)信息回窘;
        #通常web服務(wù)器放在反向代理的后面诺擅,這樣就不能獲取到客戶(hù)的IP地址了,通過(guò)$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址毫玖。反向代理服務(wù)器在轉(zhuǎn)發(fā)請(qǐng)求的http頭信息中掀虎,可以增加x_forwarded_for信息,用以記錄原有客戶(hù)端的IP地址和原來(lái)客戶(hù)端的請(qǐng)求的服務(wù)器地址付枫。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定義本虛擬主機(jī)的訪問(wèn)日志
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #對(duì) "/" 啟用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #后端的Web服務(wù)器可以通過(guò)X-Forwarded-For獲取用戶(hù)真實(shí)IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置烹玉,可選。
            proxy_set_header Host $host;

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

            #緩沖區(qū)代理緩沖用戶(hù)端請(qǐng)求的最大字節(jié)數(shù)阐滩,
            #如果把它設(shè)置為比較大的數(shù)值二打,例如256k,那么掂榔,無(wú)論使用firefox還是IE瀏覽器继效,來(lái)提交任意小于256k的圖片,都很正常装获。如果注釋該指令瑞信,使用默認(rèn)的client_body_buffer_size設(shè)置,也就是操作系統(tǒng)頁(yè)面大小的兩倍穴豫,8k或者16k凡简,問(wèn)題就出現(xiàn)了。
            #無(wú)論使用firefox4.0還是IE8.0精肃,提交一個(gè)比較大秤涩,200k左右的圖片,都返回500 Internal Server Error錯(cuò)誤
            client_body_buffer_size 128k;

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

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

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

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

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

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

            #高負(fù)荷下緩沖大斜亓(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #設(shè)置在寫(xiě)入proxy_temp_path時(shí)數(shù)據(jù)的大小,預(yù)防一個(gè)工作進(jìn)程在傳遞文件時(shí)阻塞太長(zhǎng)
            #設(shè)定緩存文件夾大小后频,大于這個(gè)值,將從upstream服務(wù)器傳
            proxy_temp_file_write_size 64k;
        }
         
         
        #設(shè)定查看Nginx狀態(tài)的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的內(nèi)容可以用apache提供的htpasswd工具來(lái)產(chǎn)生暖途。
        }
         
        #本地動(dòng)靜分離反向代理配置
        #所有jsp的頁(yè)面均交由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;
        }
         
        #所有靜態(tài)文件由nginx直接讀取不經(jīng)過(guò)tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卑惜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驻售,更是在濱河造成了極大的恐慌露久,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欺栗,死亡現(xiàn)場(chǎng)離奇詭異毫痕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)迟几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)消请,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人类腮,你說(shuō)我怎么就攤上這事臊泰。” “怎么了蚜枢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵缸逃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我厂抽,道長(zhǎng)需频,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任筷凤,我火速辦了婚禮昭殉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嵌施。我一直安慰自己饲化,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布吗伤。 她就那樣靜靜地躺著吃靠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪足淆。 梳的紋絲不亂的頭發(fā)上巢块,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天礁阁,我揣著相機(jī)與錄音,去河邊找鬼族奢。 笑死姥闭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的越走。 我是一名探鬼主播棚品,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼廊敌!你這毒婦竟也來(lái)了铜跑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤骡澈,失蹤者是張志新(化名)和其女友劉穎锅纺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肋殴,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囤锉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了护锤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官地。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烙懦,靈堂內(nèi)的尸體忽然破棺而出区丑,到底是詐尸還是另有隱情,我是刑警寧澤修陡,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布沧侥,位于F島的核電站,受9級(jí)特大地震影響魄鸦,放射性物質(zhì)發(fā)生泄漏宴杀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一拾因、第九天 我趴在偏房一處隱蔽的房頂上張望旺罢。 院中可真熱鬧,春花似錦绢记、人聲如沸扁达。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跪解。三九已至,卻和暖如春签孔,著一層夾襖步出監(jiān)牢的瞬間叉讥,已是汗流浹背窘行。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留图仓,地道東北人罐盔。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像救崔,于是被迫代替她去往敵國(guó)和親惶看。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容