nginx深刻使用

 1. nginx使用命令

nginx -s stop       --快速關閉Nginx,可能不保存相關信息,並迅速終止web服務。
nginx -s quit       --平穩關閉Nginx,保存相關信息,有安排的結束web服務。
nginx -s reload     --因改變了Nginx相關配置,須要從新加載配置而重載。
nginx -s reopen     --從新打開日誌文件。
nginx -c filename   --爲 Nginx 指定一個配置文件,來代替缺省的。
nginx -t            --不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,並嘗試打開配置文件中所引用到的文件。
nginx -v            --顯示 nginx 的版本。
nginx -V            --顯示 nginx 的版本,編譯器版本和配置參數。

2. nginx配置文件內容詳析

基於http反向代理的配置javascript

#運行用戶
#user  nobody;

#啓動進程,一般設置成和cpu的數量相等
worker_processes  1;

#全局錯誤日誌
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#PID文件,記錄當前啓動的nginx的進程ID
#pid        logs/nginx.pid;

#工做模式及鏈接數上限
events {
    worker_connections  1024;    #單個後臺worker process進程的最大併發連接數
}

#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
    #設定mime類型(郵件支持類型),類型由mime.types文件定義
    include       mime.types;
    default_type  application/octet-stream;

    #設定日誌
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
    #必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
    sendfile        on;
    #tcp_nopush     on;

    #鏈接超時時間
    keepalive_timeout  65;

    #gzip壓縮開關
    #gzip  on;

    #設定實際的服務器列表,可設置權重
    upstream server.lb{
        server localhost:8089 weight=10;
        server localhost:8090 weight=5;
        ip_hash;
    }
    
    #http服務器
    server {
        #監聽80端口,80端口是知名端口號,用於HTTP協議
        listen       80;
        
        #定義使用localhost訪問,當有具體的域名可使用具體域名如www.xx.com
        server_name  localhost;

        #編碼格式
        charset utf-8;

        #access_log  logs/host.access.log  main;
    
        location / {
            root   html;   #靜態文件,nginx本身處理
            proxy_pass http://server.lb;   #反向代理的路徑(和upstream綁定),location 後面設置映射的路徑
            index  index.html index.htm;
        }

        #錯誤處理頁面4xx,5xx(可選擇性配置)
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}}

3. 實際經常使用的負載均衡配置

3.1 多個相同服務的負載均衡

如 nginx安裝及配置 中,將應用部署在同一機器上的多個tomcat中,經過不一樣端口訪問造成的僞集羣,在實際運營中爲防止單臺機器掛掉致使應用不可訪問,一般是有多臺服務器運行着一樣的服務。css

如:將應用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三臺 linux 環境的服務器上。網站域名叫 www.helloworld.com,公網 IP 爲 192.168.1.11。在公網 IP 所在的服務器上部署 nginx,對全部請求作負載均衡處理。html

nginx.conf 配置以下:前端

http {
     #設定mime類型,類型由mime.type文件定義
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #設定日誌格式
    access_log    /var/log/nginx/access.log;

    #設定負載均衡的服務器列表
    upstream load.balance.server {
        #weigth參數表示權值,權值越高被分配到的概率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }

   #HTTP服務器
   server {
        #偵聽80端口
        listen       80;

        #定義使用www.xx.com訪問
        server_name  www.helloworld.com;

        #對全部請求進行負載均衡請求
        location / {
            root        /root;                 #定義服務器的默認網站根目錄位置
            index       index.html index.htm;  #定義首頁索引文件的名稱
            proxy_pass  http://load.balance.server ;#請求轉向load_balance_server 定義的服務器列表

            #如下是一些反向代理的配置(可選擇性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟後端服務器鏈接超時時間(代理鏈接超時)
            proxy_send_timeout 90;             #後端服務器數據回傳時間(代理髮送超時)
            proxy_read_timeout 90;             #鏈接成功後,後端服務器響應時間(代理接收超時)
            proxy_buffer_size 4k;              #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
            proxy_buffers 4 32k;               #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置
            proxy_busy_buffers_size 64k;       #高負荷下緩衝大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #設定緩存文件夾大小,大於這個值,將從upstream服務器傳

            client_max_body_size 10m;          #容許客戶端請求的最大單文件字節數
            client_body_buffer_size 128k;      #緩衝區代理緩衝用戶端請求的最大字節數
        }
    }
}

3.2 分佈式應用的負載均衡

當一個網站功能愈來愈豐富時,每每須要將一些功能相對獨立的模塊剝離出來,獨立維護。這樣的話,一般,會有多個 webapp。html5

舉個例子:假如 www.helloworld.com 站點有好幾個 webapp,finance(金融)、product(產品)、admin(用戶中心)。訪問這些應用的方式經過上下文(context)來進行區分:java

www.helloworld.com/finance/linux

www.helloworld.com/product/nginx

www.helloworld.com/admin/web

咱們知道,http 的默認端口號是 80,若是在一臺服務器上同時啓動這 3 個 webapp 應用,都用 80 端口,確定是不成的。因此,這三個應用須要分別綁定不一樣的端口號。shell

那麼,問題來了,用戶在實際訪問 www.helloworld.com 站點時,訪問不一樣 webapp,總不會還帶着對應的端口號去訪問吧。因此,你再次須要用到反向代理來作處理。

http {
    #此處省略一些基本配置

    upstream product.server{
        server www.helloworld.com:8081;
    }

    upstream admin.server{
        server www.helloworld.com:8082;
    }

    upstream finance.server{
        server www.helloworld.com:8083;
    }

    server {
        #此處省略一些基本配置
        #默認指向product的server
        location / {
            proxy_pass http://product.server;
        }

        location /product/{
            proxy_pass http://product.server;
        }

        location /admin/ {
            proxy_pass http://admin.server;
        }

        location /finance/ {
            proxy_pass http://finance.server;
        }
    }
}

3.3 https反向代理

一些對安全性要求比較高的站點,可能會使用 HTTPS(一種使用 ssl 通訊標準的安全 HTTP 協議)。

使用 nginx 配置 https 須要知道幾點:

  • HTTPS 的固定端口號是 443,不一樣於 HTTP 的 80 端口
  • SSL 標準須要引入安全證書,因此在 nginx.conf 中你須要指定證書和它對應的 key

配置以下

#HTTP服務器
  server {
      #監聽443端口。443爲知名端口號,主要用於HTTPS協議
      listen       443 ssl;

      #定義使用www.xx.com訪問
      server_name  www.helloworld.com;

      #ssl證書文件位置(常見證書文件格式爲:crt/pem)
      ssl_certificate      cert.pem;
      #ssl證書key位置
      ssl_certificate_key  cert.key;

      #ssl配置參數(選擇性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #數字簽名,此處使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

      location / {
          root   /root;
          index  index.html index.htm;
      }
  }

3.4 靜態站點配置

有時候,咱們須要配置靜態站點(即 html 文件和一堆靜態資源)。

舉例來講:若是全部的靜態資源都放在了  /app/dist 目錄下,咱們只須要在 nginx.conf 中指定首頁以及這個站點的 host 便可。

worker_processes  1;

events {
    worker_connections  1024;
}

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

    gzip on;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
    gzip_vary on;

    server {
        listen       80;
        server_name  static.zp.cn;

        location / {
            root /app/dist;
            index index.html;
            #轉發任何請求到 index.html
        }
    }
}

