1. 程式人生 > >NodeJS on Nginx: 使用nginx反向代理處理靜態頁面

NodeJS on Nginx: 使用nginx反向代理處理靜態頁面

分類程式設計技巧關鍵字OurJS釋出ourjs2013-11-17
注意 轉載須保留原文連結,譯文連結,作者譯者等資訊。  

最近OurJS後臺已經從純node.js遷移到了Nginx+NodeJS上來了,感覺效能提升了不少,特與大家分享。

node_on_ngix

Nginx ("engine x") 是一個高效能的 HTTP 和 反向代理伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0釋出於2004年10月4日。其將原始碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源的消耗而聞名。

儘管Node.JS的效能不錯,但處理靜態事務確實不是他的專長,如:gzip編碼,靜態檔案,HTTP快取,SSL處理,負載平衡和反向代理及多站點代理等,都可以通過nginx來完成,從而減小node.js的負載,並通過nginx強大的快取來節省您網站的流量從而提高網站的載入速度。

雖然node.js也有一些如http-proxy的代理模組可以實現一臺伺服器上面架設多個網站(每個域名對映到不同nodejs程序的埠),但這種基礎性的工作,其實更應該交給ngnix來完成。

下面我們可以看一個多站點代理的例子, 假設你有一個node.js程序正在偵聽8080埠,你希望從domaina.com的進入的連線由node.js提供服務,從domainb.com進入的連線對映到另一個靜態檔案服務的網站,你可以使用下面的ngix.confg(for 1.44),配置比較簡單,一般寫程式的人應該都能看懂,進行之後你輸入

http://192.168.0.101http://localhost會看到不同的結果.

#user  nobody;
worker_processes  2;

error_log  logs/error.log;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip    on;
    gzip_min_length 1k;
    gzip_buffers    4 8k;
    gzip_http_version   1.1;
    gzip_types  text/plain application/x-javascript text/css application/xml;

    upstream node_app {
        server 127.0.0.1:8080;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://node_app;
        }
    }

    # static server
    server {
        listen       80;
        server_name  192.168.0.101;

        location / {
            root   D:\GitHub\areu\web;
            index  home.html;
        }
    }
}

簡單說明一下,各個部分的作用

指明你網站執行的埠,因為支援http/https所以有兩個埠:

http {
    ...
    upstream silly_face_society_upstream {
      server 127.0.0.1:61337;
      server 127.0.0.1:61338;
      keepalive 64;
    }
    ...
}

靜態檔案攔截器,將以images/js/img/css...開頭的地址對映到網站目錄,由ngnix直接提供服務:

http {
    ...
    server {
        ...
        location ~ ^/(images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
          root /usr/local/silly_face_society/node/public;
          access_log off;
          expires max;
        }
        ...
    }
}

設定快取

http {
    ...
    proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m;
    proxy_temp_path /var/tmp;
    ...
}

設定Gzip壓縮

http {
    ...
    gzip on;
    gzip_comp_level 6;
    gzip_vary on;
    gzip_min_length  1000;
    gzip_proxied any;
    gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_buffers 16 8k;
    ...
}

最後將非靜態檔案交給nodejs程序去響應:

http {
    ...
    server {
        ...
        location / {
          proxy_redirect off;
          proxy_set_header   X-Real-IP            $remote_addr;
          proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_set_header   Host                   $http_host;
          proxy_set_header   X-NginX-Proxy    true;
          ...
          proxy_set_header   Connection "";
          proxy_http_version 1.1;
          proxy_pass         http://silly_face_society_upstream;
        }
        ...
    }
}


分享幾個nginx除錯命令: Debian


測試nginx配置檔案

nginx -t -c /etc/nginx/nginx.conf 

重啟nginx伺服器

/etc/init.d/nginx restart

設定某指令碼開機啟動

sudo chmod 755 /etc/init.d/foobar
sudo update-rc.d foobar defaults     #開機時啟動
sudo update-rc.d -f foobar remove  #開機時不啟動