# 2.5.Node + Nginx

* Why Nginx?
  * 負載均衡
    * 負載均衡的目的是為了單個節點過大, 造成Web服務回應速度過慢, 嚴重導致服務癱瘓, 無法正常提供服務
  * Nginx
    * Nginx是一個負載均衡服務器(Load Balancer), 由Nginx前置頂住壓力, 後面多個node server完成業務支撑。
    * 實現負載均衡常用的Web服務器有Nginx、HAProxy、LVS、Apache等
  * Nginx的內置負載策略 (Load Balance)
    * 透過upstream模組來實現, 共有三種方式:
      * 1.輪詢 (Round Robin): Nginx以事先定好的順序, 讓輪流server們輪流處理requset, 也是預設的分配方式
      * 2.最少連結 (Least Connections): Request將會給當下連線數量最少的server
      * 3.Ip-Hash/Sticky Sessions:綁定處理請求的服務器。第一次請求時, 根據客户端的IP算出一个HASH值, 將請求分配到集群中的某一台服務器上. 後面該客户端的所有請求, 都將透過HASH算法找到之前處理這台客户端請求的服务器, 然後將請求交给它来處理.
      *   4.權重(Weight):

          ```
          http {
             upstream node_server_pool {
                server 192.168.0.100:8080 weight=2;  # 2/6次
                server 192.168.0.101:8080 weight=3;  # 3/6次
                server 192.168.0.102:8080 weight=1;  # 1/6次
              }
            server{
              listen       80;
               server_name localhost;
              location /
              {
                proxy_pass http://node_server_pool;
              }
          }
          ```
*   Install Nginx on Ubuntu 14.04 LTS

    ```
    sudo apt-get update
    sudo apt-get install nginx
    ```
* config balance loader
  *   example

      ```
      sudo nano /etc/nginx/nginx.conf
      worker_processes  1;
        events {
          worker_connections  1024;
        }
        http {
           upstream node_server_pool {
             server localhost:3001 max_fails=1;
             server localhost:3000 max_fails=1;
            }
        server{
          listen       80;
          server_name localhost;
          location /
          {
            proxy_pass http://node_server_pool;
           }
        }
      }
      ```
* config Nginx cahe server
  *   config

      ```
        # Expire rules for static content

        # cache.appcache, your document html and data
        location ~* \.(?:manifest|appcache|html?|xml|json)$ {
          expires -1;
          # access_log logs/static.log; # I don't usually include a static log
        }

        # Feed
        location ~* \.(?:rss|atom)$ {
            expires 1h;
          add_header Cache-Control "public";
        }

      # Media: images, icons, video, audio, HTC
      location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
          expires 1M;
        access_log off;
        add_header Cache-Control "public";
      }

      # CSS and Javascript
      location ~* \.(?:css|js)$ {
        expires 1y;
        access_log off;
        add_header Cache-Control "public";
      }
      ```
  * check if cache control enable
  * reference
* Reference:
  * [http://blog.csdn.net/xyang81/article/details/51702900](http://blog.csdn.net/xyang81/article/details/51702900)
