NodeJS on Nginx: 使用nginx反向代理處理靜態頁面
分類程式設計技巧關鍵字OurJS釋出ourjs2013-11-17
注意 轉載須保留原文連結,譯文連結,作者譯者等資訊。
最近OurJS後臺已經從純node.js遷移到了Nginx+NodeJS上來了,感覺效能提升了不少,特與大家分享。
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),配置比較簡單,一般寫程式的人應該都能看懂,進行之後你輸入
#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 #開機時不啟動