作為一個後端開發,你需要了解多少Nginx的知識?

語言: CN / TW / HK

聽說微信搜尋《Java魚仔》會變更強哦!

本文收錄於JavaStarter ,裡面有我完整的Java系列文章,學習或面試都可以看看哦

(一)概述

最近做的一個專案在遷移公網環境的時候出了一個問題,明明服務都起來了,但是怎樣都訪問不進來。後來才發現是Nginx的配置出了問題。無奈自己關於Nginx的學習在大學畢業後就差不多遺忘了,當時又緊急找不到運維人員,差點就只能以失敗結束遷移。

因此覺得就算是幹後端開發,對於基本的nginx配置依舊需要有所瞭解,於是寫了這篇後端人員應該懂的nginx文章,希望對大家有所幫助。

(二)Nginx入門

nginx是一個高效能的WEB伺服器,Nginx可以實現正向代理、反向代理、負載均衡等功能。比如我現在正在做的一個專案有11臺應用伺服器,就是用nginx做的反向代理。

關於正向代理和反向代理,兩者在概念上有區別,但是在技術實現上完全沒有區別。

正向代理:代理伺服器放在客戶端和服務都能連線到的位置,我們通過訪問代理伺服器從而訪問到目標服務。

反向代理:通過訪問代理伺服器,代理伺服器將請求分發給其他服務,這就是反向代理。

但是在技術上都只需要配置location中的proxy_pass即可。

2.1 安裝

這裡的安裝都在Linux環境下進行,nginx雖然也有window版本,但是還沒有見過哪個專案把nginx放在windows伺服器上的。

執行nginx需要一些環境,這裡需要先安裝完畢:

bash yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel 接著下載nginx的壓縮包,版本視情況而定,這裡用的是1.14.2:

bash wget http://nginx.org/download/nginx-1.14.2.tar.gz 採用預設的方式安裝:

bash ./configure make make install 分別執行完成之後,nginx執行檔案就會安裝到/usr/local/nginx中

通過下面的程式碼檢查是否成功:

bash /usr/local/nginx/sbin/nginx -V

2.2 基本命令

```powershell

配置檔案啟動

./sbin/nginx -c /conf/nginx.conf

指定nginx程式目錄啟動

./sbin/nginx -p /usr/local/nginx

停止:第二種更加優雅

./sbin/nginx -s stop ./sbin/nginx -s quit

過載配置檔案

./sbin/nginx -s reload ```

2.3 代理的相關引數

```powershell proxy_pass #代理服務 proxy_redirect off; #是否允許重定向 proxy_set_header Host $host; #轉發時傳header引數 proxy_set_header X-Forwarded-For $remote_addr; #設定請求的ip地址 proxy_connect_timeout 90; #連線代理服務超時時間 proxy_send_timeout 90; #請求傳送最大時間 proxy_read_timeout 90; #讀取最大時間

快取相關

proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; ```

2.4 設定代理

