nginx通過location配置代理的原理和實現(xiàn)方式
nginx通過location配置代理的原理和方式,是我們作為運維人員需要熟知的內(nèi)容,前后端服務通過nginx作為橋梁互通訪問,今天我們分享一下具體使用場景。
一、場景一:單一網(wǎng)絡環(huán)境
1、互聯(lián)網(wǎng)環(huán)境
1)不用nginx負載
通過VsCode、Hbuilder、WebStorm 等前端開發(fā)工具 ,本地啟動啟動前端代碼,啟動后用默認ip(localhost(127.0.0.1))、端口號8080或者是隨機生成的,前端頁面打開后,直接調(diào)用后端接口,接口的ip地址可以直接寫在代碼里,自動觸發(fā)直接訪問后端服務。前端代碼一般會使用相對路徑或者沒有完整寫出 IP 和端口的接口地址,比如:
axios.get('/api/user')
這種情況下:前端系統(tǒng)會根據(jù)你當前運行的環(huán)境來推斷請求的地址。如果你是通過 HBuilder 啟動本地開發(fā)環(huán)境(如使用 HBuilderX
直接啟動或者 npm run dev
),它會根據(jù)默認的開發(fā)服務器(通常是 localhost
或 127.0.0.1
)來拼接出完整的請求 URL。請求會默認發(fā)送到:
http://localhost:8080/api/user
(假設你的本地服務器是在 8080 端口上運行的)。這個過程本質(zhì)上是因為瀏覽器或應用會將請求的路徑補充為完整的 URL,基于當前運行環(huán)境的 IP 和端口來自動推導。
假如:你在代碼中明確指定了完整的后端接口地址,例如:
axios.get('http://192.168.1.100:3000/api/user')
此時,無論你是在本地開發(fā)還是部署到服務器,前端代碼都會按照這個地址去發(fā)送請求。此時,前端不會再使用默認的地址和端口,因為你已經(jīng)顯式提供了完整的域名/IP 和端口。這意味著,在這種情況下,系統(tǒng)不會再進行自動拼接,并且請求會直接發(fā)送到你指定的后端地址,而不會涉及默認的本地地址。
2)使用nginx代理前端代碼
此環(huán)境中把前端代碼打包后放到nginx負載包下面的html文件夾下面,nginx.conf 配置文件中簡單的配置一下代理地址。
server { listen 8081; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html/build-f/build/web; #效果 index index.html index.htm; } }
前端代碼通過nginx,后端代碼直接在瀏覽器請求了,不經(jīng)過nginx負載了。
3)使用nginx代理前后端代碼
如果后端的API接口也要通過nginx代理,那么需要額外添加配置
server { listen 8081; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html/build-jt-f/build-jt/web; #效果 index index.html index.htm; } # 后臺請求接口轉(zhuǎn)發(fā)到接口地址 location /nandao/url1Server { #add_header 'Access-Control-Allow-Origin' '*'; #add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS'; proxy_pass http://localhost:8888/; rewrite ^/nandao/url1Server/(.*) /$1 break; } }
這樣配置之后的運行邏輯如下:
- 瀏覽器上顯示的請求地址如下:
http://localhost:8081/nandao/url1Server/basin/selectCity?code=010
- 經(jīng)過nginx后實際請求后端接口的全路徑如下:
http://localhost:8888/basin/selectCity?code=010
即:http://localhost:8081 換成 http://localhost:8888,然后 /nandao/url1Server/ 字符串去掉!
2、局域網(wǎng)環(huán)境
全局域網(wǎng)環(huán)境和互聯(lián)網(wǎng)環(huán)境類似,不牽涉到網(wǎng)絡問題,思路是一致的。
二、場景二:多種網(wǎng)絡環(huán)境
1、頁面端互聯(lián)網(wǎng)訪問局域網(wǎng)
前后端服務均部署到局域網(wǎng),現(xiàn)在要配置通過互聯(lián)網(wǎng)域名訪問局域網(wǎng)的應用。
一般有以下幾個方案:配置NAT和端口映射(一般通過路由器)、配置反向代理(使用Nginx或其他代理服務器)、使用VPN(虛擬專用網(wǎng)絡)、通過公網(wǎng)IP直接訪問(如果有公網(wǎng)IP)。
此處我們分析常用的nginx反向代理:在公網(wǎng)可訪問的服務器上部署 Nginx,配置反向代理,將用戶請求轉(zhuǎn)發(fā)到局域網(wǎng)內(nèi)的應用。
假設你已經(jīng)將公網(wǎng)域名 yourdomain.com 解析到 Nginx 服務器上,Nginx 配置文件如下:
server { listen 80; server_name yourdomain.com; #http://yourdomain.com 轉(zhuǎn)發(fā)到 http://192.168.1.100:8080 location / { proxy_pass http://192.168.1.100:8080; # 將請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)應用 proxy_set_header Host $host; 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; } #http://yourdomain.com/nandao 轉(zhuǎn)發(fā)到 http://192.168.1.100:8080/nandao location /nandao { proxy_pass http://192.168.1.100:8080; # 將請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)應用 proxy_set_header Host $host; 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; } #http://yourdomain.com/nandao 轉(zhuǎn)發(fā)到 http://192.168.1.100:8080 location /nandao { proxy_pass http://192.168.1.100:8080; # 將請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)應用 proxy_set_header Host $host; 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; rewrite ^/nandao/(.*) /$1 break; } }
注意:http://192.168.1.100:8080 此地址在改服務器上可以 telnet 通。(服務器有內(nèi)網(wǎng)、外網(wǎng)、浮動ip的區(qū)別)
2、API接口代理轉(zhuǎn)發(fā)
接著上面的流程:轉(zhuǎn)發(fā)到 nginx后 192.168.1.100:8080 ,前端頁面和后端接口
server { listen 8080; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html/build-jt-f/build-jt/web; #效果 index index.html index.htm; } # 后臺請求接口轉(zhuǎn)發(fā)到接口地址 location /nandao/url1Server { #add_header 'Access-Control-Allow-Origin' '*'; #add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTIONS'; proxy_pass http://localhost:8888/;#或者是其他ip,其他此服務器里可以ping 通 rewrite ^/nandao/url1Server/(.*) /$1 break; } }
三、匹配規(guī)則
默認匹配:
server { listen 8081; server_name localhost; location / { root html/build-jt-f/build-jt/web; index index.html index.htm; try_files $uri $uri/ /index.html; } } #?頁面訪問地址http://localhost:8081/nandao/
沒有/nandao/ 模塊配置時,請求會默認匹配 location /,Nginx 會將 /nandao/
轉(zhuǎn)發(fā)到 html/build-jt-f/build-jt/web/nandao/
目錄下查找靜態(tài)文件。
server { listen 8081; server_name localhost; location / { alias html/build-jt-f/build-jt/web; index index.html index.htm; try_files $uri $uri/ /index.html; } }
如果是alias 參數(shù):
- 使用
alias
指令時,Nginx 會將請求路徑中的/nandao/
前綴替換為alias
指定的路徑。 - 指定了靜態(tài)文件的實際目錄,
/nandao/
前綴被移除,路徑變?yōu)?html/build-jt-f/build-jt/web/
。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx如何實現(xiàn)配置靜態(tài)資源服務器及防盜鏈
這篇文章主要為大家介紹了nginx實現(xiàn)配置靜態(tài)資源服務器及防盜鏈步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11使用nginx實現(xiàn)一個端口和ip訪問多個vue前端的全過程
為滿足單端口訪問多個前端應用的需求,需要對nginx進行配置,同時修改vue項目的publicPath參數(shù),這篇文章主要介紹了使用nginx實現(xiàn)一個端口和ip訪問多個vue前端的相關(guān)資料,需要的朋友可以參考下2024-09-09總結(jié)高并發(fā)下Nginx性能如何優(yōu)化
這篇文章主要為大家介紹了在高并發(fā)下Nginx性能如何優(yōu)化的總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10詳解Nginx + Tomcat 反向代理 如何在高效的在一臺服務器部署多個站點
本篇文章主要介紹了詳解Nginx + Tomcat 反向代理 如何在高效的在一臺服務器部署多個站點,具有一定的參考價值,有興趣的可以了解一下。2016-12-12nginx php-fpm環(huán)境中chroot功能的配置使用方法
這篇文章主要介紹了nginx php-fpm環(huán)境中chroot功能的配置使用方法,此方法是比禁用PHP敏感函數(shù)更好的一個安全防護手手段,需要的朋友可以參考下2014-05-05