問(wèn)題描述
- 1.項(xiàng)目中需要使用nginx作為反向代理服務(wù)器趣效,代理一些靜態(tài)文件(比如:使用webpack打包好的html頁(yè)面曹抬,和圖片等等)以及BFF層的服務(wù)。
- 2.因此項(xiàng)目中想通過(guò)映射的方式神得,將nginx的配置文件以及靜態(tài)資源映射進(jìn)容器频轿。
- 3.但是卻出現(xiàn)前端發(fā)的請(qǐng)求BFF無(wú)論如都接受不到
解決過(guò)程
- Q1:首先我考慮到的必然是路徑寫(xiě)錯(cuò)了
- A1:去檢查前端發(fā)送的請(qǐng)求路徑,前端路徑的寫(xiě)法
http://node_service:3000/api
由于BFF服務(wù)啟動(dòng)在node_service容器中因此痊银,我認(rèn)為這個(gè)路徑?jīng)]有問(wèn)題抵蚊。然后檢查ngixn的配置
server {
sendfile off;
listen 80;
charset utf-8,gbk;
location /api {
proxy_pass http://node_service:3000;
rewrite /api/(.+)$ /$1 break;
}
但是由于我對(duì)ngixn不太熟悉,配置也不太能看懂溯革,大概猜測(cè)贞绳,匹配/api
請(qǐng)求的都交給location去做proxy_pass
轉(zhuǎn)發(fā)請(qǐng)求,然后改寫(xiě)路由致稀「员眨看著配置中轉(zhuǎn)發(fā)的路由也沒(méi)什么問(wèn)題。然而只能在chrom的network中看到我的http://node_service:3000/api/user
一直404抖单。
- Q2:那么是不是ngixn的配置有問(wèn)題萎攒?造成proxy_pass沒(méi)有轉(zhuǎn)發(fā)請(qǐng)求?那么就有兩個(gè)點(diǎn)矛绘,首先location是否接受請(qǐng)求耍休?然后如果接受了,那么為什么不轉(zhuǎn)發(fā)货矮?
- A2:但是由于ngixn的反向代理羊精,我只能在chrom上看到前端的請(qǐng)求路徑
http://node_service:3000/api/user
卻沒(méi)有辦法看到請(qǐng)求是否被轉(zhuǎn)發(fā)以及轉(zhuǎn)發(fā)到哪里了,因此我不論我如何修改proxy_pass
后的值囚玫,都沒(méi)有辦法受到資源园匹。
- Q3:為了驗(yàn)證配置是否正確雳刺,需要查找了ngixn語(yǔ)法
- A3:首先
proxy_pass是用來(lái)做反向代理轉(zhuǎn)發(fā)進(jìn)入location的請(qǐng)求的
其次rewite
用來(lái)改寫(xiě)url,
rewirte <匹配規(guī)則> <改寫(xiě)規(guī)則> <break/.>
第一個(gè)參數(shù)是正則表達(dá)式裸违,用來(lái)匹配url中的值掖桦,改寫(xiě)uri。然而rewrite會(huì)在改寫(xiě)之后吧url扔出去重新讓他匹配location供汛,因此break設(shè)置之后就不會(huì)重新匹配了枪汪。看來(lái)語(yǔ)法都沒(méi)有什么問(wèn)題怔昨。
這里最難以解決的問(wèn)題是我不斷改變代理的路徑但是chrome只能看到從前端發(fā)來(lái)的請(qǐng)求路徑雀久,根本無(wú)法判斷之后又被轉(zhuǎn)發(fā)的哪里了。
- Q4:那么是否能說(shuō)明請(qǐng)求沒(méi)有進(jìn)入過(guò)這個(gè)location趁舀?沒(méi)有辦法檢測(cè)現(xiàn)在只能對(duì)照一下原來(lái)work的代碼
- A4:發(fā)現(xiàn)前端的請(qǐng)求路徑是個(gè)相對(duì)路徑而不是我寫(xiě)的帶有域名端口號(hào)的絕對(duì)路徑赖捌,我改寫(xiě)成為相對(duì)路徑成功
- Q5:那么說(shuō)明請(qǐng)求確實(shí)沒(méi)有進(jìn)入這個(gè)location,那么這里的相對(duì)和絕對(duì)路徑有什么區(qū)別呢矮烹?
- A5:改變了請(qǐng)求路徑之后越庇,發(fā)現(xiàn)chrom上的請(qǐng)求路徑立刻變成了
http://localhost:9998/api/user
,在觀察listen 80;
說(shuō)明你發(fā)的絕對(duì)路徑請(qǐng)求ngixn并沒(méi)有提供給他
反思
- 以前使用不論是superagent還是別的發(fā)請(qǐng)求的方式都是使用相對(duì)路徑奉狈,我都沒(méi)有懷疑和問(wèn)為什么÷卑Γ現(xiàn)在想著其實(shí)就是可以自動(dòng)向前綴中添加當(dāng)前的服務(wù)路徑