powershell location /javayz/ { proxy_pass http://127.0.0.1:8080; } 設定完之後當訪問 /javayz時就會代理到本機的8080埠上。

proxy_pass後的url是否加/也有講究,如果加了/則代表絕對根路徑,不帶就是相對根路徑,比如我訪問 http://127.0.0.1/javayz/index.html, 按照上面的配置會轉發到: http://127.0.0.1:8080/javayz/index.html。 如果配置改成這樣:

powershell location /javayz/ { proxy_pass http://127.0.0.1:8080/; } 轉發後的地址變成:http://127.0.0.1:8080/index.html

(三)nginx負載均衡

nginx用的最多的就是負載均衡,通過upstream就能實現負載均衡。

首先我在伺服器上部署了兩個很簡單的SpringBoot專案,其中一個訪問8081埠時返回8081,另一個訪問8082埠時返回8082

java @RestController public class IndexController { @RequestMapping(value = "/",method = RequestMethod.GET) public String index(){ return "8081"; } } 接著配置nginx的負載均衡:

```bash

配置叢集,這段程式碼寫在http塊中

upstream backend { server 127.0.0.1:8081; server 127.0.0.1:8082; }

配置在server塊中

location / { proxy_pass http://backend/; } ```

接著通過curl命令進行訪問:

在這裡插入圖片描述

8081和8082以輪詢的方式執行,如果遇到一臺伺服器的配置比較好,希望負載的時候更多請求打在那臺伺服器上,可以給不同的服務增加比重:

bash upstream backend { server 127.0.0.1:8081 weight=2; server 127.0.0.1:8082 weight=1; }

再次執行curl命令:

在這裡插入圖片描述

upstream的相關引數如下:

bash server 服務ip:埠 weight 權重 max_fails 最多失敗連線的次數,超過就認為主機掛掉了 fail_timeout 重新連線的時間 backup 備用服務 max_conns 允許的最大連線數 slow_start 節點恢復後,等待多少秒後再加入

(四)Nginx負載均衡演算法

Nginx採用的預設負載均衡演算法是輪詢+權重,也就是按照設定的權重逐個輪詢。除此之外,還有許多其他的負載均衡演算法。

ip_hash演算法:對於訪問的ip,他會做一次hash運算,並對當前的負載應用數量做一次取餘運算,這種演算法能保證同一個ip訪問的是同一臺應用伺服器。

bash upstream backend { ip_hash; server 127.0.0.1:8081; server 127.0.0.1:8082; }

url_hash演算法:對於請求的url進行hash運算,這種演算法能保證同一個url訪問的是同一臺應用伺服器。

bash upstream backend { url_hash; server 127.0.0.1:8081; server 127.0.0.1:8082; } least_conn演算法:將請求分發到連線數最少的節點上。

least_time演算法:將請求分配到響應最快的節點上。

(五)Nginx快取

如果每次請求都需要反向代理給應用伺服器,那對頻寬和效能的壓力是很大的,Nginx中有對快取的支援,它可以將那些變化不大的前端靜態頁面載入到快取中,增強整體的效能。

5.1 在http元素下新增快取宣告

該語句放在http元素下

```bash proxy_cache_path /www/javayz/cache levels=1:2 keys_zone=cache_javayz:500m inactive=20d max_size=1g;

proxy_cache_path 快取存放的路徑

levels 快取層級及目錄的位數,1:2表示兩級目錄,第一級目錄用1位16進製表示,第二級目錄用2位16進製表示

keys_zone 快取區記憶體大小

inactive 有效期,如果快取有效期內未使用,則刪除

max_size 儲存快取的硬碟大小

```

5.2 在location中設定快取策略

該語句放在location元素中

```bash

指定快取區,就是上面設定的key_zone

proxy_cache cache_javayz;

快取的key,這裡用請求的全路徑md5做為key

proxy_cache_key $host$uri$is_args$args;

對不通的http狀態碼設定不同的快取時間,下面的配置表示200時才進行快取,快取時間12小時

proxy_cache_valid 200 12h; ```

5.3 訪問生成快取

可能會出現快取生成不了的情況,這時候把user切換成root 在這裡插入圖片描述

訪問一次後快取檔案就在上面的路徑下生成了。

5.4 快取的清除

下載模組:

bash wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz 解壓

bash tar -zxvf ngx_cache_purge-2.3.tar.gz

在nginx的安裝目錄下配置

bash ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_cache_purge-2.3 重新編譯:

bash make

編譯好後會在nginx安裝目錄下多出一個/objs目錄,該目錄下有個nginx檔案,將這個檔案替換到/usr/local/nginx/sbin/中。

檢查是否安裝成功

在這裡插入圖片描述

重新執行後,只需要訪問http://ip:80/clear/,即可清除快取

在這裡插入圖片描述

(六)總結

如果你的公司職責區分嚴格,那麼對於後端開發來說知道nginx的這些概念足夠理解整個架構的執行流程了。如果你同時身兼開發和運維的工作,那麼這些還不夠。學習總是需要不斷向前,我們下期再見。