程式設計師的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
- 寫程式是一種態度(一)strcmp (轉)
- 50歲SQL是一種小眾技能?SQL
- 30歲轉行做初級程式設計師是一種什麼樣的體驗?程式設計師
- 程式設計天賦是一種危險的神話程式設計
- 優秀的程式設計師不會覺得累成狗是一種榮耀程式設計師
- 突然意識自己曾經引以為豪的程式設計其實是一種工具,這是一種悲哀嗎?程式設計
- 為什麼Go是一種設計糟糕的程式語言Go
- 做過程式設計師的產品經理是一種什麼樣的存在?程式設計師
- 五種血型的程式設計師 你屬於哪一種?程式設計師
- 我是一隻程式設計師程式設計師
- 設計+雲桌面是一種什麼模式模式
- 一種新的程式設計思路(中): (轉)程式設計
- 一種新的程式設計思路(上) (轉)程式設計
- 40 歲了還在寫程式碼,是一種幸福,還是一種悲哀?
- [譯] JavaScript 的函數語言程式設計是一種反模式JavaScript函數程式設計模式
- 換一種態度看程式設計師!程式設計師
- 好程式設計師Java分享Java開發常用規範技巧一程式設計師Java
- 霍炬:程式設計師愛寫指令碼是種病程式設計師指令碼
- 我是一個iOS程式設計師iOS程式設計師
- 我是一個垃圾程式設計師程式設計師
- 我是一個混蛋程式設計師程式設計師
- 8種極品程式設計師,你屬於哪一種?程式設計師
- 8 種極品程式設計師,你屬於哪一種?程式設計師
- 如果40歲了還在寫程式碼,是一種幸福,還是一種悲哀?
- 如果40歲了還在寫程式碼 是一種幸福 還是一種悲哀?
- 程式設計師是吃青春飯的?一張圖道盡程式設計師的發展方向程式設計師
- 你是一名努力工作的程式設計師,還是懶惰的程式設計師?程式設計師
- 一種新的程式設計思路(中)附: (轉)程式設計
- 假如女人是一種程式語言