程式設計師的nginx技能包(4)——埠轉發,節約是一種美德,規範是一種

longmanma發表於2021-09-09

背景

場景1

給客戶開發微信公眾號後臺程式,大家都知道微信公眾號必須要求80/443埠,OK,如果客戶要求雲伺服器託管,那就GG了。因為同時監聽80埠的服務端只能有一個,每個客戶都得給他配一臺伺服器,哈哈,簡直不要太燒錢。

要知道節約是一種美德,必須得用nginx解決之。

場景2

作為一個程式設計師,不同時開發N個專案簡直體現不了自己的價值。

比如同時開發瞭如下幾個springboot專案:(不要問我為何如此優秀,因為下面專案都是虛構)

  1. Rocket 火箭配套軟體
  2. Missle 導彈配套軟體
  3. Plane 飛機配套軟體
  4. …等等

為了同時可以除錯開發,得給他們配上不同埠,那就變成了:

 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章