由nodejs+nginx搭配而成的高併發伺服器

寶哥哥發表於2018-06-06

由nodejs+nginx搭配而成的高併發伺服器
nginx監聽網站80埠,而nodejs監聽埠是8000,就可以配置nginx反向代理到nodejs的3000埠,同理,也可以配置代理到多個不同的埠,就可以實現 一臺伺服器同時服務多個域名,並且可以讓nginx負責網站的靜態資源請求。有效提高網站的吞吐量和效能!

最簡單的做法

直接修改nginx配置,增加下面配置

server {
    listen       80;                # 監聽80埠
    server_name node.bluej.cn;      # 監聽的域名
    #access_log  /web/nodejs/access.log;     #配置了一下來訪日誌,怕佔用硬碟,關了
    error_log   /web/nodejs/error.log;      #配置了一下錯誤日誌

    ## 針對靜態資源做優化,所有靜態資源由nginx來處理,注意有新的型別記得加進來
    location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js|doc|docx|xls|xlsx|zip|rar|mp3|mp4)$     
    {
        root /web/nodejs;       #指向根目錄
        expires max;            #用來設定快取時間
    }

    ## node執行緒,只負責動態部分
    location /{
        proxy_pass http://127.0.0.1:8000;   #反向代理,指向具體的node監聽埠
        proxy_redirect     off;                           #關閉地址的重定向

        # 在代理請求頭中加入下面的資訊,方便我們用nodejs獲取一些客戶端資訊
        proxy_set_header   Host             $host;        #本機地址(ip或域名)
        proxy_set_header   X-Real-IP        $remote_addr; #客戶端真實ip
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;#客戶端真實ip
    }
}
複製程式碼

常見問題

  1. 訪問頁面超時 有可能是讀取檔案fs.readFile的路徑出問題了,不同環境下,路徑寫法有所區別,正確的相容寫法應該是
    var path = require("path");//引入path模組
    
    path.join(__dirname, "../view/index.html");//引數一,表示你當前檔案所在物理絕對路徑,引數二就是你具體要訪問的路徑了
    複製程式碼
    否則,很容易請求超時,因為無法讀取正確的檔案路徑
  2. nginx訪問靜態檔案,老是報403 Forbidden 原因可能是 nginx沒有訪問目錄的許可權,在 nginx.conf 檔案中,標註了user www www;,所以,我們們網站根目錄所在的父資料夾的擁有者必須也是www使用者,所以,記得設定一下你的目錄擁有者
    chown www:www /web
    複製程式碼
  3. 如何設定我們的nodejs網站可以開機啟動 如果你是用pm2
    pm2 startup
    pm2 save  
    複製程式碼
    就會把你啟動的網站資訊存在 ~/.pm2/dump.pm2,例如 /root/.pm2/dump.pm2
    其它同型別產品一樣道理

如何搞均衡負載

在配置裡,在server段前面加上upstream段

upstream nodejs_upstream {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}
server{
    ...
    location /{
        proxy_pass http://nodejs_upstream
    }
    ...
}
複製程式碼

上面的配置意思是nginx會自動分配請求到多個ip埠地址中,實現均衡負載

參考資料

nginx中的Location配置講解

相關文章