前言
剛工作那會(huì),最常見的報(bào)錯(cuò)是500 Internal Server Error
,曾經(jīng)也碰到過前端反饋502 Bad Gateway
或者 504 Gateway Time-out
,那時(shí)候傻傻的搞不懂,以為這種都是外部服務(wù)或者網(wǎng)絡(luò)運(yùn)維部那邊的問題。
當(dāng)時(shí)那個(gè)服務(wù)里正好有個(gè)調(diào)用日志,平時(shí)會(huì)記錄各種200,4xx狀態(tài)碼的信息。于是我跑到服務(wù)日志里去搜索了一下502這個(gè)數(shù)字,毫無發(fā)現(xiàn)。于是跟反映錯(cuò)誤的前端說,“服務(wù)日志里并沒有502的記錄,你是不是搞錯(cuò)啦?”
現(xiàn)在想想,果然那時(shí)候還是個(gè)小白。。。
502和504區(qū)別—都是Nginx返回的
我們實(shí)際企業(yè)級(jí)應(yīng)用,訪問肯定是有nginx這層代理的,如下圖所示:
有了nginx這一中間層后,客戶端從直連服務(wù)端,變成客戶端直連nginx,再由nginx直連服務(wù)端。從一個(gè)TCP連接變成兩個(gè)TCP連接。
于是,當(dāng)服務(wù)器發(fā)生異常時(shí),nginx發(fā)送給服務(wù)器的那條TCP連接就不能正常響應(yīng),nginx在得到這一信息后,就會(huì)返回5xx錯(cuò)誤碼給客戶端,也就是說5xx的報(bào)錯(cuò),其實(shí)是由nginx識(shí)別出來,并返回給客戶端的,服務(wù)端本身,并不會(huì)有5xx的日志信息。所以上面說到的,前端收到了我服務(wù)的502報(bào)錯(cuò),但我在自己的服務(wù)日志里卻搜索不到這一信息。
502錯(cuò)誤和504錯(cuò)誤都表示前端訪問后端服務(wù)器時(shí)出現(xiàn)了問題,但它們之間有以下區(qū)別:
502錯(cuò)誤(Bad Gateway):
- 502錯(cuò)誤是指反向代理服務(wù)器(如Nginx)作為中間代理,在請(qǐng)求轉(zhuǎn)發(fā)過程中從后端服務(wù)器接收到了無效的響應(yīng)。
- 502錯(cuò)誤通常與后端服務(wù)器的故障、崩潰、無響應(yīng)或錯(cuò)誤配置等問題有關(guān)。
- 反向代理服務(wù)器無法獲取有效的響應(yīng),因此返回502錯(cuò)誤給前端客戶端。
- 502錯(cuò)誤表示中間代理服務(wù)器與后端服務(wù)器之間的通信存在問題。
504錯(cuò)誤(Gateway Timeout):
- 504錯(cuò)誤是指反向代理服務(wù)器在規(guī)定的時(shí)間內(nèi)無法從后端服務(wù)器獲取到有效的響應(yīng)。
- 504錯(cuò)誤通常與后端服務(wù)器的響應(yīng)超時(shí)有關(guān),即后端服務(wù)器處理請(qǐng)求的時(shí)間超過了反向代理服務(wù)器設(shè)置的超時(shí)時(shí)間。
- 反向代理服務(wù)器在規(guī)定時(shí)間內(nèi)未收到有效的響應(yīng),因此返回504錯(cuò)誤給前端客戶端。
- 504錯(cuò)誤表示反向代理服務(wù)器在等待后端服務(wù)器響應(yīng)時(shí)超時(shí)。
access.log和error.log介紹
在Nginx中,access.log和error.log是兩個(gè)重要的日志文件,用于記錄服務(wù)器的訪問和錯(cuò)誤信息。下面是關(guān)于這兩個(gè)日志文件的介紹:
- access.log:
- access.log是Nginx服務(wù)器記錄所有訪問請(qǐng)求的日志文件。
- 它包含了每個(gè)請(qǐng)求的詳細(xì)信息,如訪問時(shí)間、客戶端IP地址、請(qǐng)求方法、請(qǐng)求的URL、HTTP協(xié)議版本、返回的狀態(tài)碼、傳輸字節(jié)數(shù)等。
- access.log對(duì)于分析和監(jiān)視服務(wù)器的訪問模式、流量分析、性能調(diào)優(yōu)和安全審計(jì)非常有用。
- 默認(rèn)情況下,access.log文件位于Nginx的安裝目錄下的
logs
文件夾中,可以通過在配置文件中進(jìn)行配置來更改日志文件的位置和格式。
- error.log:
- error.log是Nginx服務(wù)器記錄所有錯(cuò)誤和警告信息的日志文件。
- 它包含了服務(wù)器處理請(qǐng)求時(shí)發(fā)生的錯(cuò)誤、異常、警告和其他問題的詳細(xì)信息。
- error.log對(duì)于故障排除、錯(cuò)誤診斷和監(jiān)視服務(wù)器的健康狀態(tài)非常有用。
- 默認(rèn)情況下,error.log文件也位于Nginx的安裝目錄下的
logs
文件夾中,可以通過在配置文件中進(jìn)行配置來更改日志文件的位置和格式。
所以當(dāng)我們配置了nginx代理以后,每次訪問都會(huì)在access.log里面有訪問記錄,報(bào)錯(cuò)時(shí),會(huì)在error.log記錄對(duì)應(yīng)信息
SpringBoot結(jié)合Nginx實(shí)戰(zhàn)502 and 504
實(shí)際運(yùn)用中,我碰到的502正常都是服務(wù)掛了,504一般都是服務(wù)超時(shí)了,現(xiàn)在我就模擬這兩種情況
準(zhǔn)備工作
Nginx配置
首先將nginx進(jìn)行配置,當(dāng)我們?cè)L問www.testnginx.com//test502Or504 會(huì)自動(dòng)代理訪問到http://localhost:8080/test502Or504
server{
listen 80;
server_name www.testnginx.com; #請(qǐng)求的域名
proxy_send_timeout 2s; # 設(shè)置發(fā)送超時(shí)時(shí)間,
proxy_read_timeout 2s; # 設(shè)置讀取超時(shí)時(shí)間。
location /test502Or504{
proxy_pass http://localhost:8080/test502Or504;
}
}
host配置
127.0.0.1 www.testnginx.com
SpringBoot
@Slf4j
@RestController
public class TestControllerForThis {
@RequestMapping("/test502Or504")
public String test502Or504() {
ThreadUtil.sleep(3000L);
return "test502Or504";
}
}
直接訪問:localhost:8080/test502Or504
502模擬
502很好模擬,由于我們上面進(jìn)行了配置:www.testnginx.com//test502Or504會(huì)自動(dòng)代理到http://localhost:8080/test502Or504 ,可以直接將我們的SpringBoot工程直接關(guān)閉,此時(shí)即可模擬出502報(bào)錯(cuò):
直接訪問:http://localhost:8080/test502Or504
訪問:http://www.testnginx.com/test502Or504
access.log
127.0.0.1 - - [04/Oct/2023:23:06:16 +0800] “GET /test502Or504 HTTP/1.1” 502
559 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36”
error.log
2023/10/04 23:06:14 [error] 15220#11328: *63 connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://[::1]:8080/test502Or504", host: "www.testnginx.com"
2023/10/04 23:06:16 [error] 15220#11328: *63 connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://127.0.0.1:8080/test502Or504", host: "www.testnginx.com"
504模擬
我們?cè)贜ginx配置了超時(shí)時(shí)間為2s,所以當(dāng)我們請(qǐng)求的接口耗時(shí)超過2s時(shí),就會(huì)出現(xiàn)504 Gateway Time-out
我們?cè)诮涌诶锩嫠吡?s超過了配置的2s:
@RequestMapping("/test502Or504")
public String test502Or504() {
ThreadUtil.sleep(3000L);
return "test502Or504";
}
當(dāng)然,直接訪問http://localhost:8080/test502Or504是正常的,
訪問http://www.testnginx.com/test502Or504報(bào)錯(cuò)504 Gateway Time-out
access.log
127.0.0.1 - - [04/Oct/2023:23:02:26 +0800] “GET /test502Or504 HTTP/1.1” 504
569 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36”
error.log
2023/10/04 23:02:24 [error] 15220#11328: *59 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://[::1]:8080/test502Or504", host: "www.testnginx.com"
2023/10/04 23:02:26 [error] 15220#11328: *59 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://127.0.0.1:8080/test502Or504", host: "www.testnginx.com"
500模擬
修改程序
@RequestMapping("/test502Or504")
public String test502Or504() {
if (true){
throw new NullPointerException("test502Or504");
}
ThreadUtil.sleep(3000L);
return "test502Or504";
}
直接訪問http://localhost:8080/test502Or504
訪問:http://www.testnginx.com/test502Or504
access.log
127.0.0.1 - - [04/Oct/2023:23:11:07 +0800] “GET /test502Or504 HTTP/1.1” 500
310 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36”文章來源:http://www.zghlxwxcb.cn/news/detail-766440.html
error.log
此時(shí)不會(huì)記錄500錯(cuò)誤文章來源地址http://www.zghlxwxcb.cn/news/detail-766440.html
總結(jié)
- 502錯(cuò)誤表示反向代理服務(wù)器接收到了無效的響應(yīng)或與后端服務(wù)器之間通信出現(xiàn)問題。
- 504錯(cuò)誤表示反向代理服務(wù)器在規(guī)定時(shí)間內(nèi)未能從后端服務(wù)器獲取到有效的響應(yīng),即后端服務(wù)器響應(yīng)超時(shí)。
- 502錯(cuò)誤主要與后端服務(wù)器的故障、崩潰或配置錯(cuò)誤有關(guān),而504錯(cuò)誤主要與后端服務(wù)器的響應(yīng)超時(shí)有關(guān)。
到了這里,關(guān)于Nginx與Spring Boot的錯(cuò)誤模擬實(shí)踐:探索502和504錯(cuò)誤的原因的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!