當咱們在服務器上搭建一個圖書以及一個電影的應用,其中圖書應用啓動了 8001 端口,電影應用啓動了 8002 端口。此時若是咱們能夠經過:nginx
localhost:8001 //圖書
localhost:8002 //電影
但咱們通常訪問應用的時候都是但願不加端口就訪問域名,也即兩個應用都經過 80 端口訪問。但咱們知道服務器上的一個端口只能被一個程序使用,這時候如何該怎麼辦呢?一個經常使用的方法是用 Nginx 進行端口轉發。Nginx 的實現原理是:用 Nginx 監聽 80 端口,當有 HTTP 請求到來時,將 HTTP 請求的 HOST 等信息與其配置文件進行匹配並轉發給對應的應用。例如當用戶訪問 book.douban.com 時,Nginx 從配置文件中知道這個是圖書應用的 HTTP 請求,因而將此請求轉發給 8001 端口的應用處理。當用戶訪問 movie.douban.com 時,Nginx 從配置文件中知道這個是電影應用的 HTTP 請求,因而將此請求轉發給 8002 端口的應用處理。一個簡單的 Nginx 配置文件(部分)以下面所示:web
#配置負載均衡池
#Demo1負載均衡池
upstream book_pool{
server 127.0.0.1:8001;
}
#Demo2負載均衡池
upstream movie_pool{
server 127.0.0.1:8002;
}
#Demo1端口轉發
server {
listen 80;
server_name book.chanshuyi.com;
access_log logs/book.log;
error_log logs/book.error;
#將全部請求轉發給demo_pool池的應用處理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://book_pool;
}
}
#Demo2端口轉發
server {
listen 80;
server_name movie.chanshuyi.com;
access_log logs/movie.log;
error_log logs/movie.error;
#將全部請求轉發給demo_pool池的應用處理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://movie_pool;
}
}
上面這段配置實現了:瀏覽器
一、當用戶訪問的域名是:http://book.chanshuyi.com 時,咱們自動將其請求轉發給端口號爲 8001 的 Tomcat 應用處理。tomcat
二、當用戶訪問的域名是:http://movie.chanshuyi.com 時,咱們自動將其請求轉發給端口號爲 8002 的 Tomcat 應用處理。服務器
上面的這種技術實現就是端口轉發。端口轉發指的是由軟件統一監聽某個域名上的某個端口(通常是80端口),當訪問服務器的域名和端口符合要求時,就按照配置轉發給指定的 Tomcat 服務器處理。咱們經常使用的 Nginx 也有端口轉發功能。併發
下面咱們將從零開始,講解如何配置端口轉發。app
首先去 Nginx 官網下載一個 Windows 版本的 Nginx,或者直接點擊這裏下載。這裏咱們用的是 Nginx1.8 負載均衡
下載解壓以後的目錄結構以下:測試
其中 conf 目錄存放的是 Nginx 的配置文件,logs 存放的是 Nginx 的日誌文件。spa
下面咱們先模擬兩個 tomcat 應用。到這裏下載 tomcat604401.zip 和 tomcat604402.zip,它們是兩個簡單的Web項目,咱們將經過他們來測試 Nginx 的配置是否成功。
下載以後直接運行兩個 tomcat 下面的 bin/startup.bat,而後訪問下面的連接看是否應用是否正常啓動:
正常狀況下會訪問到具體的頁面:
若是能看到上面的頁面,那說明 tomcat 啓動成功了。
下面咱們進行 Nginx 配置,來實現端口轉發。把下面的內容複製並覆蓋 conf/nginx.conf 文件:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#配置負載均衡池
#Demo1負載均衡池
upstream book_pool{
server 127.0.0.1:8001;
}
#Demo2負載均衡池
upstream movie_pool{
server 127.0.0.1:8002;
}
#Demo1端口轉發
server {
listen 80;
server_name book.chanshuyi.com;
access_log logs/book.log;
error_log logs/book.error;
#將全部請求轉發給demo_pool池的應用處理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://book_pool;
}
}
#Demo2端口轉發
server {
listen 80;
server_name movie.chanshuyi.com;
access_log logs/movie.log;
error_log logs/movie.error;
#將全部請求轉發給demo_pool池的應用處理
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://movie_pool;
}
}
}
以後雙擊 nginx.exe 啓動 Nginx。打開 Windows 任務管理器,若是看到 nginx 的進程,那麼說明啓動成功了,不然根據 logs 文件夾下的日誌文件進行修改。
以後打開 C:\Windows\System32\drivers\etc\hosts 文件,添加如下配置:
# Set the Domain Redirect
127.0.0.1 book.chanshuyi.com movie.chanshuyi.com
(設置 host 主要是爲了使域名重定向。進行了上述配置以後,在本機訪問 book.chanshuyi.com movie.chanshuyi.com 的時候,系統會將請求轉發給指定IP的服務器,而不是經過DNS服務器解析。經過設置 HOST,咱們即便沒有域名,也能夠在本機用域名的方式訪問本身啓動的應用程序。)
以後咱們打開瀏覽器,輸入以下地址訪問:
[MARK PIC1]
[MARK PIC2]
若是你成功看到以上頁面,那說明 Nginx 成功啓動並配置成功了。
下面咱們來看看從發送 HTTP 請求到具體的 tomcat 應用處理的整個流程。
在本例中,當咱們啓動 Nginx 時, Nginx 就啓動線程不斷地監聽 80 端口。用戶瀏覽器發送 book.chanshuyi.com 請求,服務器接收到用戶的 HTTP 請求時 Nginx 也監聽到了這一時間。因而 Nginx 從 HTTP 請求頭中取出用戶請求的 server_name,並與配置文件中配置的進行匹配,若是匹配成功,那麼就將請求轉發給對應的應用服務器處理。不然 Nginx 將這次請求轉發給配置文件中配置的第一個 server。
例如:用戶經過瀏覽器發送 book.chanshuyi.com 請求,Nginx 監聽到服務器 80 端口上的請求,並根據配置文件尋找對應的server。
#Demo1端口轉發 server { listen 80; server_name book.chanshuyi.com; access_log logs/book.log; error_log logs/book.error; #將全部請求轉發給demo_pool池的應用處理 location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://book_pool; } }
Nginx 找到了對應的server,並發現對應的 server 配置了一個負載均衡池 book_pool。因而它將此請求分配給負載均衡池的應用服務器處理,即本機上端口爲 8001 的應用服務器。
#Demo1負載均衡池 upstream book_pool{ server 127.0.0.1:8001; }
到這裏關於端口轉發就結束了。咱們將在下一篇中介紹如何進行負載均衡的配置。
參考資料: