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

最近OurJS後臺已經從純node.js遷移到了Nginx+NodeJS上來了,感受性能提高了很多,特與你們分享。javascript

node_on_ngix

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

儘管Node.JS的性能不錯,但處理靜態事務確實不是他的專長,如:gzip編碼,靜態文件,HTTP緩存,SSL處理,負載平衡和反向代理及多站點代理等,均可以經過nginx來完成,從而減少node.js的負載,並經過nginx強大的緩存來節省您網站的流量從而提升網站的加載速度。html

雖然node.js也有一些如http-proxy的代理模塊能夠實現一臺服務器上面架設多個網站(每一個域名映射到不一樣nodejs進程的端口),但這種基礎性的工做,其實更應該交給ngnix來完成。java

下面咱們能夠看一個多站點代理的例子, 假設你有一個node.js進程正在偵聽8080端口,你但願從domaina.com的進入的鏈接由node.js提供服務,從domainb.com進入的鏈接映射到另外一個靜態文件服務的網站,你可使用下面的ngix.confg(for 1.44),配置比較簡單,通常寫程序的人應該都能看懂,進行以後你輸入http://192.168.0.101http://localhost會看到不一樣的結果.node

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

 

這裏有一篇更加複雜的示例,因爲版本相對陳舊,僅供參考 Using Nginx To Avoid NodeJS Load nginx

 

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

指明你網站運行的端口,由於支持http/https因此有兩個端口:json

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直接提供服務:windows

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 Linux

安裝nginx,使用apt-get 便可

apt-get install nginx


測試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  #開機時不啓動

find / -name 'node' #在根目錄 '/' 查找 node的位置(某些場合會用到)


有時侯nginx在windows下面怎麼殺也殺不死,可使用此腳本 (Windows 2003 測試有效)

taskkill /F /IM nginx.exe > nul
相關文章
相關標籤/搜索