1. 程式人生 > >nginx 實現多埠轉發

nginx 實現多埠轉發

什麼是埠轉發

我們在伺服器上搭建了多個應用,例如9000埠應用是微信驗證授權,9001埠是移動端站點,我們可以通過下面的方式訪問;

localhost:9000
localhost:9001

但是我們不希望用埠的方式進行訪問,也就是說兩個應用通過不同域名的80埠進行訪問。但是我們知道伺服器上的一個埠只能被一個程式使用,這時候如何該怎麼辦呢?一個常用的方法是用 Nginx 進行埠轉發。

Nginx 的實現原理是:用 Nginx 監聽 80 埠,當有 HTTP 請求到來時,將 HTTP 請求的 HOST 等資訊與其配置檔案進行匹配並轉發給對應的應用。
例如當用戶訪問 wx.test.com

時,Nginx 從配置檔案中知道這個是微信驗證授權應用的 HTTP 請求,於是將此請求轉發給 9000 埠的應用處理。當用戶訪問 m.test.com 時,Nginx 從配置檔案中知道這個是移動端站點的 HTTP 請求,於是將此請求轉發給 9001 埠的應用處理。
下面是一個簡單的 Nginx 配置檔案(部分):

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        server_name wx.test.com;
        index index.html index.htm index.php;

        location / {
            proxy_pass http://127.0.0.1:9000;
            proxy_set_header X_Real_IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }


        access_log  /var/log/nginx/pm2-nginx-access.log  main;
        error_log   /var/log/nginx/pm2-nginx-error.log error;
    }

    server {
        listen 80;
        server_name m.test.com;
        index index.html index.htm index.php;
        
        location / {
            proxy_pass http://127.0.0.1:9001;
            proxy_set_header X_Real_IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }


        access_log  /var/log/nginx/pm2-nginx-access.log  main;
        error_log   /var/log/nginx/pm2-nginx-error.log error;
    }

}

這樣就可以實現域名訪問了。

訪問 wx.test.com,我們自動將其請求轉發給埠為 9000 的 Tomcat 應用處理。
訪問 m.test.com,我們自動將其請求轉發給埠為 9001 的 Tomcat 應用處理。