作為一個後端開發,你需要了解多少Nginx的知識?
聽說微信搜尋《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的這些概念足夠理解整個架構的執行流程了。如果你同時身兼開發和運維的工作,那麼這些還不夠。學習總是需要不斷向前,我們下期再見。
- 作為一個後端開發,你需要了解多少Nginx的知識?
- 快速理解工廠方法模式,及其在原始碼中的應用
- 公司CEO和我說:在系統優化的時候,不要輕易用多執行緒
- 使用Optional更優雅地處理非空判斷
- 從JVM角度思考--如何預估線上環境機器資源大小
- 用幾張圖深度剖析Java記憶體模型
- 用幾張圖深度剖析Java記憶體模型
- 用了MybatisPlus後,我很久沒有手寫sql了
- 模板方法設計模式理論與應用
- 深入淺出CMS垃圾收集器
- 迭代器模式:理解與實踐
- 粘包和半包有了解過嗎?netty是如何解決這個問題的
- 介面卡模式詳解與應用
- 網路開發的最強大框架:Netty快速入門
- Java常用關鍵字:this、super、final、static、訪問修飾符
- 為什麼說datax是目前最好的異構資料來源資料交換工具
- 為什麼要引入分散式任務排程系統?
- 取經阿里十年技術大佬,得到Java線上問題排查攻略!
- 詳解Java中的BIO、NIO、AIO
- 怎樣才能寫出規範的好程式碼?