場景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 http://sever_rocket; } #匹配Missle開頭請求 location ^~/Missle { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #sever_missle proxy_pass http://sever_missle; } }
round6 大功告成
如圖,一個埠進來,自動轉發到相應埠,安全、健康、條理、環保。
厲害了。

後話
關鍵是nginx的配置文件,例如:
location ^~/Rocket
location表示匹配請求, ^~表示nginx按請求字元串匹配度最高的來匹配。
nginx的配置相當複雜,但是who care,程序員只要夠用就行了。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/284325.html