程式設計師的nginx技能包(4)——埠轉發,節約是一種美德,規範是一種
背景
場景1
給客戶開發微信公眾號後臺程式,大家都知道微信公眾號必須要求80/443
埠,OK,如果客戶要求雲伺服器託管,那就GG了。因為同時監聽80埠的服務端只能有一個,每個客戶都得給他配一臺伺服器,哈哈,簡直不要太燒錢。
要知道節約是一種美德,必須得用nginx解決之。
場景2
作為一個程式設計師,不同時開發N個專案簡直體現不了自己的價值。
比如同時開發瞭如下幾個springboot專案:(不要問我為何如此優秀,因為下面專案都是虛構)
- Rocket 火箭配套軟體
- Missle 導彈配套軟體
- Plane 飛機配套軟體
- …等等
為了同時可以除錯開發,得給他們配上不同埠,那就變成了:
1. 127.0.0.1:8001/Rocket 火箭配套軟體
2. 127.0.0.1:8002/Missle 導彈配套軟體
3. 127.0.0.1:8003/Plane 飛機配套軟體
4. ....等等
你可以想想,會經常忘記哪個埠是哪個專案,而且程式設計師都有強迫症啊,萬一哪天8002專案成功投產不需要開發了,我是應該換個專案頂到8002埠呢,還是把8003之後的埠號依次減1重新配置呢。光是思考這個問題,有潔癖的程式設計師就用了半個下午…茶不思飯不想,小小碼農悲涼悲涼
解決方案
用了nginx就很簡單了,統一透過80埠對外提供服務,根據路徑自動轉發到對應埠的專案上,完事。
小夥伴看到之後都驚呆了,不是一般社員。
光說不練是假把式
直接給出配置檔案這種方式,沒有什麼意義,因為我從網上找的很多都是錯誤的,真是不夠意思。必須得具體實現下。
如何實現,很簡單,搞2個專案放在兩個埠上,然後修改nginx配置檔案,最後實現從80埠進來自動根據路徑轉發到對應專案埠。
如何將兩個專案放到兩個埠,我這邊常用兩種,開發階段就是兩個springboot專案配置到不同啟動埠,投產階段就是伺服器上兩個tomcat配置不同埠。
OK,畢竟有一部分童鞋不用springboot,我們們採用第二種方式。
開練
round1 搞兩個tomcat
這個不說了,我弄了兩個tomcat,如圖:
round2 修改配置檔案conf/server.xml
將監聽埠分別改為8001、8002如下,注意為了避免衝突,tomcat1下埠改為801x,tomcat2下埠改為802x。
如下配置,tomcat1在8012埠提供服務,tomcat2在8022埠提供服務。
<!-- tomcat1配置 -->
<Server port="8011" shutdown="SHUTDOWN">
<Connector port="8012" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8013" />
<Connector port="8014" protocol="AJP/1.3" redirectPort="8015" />
<!-- tomcat2配置 -->
<Server port="8021" shutdown="SHUTDOWN">
<Connector port="8022" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8023" />
<Connector port="8024" protocol="AJP/1.3" redirectPort="8025" />
round3 驗證兩個tomcat啟動成功
雙擊bin/startup.bat分別啟動兩個tomcat,如圖:
開啟瀏覽器分別輸入地址,均可顯示tomcat歡迎頁
127.0.0.1:8012
127.0.0.1:8022
如圖湯姆貓真是越來越妖嬈了
round4 開發兩個專案
開發
專案1 Rocket資料夾,裡面包含index.html檔案,內容為
專案2 Missle資料夾,裡面包含index.html檔案,內容為
將兩個專案分別放到tomcat1、tomcat2 的webapps目錄下。
重啟兩個伺服器,然後使用如下地址訪問:
127.0.0.1:8012/Rocket/index.html
127.0.0.1:8022/Missle/index.html
效果如下:
round5 修改nginx配置檔案
此時可以修改nginx配置檔案,透過監聽80埠,然後根據路徑再將請求轉發到不同埠
具體就是將Rocket請求轉發到8012埠,將Missle請求轉到8022埠,如下:
#gzip on;
upstream sever_rocket{
server 127.0.0.1:8012;
}
upstream sever_missle{
server 127.0.0.1:8022;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
#匹配Rocket開頭請求
location ^~/Rocket{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#轉發到sever_rocket
proxy_pass
}
#匹配Missle開頭請求
location ^~/Missle {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#sever_missle
proxy_pass
}
}
round6 大功告成
如圖,一個埠進來,自動轉發到相應埠,安全、健康、條理、環保。
厲害了。
後話
關鍵是nginx的配置檔案,例如:
location ^~/Rocket
location表示匹配請求, ^~
表示nginx按請求字串匹配度最高的來匹配。
nginx的配置相當複雜,但是who care,程式設計師只要夠用就行了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2730/viewspace-2819386/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 做大廠程式設計師是一種怎樣的體驗?程式設計師
- 程式設計師到底是一種什麼樣的存在?程式設計師
- 30歲轉行做初級程式設計師是一種什麼樣的體驗?程式設計師
- DRY是一種被高估的程式設計原理 - gordonc程式設計Go
- 50歲SQL是一種小眾技能?SQL
- 突然意識自己曾經引以為豪的程式設計其實是一種工具,這是一種悲哀嗎?程式設計
- 設計+雲桌面是一種什麼模式模式
- 好程式設計師Java分享Java開發常用規範技巧一程式設計師Java
- [譯] JavaScript 的函數語言程式設計是一種反模式JavaScript函數程式設計模式
- 【1024程式設計師節】程式設計師,你學程式設計的初衷是什麼?程式設計師
- 在小公司程式設計是一種什麼樣的體驗?程式設計
- springboot~封裝依賴引用包jar還是pom,哪種更規範Spring Boot封裝JAR
- 【譯】我是一個平庸的程式設計師程式設計師
- 程式設計師是吃青春飯的?一張圖道盡程式設計師的發展方向程式設計師
- 【轉發】為什麼說程式設計師是一個極度勞累的工作?程式設計師
- 開發者眼中的Roguelike,是一種設計思路與玩法機制
- 我是程式設計師,我用這種方式銘記歷史程式設計師
- ikuai是linux的一種麼?AILinux
- Java是一種廣泛使用的程式語言Java
- 牛逼程式設計師分五種不同類別,你屬於哪一種?程式設計師
- 未來AI是一種可程式設計FPGA晶片,遠遠超出人類AI程式設計FPGA晶片
- Linux埠轉發的幾種常用方法Linux
- 成為更好的程式設計師必須學習的 4 種程式設計結構程式設計師
- 為什麼說程式碼註釋是程式設計師必備的技能?程式設計師
- Google程式設計師的一天是如何度過的?Go程式設計師
- 併發程式設計中一種經典的分而治之的思想!!程式設計
- 假如特沒普是一種程式語言
- 程式設計師的三階段,薪資的三大“關”,你對程式設計到底持有的是一種什麼樣的態度?程式設計師
- java程式設計規約----程式碼風格(一)Java程式設計
- 產業轉型升級是自救的一種辦法產業
- 一個成熟的程式設計師必會技能:賺錢程式設計師
- 一個合格的程式設計師,需要哪些必備技能?程式設計師
- 現在的你,是開發工程師、程式設計師還是碼農?工程師程式設計師
- yoav-lavi/melody:Melody是一種將正規表示式轉譯為DSL的工具
- 程式設計師是一個需要天賦的職業嗎?程式設計師
- 閱讀程式碼也是一種技能 - Trisha Gee
- 具備這4種能力,美工和UI設計師一樣值錢UI
- 併發程式設計的12條規範程式設計