3.5 跨域問題

跨域是指a頁面想獲取b頁面資源,若是a、b頁面的協議、域名、端口、子域名不一樣,所進行的訪問行動都是跨域的,而瀏覽器爲了安全問題通常都限制了跨域訪問,也就是不容許跨域請求資源。

瀏覽器跨域的解決方式有不少種:

  • 1. 客戶端 jsonp 須要目標服務器配合一個callback函數。
  • 2. window.name+iframe 須要目標服務器響應window.name。
  • 3. window.location.hash+iframe 一樣須要目標服務器做處理。
  • 4. html5的 postMessage+ifrme 這個也是須要目標服務器或者說是目標頁面寫一個postMessage,主要側重於前端通信。
  • 5. CORS  須要服務器設置header :Access-Control-Allow-Origin。
    • vi /etc/nginx/nginx.conf
    • http {
        ###start####
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Headers X-Requested-With;
        add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
        ###end ###
      }
  • 6. nginx反向代理 這個方法通常不多有人說起,可是他能夠不用目標服務器配合,不過須要你搭建一箇中轉nginx服務器,用於轉發請求。
    • 主要配置以下
    • 經過A網站(部署於http://localhost:81)訪問B網站(部署於http://localhost:82)信息,A網站中直接訪問    http://localhost:82/api/values 會失敗,須要在nginx.conf中進行以下配置,以後經過訪問該中轉服務器的地址 /apis/api/values 訪問便可。
    • server {
              listen       80; #監聽80端口,能夠改爲其餘端口
              server_name  localhost; # 當前服務的域名
      
              #charset koi8-r;
      
              #access_log  logs/host.access.log  main;
      
              location / {
                  proxy_pass http://localhost:81;
                  proxy_redirect default;
              }
      
              location /apis { #添加訪問目錄爲/apis的代理配置
                  rewrite  ^/apis/(.*)$ /$1 break;
                  proxy_pass   http://localhost:82;
             }

       

解釋以下:

  • 由配置信息可知,咱們讓nginx監聽localhost的80端口,網站A與網站B的訪問都是通過localhost的80端口進行訪問;
  • 咱們特殊配置了一個「/apis」目錄的訪問,而且對url執行了重寫,最後使以「/apis」開頭的地址都轉到「http://localhost:82」進行處理;
  • rewrite  ^/apis/(.*)$ /$1 break; 表明重寫攔截進來的請求,而且只能對域名後邊以「/apis」開頭的起做用,例如www.a.com/apis/msg?x=1重寫。只對/apis重寫。
    • rewrite後面的參數是一個簡單的正則 ^/apis/(.*)$ ,$1表明正則中的第一個(),$2表明第二個()的值,以此類推。
    • break表明匹配一個以後中止匹配。

 

轉自:

http://www.javashuo.com/article/p-usyhmvsx-cr.html

http://www.javashuo.com/article/p-xnqelzeg-kq.html

參考:cors解釋

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

相關文章
相關標籤/搜索