Nginx反向代理技巧

跨域

作為一個前端開發者來說不可避免的問題就是跨域,那什么是跨域呢?

跨域:指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對javascript施加的安全限制。瀏覽器的同源策略是指協議,域名,端口都要相同,其中有一個不同都會產生跨域

那如何解決跨域問題呢。跟后端商量一下也是可以通過CORS解決跨域問題的。但是一生要強的前端崽兒也是可以自己解決的。

webpack-dev-server反向代理

webpack-dev-server幫我們解決了這個痛點,它基于Node代理中間件http-proxy-middleware實現。

配置:

proxy:?{'/api':?{target:?'https://xxx.com',?//?反向代理的目標服務changeOrigin:?true,??//?開啟后會虛擬一個請求頭OrigincookieDomainRewrite:?{'.xxx.com':?'localhost',},??//?修改響應頭中?cookie?中的域名}
}

什么是反向代理

簡單的說就是A需要向C發送請求,但是C不認識A自然是不愿意的,但是A認識B,A向B發送請求,可是B也不會返回什么東西但是他認識可以返回請求C,那么B再次向C發送請求,C看在B的面子上給B返回請求了,B再給A返回請求。。。。

具體到開發中就是,前端需要向https://xxx.com這個域名調用接口,但是前端開發環境啟動項目是https://localhost:8080服務,直接調用接口會跨域。

所以前端需要做一層代理。從https://localhost:8080直接請求到https://xxx.com域名的接口,這對于前端來說應該是無感知的。

2c863b4d2165cc038a8ba3720c9d4664.jpeg

反向代理隱藏了真實的服務端;

切換環境debug

問題來了,如果我們正在開發新需求,但是此時有線上bug,那我們怎么辦吶?

  1. 首先切換分支

  2. 修改target的域名

  3. 重新啟動

每次到了第二步的時候我還得問問可以在哪個環境復現,這套流程下來雖然也不復雜但是如果可以省略是不是想想就更開心了。

抽離代理層

如果可以,前端不再需要把前端編譯過程和服務代理目標捆綁在一起。不妨使用Nginx試試呢。

  1. 安裝Nginx

  2. 固定前端代理

proxy:?{'/api':?{target:?'127.0.0.1:8080',?//?固定IPchangeOrigin:?true,??//?開啟后會虛擬一個請求頭OrigincookieDomainRewrite:?{'.xxx.com':?'localhost',},??//?修改響應頭中?cookie?中的域名}
}
  1. Nginx代理

server?{listen???????8080;???//?這里是我們想要默認訪問的端口server_name??127.0.0.1;???//??這里是想在瀏覽器里訪問的地址#charset?koi8-r;#access_log??logs/host.access.log??main;location?/?{proxy_pass?http://xxx.com;??//??這里是你在本地啟動的時候的鏈接,例如localhost:4043,換個端口號就行了autoindex?on;}
}

有了以上的配置,我們就可以將前端代理層和Nginx代理層解耦,前端固定通過本地127.0.0.1:8080訪問后端接口,而具體接口是代理到開發環境、測試環境或是生產環境,由Nginx決定,只需要修改nginx.conf后重啟即可。而Nginx熱重啟是非常快的,一條命令即可實現,幾乎零等待時間。

//?windows下是這個命令
nginx.exe?-s?reload
//?linux是這樣的
nginx?-s?reload

固定端口

如果端口被占用怎么辦呢?

最簡單的辦法是換個端口,但是換端口修改Nginx配置文件比修改代理更復雜些,所以只能另辟蹊徑。那有沒有什么方法可以再次轉一下ip或者端口呢。答案是修改hosts文件

127.0.0.1?www.jia.com

當用戶訪問www.jia.com時給解析到127.0.0.1這個IP。所以修改Nginx配置監聽127.0.0.180端口

server?{listen???????80;???//?這里是我們想要默認訪問的端口server_name??127.0.0.1;???//??這里是想在瀏覽器里訪問的地址#charset?koi8-r;#access_log??logs/host.access.log??main;location?/?{proxy_pass?http://xxx.com;??//??這里是你在本地啟動的時候的鏈接,例如localhost:4043,換個端口號就行了autoindex?on;}
}

然后修改本地代理配置

proxy:?{'/api':?{target:?'www.jia.com',?//?固定IPchangeOrigin:?true,??//?開啟后會虛擬一個請求頭OrigincookieDomainRewrite:?{'.xxx.com':?'localhost',},??//?修改響應頭中?cookie?中的域名}
}

這樣前端去訪問接口域名https://xxx.com會被代理到https://www.jia.com,而https://www.jia.com被本地hosts解析到127.0.0.1,然后Nginx監聽了127.0.0.180端口,請求轉發到真實的后端服務!

-?END?-

關于奇舞團

奇舞團是 360 集團最大的大前端團隊,代表集團參與 W3C 和 ECMA 會員(TC39)工作。奇舞團非常重視人才培養,有工程師、講師、翻譯官、業務接口人、團隊 Leader 等多種發展方向供員工選擇,并輔以提供相應的技術力、專業力、通用力、領導力等培訓課程。奇舞團以開放和求賢的心態歡迎各種優秀人才關注和加入奇舞團。

972c1fbc907f45d29f33e6b30a6739f8.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40408.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2011-2021年數字普惠金融指數Bartik工具變量法(含原始數據和Bartik工具變量法代碼)

2011-2021年數字普惠金融指數Bartik工具變量法(含原始數據和Bartik工具變量法代碼) 1、時間:2011-2020(省級、城市),2014-2020(區縣) 2、原始數據來源:北大金融研究中心…

npm的鏡像源和代理的查看和修改

一、鏡像源 查詢當前鏡像源 npm get registry 設置為淘寶鏡像 npm config set registry http://registry.npm.taobao.org/ 設置回默認的官方鏡像 npm config set registry https://registry.npmjs.org/ 設置electron為淘寶鏡像 npm config set ELECTRON_MIRROR "h…

Redis對象類型和結構、內存回收、對象共享

對象類型和結構 在Redis中,無論是鍵key還是值value都是一個對象,每次對Redis數據庫創建一個新的鍵值對時,就至少會創建兩個對象。 常見的對象類型有: 字符串列表哈希集合有序集合 這些對象在Redis中統一用一個結構體redisObjec…

VS2019生成的DLL,給QT(MinGW版本)使用的小結

VS2019端: a 基于生成一個DLL的工程(要注意生成是x86,還是x64的,需要和后面的QT的App工程對應),這里不多解釋了,網上多的是; b 在cpp實現文件里,假如要導出一個這樣的…

Git如何上傳文件到github

Git下載網址: https://git-scm.com/downloads 1. 新建一個空文件夾,用來上傳文件,第一次需創建,以后無需創建 2. 點進去空文件夾,鼠標右鍵,使用Git Bash Here 打開 3. 克隆遠程倉庫:git cl…

深入理解JVM——垃圾回收與內存分配機制詳細講解

所謂垃圾回收,也就是要回收已經“死了”的對象。 那我們如何判斷哪些對象“存活”,哪些已經“死去”呢? 一、判斷對象已死 1、引用計數算法 給對象中添加一個引用計數器,每當有一個地方引用它時,計數器就加一&…

解決git reset --soft HEAD^撤銷commit時報錯

今天在使用git回退功能的時候,遇到以下錯誤: 解決git reset --soft HEAD^撤銷commit時報錯 問題: 在進行完commit后,想要撤銷該commit,于是使用了git reset --soft HEAD^命令,但是出現如下報錯&#xff1…

【學習心得】安裝cuda/cudann和pytorch

一、查看驅動信息 # 進入CMD輸入命令 nvidia-smi 也可以右下角圖標打開NVIDIA 設置進行查看 二、下載安裝CUDA 1、下載 下載地址 https://developer.nvidia.com/ 2、安裝 推薦自定義安裝。建議只勾選Cuda,只安裝這一個就好,以免報錯安裝失敗。 3、驗證…

移動端直播相關技術總結

一、直播APP原理 二、直播APP架構 三、直播APP實現流程 四、流媒體開發 流媒體模塊架構 流媒體相關基礎知識 幀:每一幀代表一幅靜止的圖像 GOP:Group of Pictures,畫面組,一個GOP就是一組連續的畫面,很多幀的集合 碼率…

BC136 KiKi去重整數并排序

給定一個整數序列,KiKi想把其中的重復的整數去掉,并將去重后的序列從小到大排序輸出。 輸入描述 第一行,輸入一個整數n,表示序列有n個整數。 第二行輸入n個整數(每個整數大于等于1,小于等于1000&#xf…

nodejs與前端js大文件、切片、視頻流相關技術示例

nodejs服務代碼 const express require("express"); const fs require("fs");const app express(); // 展示html頁面 app.get("/", function (req, res) {res.sendFile(__dirname "/index.html"); });// nodejs切片讀取文件示例 …

redis-配置詳解(基礎篇)

# 可以配置包含其他redis配置,可以使得配置更清晰化 # include /path/to/local.conf ################################## MODULES ##################################### # Load modules at startup. If the server is not able to load modules # it will abor…

拉丁方設計資料的方差分析(SPSS版+SAS版)

拉丁方設計(Latin square design):實驗研究中涉及一個處理因素和兩個控制因素,每個因素的類別數或水平數相等,此時可采用拉丁方設計,將兩個控制因素分別安排在拉丁方設計的行和列上。該設計類型仍為單因素方…

中電金信通過KCSP認證 云原生能力獲權威認可

中電金信通過KCSP(Kubernetes Certified Service Provider)認證,正式成為CNCF(云原生計算基金會)官方認證的 Kubernetes 服務提供商。 Kubernetes是容器管理編排引擎,底層實現為容器技術,是云原…

ABAP 新語法--Data Processing

1. String Template 新語法引入了字符串模板,用于處理字符串連接以及格式轉換 字符串模板在 | … | 之間定義,主要分為兩部分,固定文本和變量 其中,變量只能在 { … } 內使用,大括號之外的所有字符均作為固定文本使用…

【Swagger】只需要三步,就可以讓你的項目實現Swagger在線文檔,實時瀏覽,修改展示

目錄 1. pom.xml文件中添加Swagger的jar包 2. 配置Swagger 3. 項目啟動中加入Swagger注解的開關,啟動Swagger功能 4. 啟動項目,查看效果 Swagger 的功能這里就不多說明了,相信大家都懂的,好奇多問一句,大家有知道其…

zookeeper安裝配置采坑流程

安裝 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz解壓: tar -zxvf apache-zookeeper-3.8.2-bin.tar.gz如下 bin目錄下文件是可執行文件 conf目錄文件是配置文件 修改zoo.cfg(復制zoo_sample&#x…

從0搭建ECG深度學習網絡

本篇博客介紹使用Python語言的深度學習網絡,從零搭建一個ECG深度學習網絡。 任務 本次入門的任務是,篩選出MIT-BIH數據集中注釋為[‘N’, ‘A’, ‘V’, ‘L’, ‘R’]的數據作為本次數據集,然后按照8:2的比例劃分為訓練集&…

什么是DNS服務器的層次化和分布式?

DNS (Domain Name System) 的結構是層次化的,意味著它是由多個級別的服務器組成,每個級別負責不同的部分。以下是 DNS 結構的層次: 根域服務器(Root Servers): 這是 DNS 層次結構的最高級別。全球有13組根域…

【云原生】Docker 詳解(二):Docker 架構及工作原理

Docker 詳解(二):Docker 架構及工作原理 Docker 在運行時分為 Docker 引擎(服務端守護進程) 和 客戶端工具,我們日常使用各種 docker 命令,其實就是在使用 客戶端工具 與 Docker 引擎 進行交互。…