一些Nginx的使用記錄

Nginx

Nginx作爲一款反向代理服務器,現在大多數網站都有使用,自己在項目中幾乎都有用到,自己的網站也使用到了它。


瞭解Nginx

上面圖可以直觀的看出Nginx的用處,可以將請求轉發至Web服務器和文件服務器,當然還可以轉發其他的內容,比如Rest接口,TCP端口等等。



使用Nginx

Nginx安裝成功後,大部分內容都是配置在nginx.conf文件中。

負載均衡

如果是在同一臺服務器上運行了多個Web服務,需要做負載均衡,首先只需要在nginx.conf中配置 upstream 參數,設置好所有的服務請求路徑,爲這些服務配置好權重以及其他連接參數。

 upstream tuling {
     server 127.0.0.1:8050    weight=1  max_fails=1  fail_timeout=20;
     server 127.0.0.1:8060    weight=1;
 }

這樣就可以通過 server 參數來監聽指定端口,通過 location 來轉發到設置好的負載均衡服務上。

設置HTTPS

Nginx設置HTTPS十分簡單,HTTPS端口一般爲443端口,我們只需要監聽443,配置好HTTPS證書,重啓Nginx服務後立刻就會生效。

server {
    listen       443;
    server_name  yanzhenyidai.com;

    ssl on;
    ssl_certificate      /usr/local/nginx/cert/www.yanzhenyidai.com.pem;
    ssl_certificate_key  /usr/local/nginx/cert/www.yanzhenyidai.com.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        #proxy_pass      http://localhost:4000;
        proxy_pass      http://localhost:3000;
        client_max_body_size 3000m;
        proxy_http_version 1.1;
        proxy_redirect     off;
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

    }
}

而對外開放的80端口,通常是使用 rewrite 轉發到監聽的443端口,這樣無論怎麼請求都是走的HTTPS。

Nginx監聽指定域名

Nginx也可以做到監聽指定的域名,通過配置 server_name 來處理。

需要注意到的是,如果配置文件中沒有進行server_name的配置,但是有域名解析到了服務器,這個時候Nginx會將該域名轉發到配置中的第一個server上。

類似情況也會有惡意解析域名到服務器的事情發生,比如有人知道你的服務器IP,將自己的域名直接解析到你的服務器,這樣收割流量,解決方案比較也同樣比較噁心,只需要在第一個server下的localtion中轉發到一個靜態頁面提示就可以了。

server {
      listen       80;
      server_name  *.com;

      location / {
           index   error.html;
      }
  }

Nginx的location轉發配置

這裏還要着重說明 location 參數,畢竟Nginx是一款反向代理服務器,看家本事都在location上面。

    Location區段匹配示例
    
    location = / {
      # 只匹配 / 的查詢.
      [ configuration A ]
    }
    location / {
      # 匹配任何以 / 開始的查詢,但是正則表達式與一些較長的字符串將被首先匹配。
      [ configuration B ]
    }
    location ^~ /images/ {
      # 匹配任何以 /images/ 開始的查詢並且停止搜索,不檢查正則表達式。
      [ configuration C ]
    }
    location ~* \.(gif|jpg|jpeg)$ {
      # 匹配任何以gif, jpg, or jpeg結尾的文件,但是所有 /images/ 目錄的請求將在Configuration C中處
      理。
      [ configuration D ]
    } 
    
    各請求的處理如下例:
    ■/ → configuration A
    ■/documents/document.html → configuration B
    ■/images/1.gif → configuration C
    ■/documents/1.jpg → configuration D

切記如果配置第三種轉發一定要帶 / 結尾,畢竟是喫過虧的人。😂

遇到過的問題

如果有服務請求轉發超過60s的,需要自己在location下增加 proxy_send_timeout 的時間。

如果是客戶端請求到Nginx的響應時間過長,則需要設置http下的 client_body_timeout 的時間。

如果是服務端Nginx返回給客戶端響應時間過長,則要設置 send_timeout 的時間。



總結

Nginx開源後淘寶將Nginx進行了優化,項目名稱Tengine,總而言之,Nginx真的是一款很棒的服務器,


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章