Windows下Nginx的安裝與使用(一):配置端口轉發


什么是端口轉發

我們在服務器上搭建一個圖書以及一個電影的應用,其中圖書應用啟動了 8001 端口,電影應用啟動了 8002 端口。此時如果我們可以通過:

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 配置文件(部分)如下面所示:

#配置負載均衡池
#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;
    }
}    

 

上面這段配置實現了:

1、當用戶訪問的域名是:http://book.chanshuyi.com 時,我們自動將其請求轉發給端口號為 8001 的 Tomcat 應用處理。

2、當用戶訪問的域名是:http://movie.chanshuyi.com 時,我們自動將其請求轉發給端口號為 8002 的 Tomcat 應用處理。

上面的這種技術實現就是端口轉發。端口轉發指的是由軟件統一監聽某個域名上的某個端口(一般是80端口),當訪問服務器的域名和端口符合要求時,就按照配置轉發給指定的 Tomcat 服務器處理。我們常用的 Nginx 也有端口轉發功能。

用 Nginx 實現端口轉發

下面我們將從零開始,講解如何配置端口轉發。

首先去 Nginx 官網下載一個 Windows 版本的 Nginx,或者直接點擊這里下載。這里我們用的是 Nginx1.8 

下載解壓之后的目錄結構如下:

其中 conf 目錄存放的是 Nginx 的配置文件,logs 存放的是 Nginx 的日志文件。

下面我們先模擬兩個 tomcat 應用。到這里下載 tomcat604401.zip 和 tomcat604402.zip,它們是兩個簡單的Web項目,我們將通過他們來測試 Nginx 的配置是否成功。

下載之后直接運行兩個 tomcat 下面的 bin/startup.bat,然后訪問下面的鏈接看是否應用是否正常啟動:

http://localhost:8001/

http://localhost:8002/

正常情況下會訪問到具體的頁面:

如果能看到上面的頁面,那說明 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,我們即使沒有域名,也可以在本機用域名的方式訪問自己啟動的應用程序。)

之后我們打開瀏覽器,輸入如下地址訪問:

http://book.chanshuyi.com

http://movie.chanshuyi.com

[MARK PIC1]

[MARK PIC2]

如果你成功看到以上頁面,那說明 Nginx 成功啟動並配置成功了。

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;
}

到這里關於端口轉發就結束了。我們將在下一篇中介紹如何進行負載均衡的配置。

 

參考資料:

1.http://blog.csdn.net/agangdi/article/details/40921199 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM