Nginx использует модуль потока для перенаправления, чтобы реализовать мультиплексирование портов.

Есть много способов использовать Nginx для мультиплексирования портов, наиболее распространенный метод — прослушивание одного и того же порта в разных блоках сервера и завершение перенаправления в соответствии с разными именами хостов. В этой статье представлен новый метод мультиплексирования портов, который может удобно разгрузить данные TCP, зашифрованные с помощью TLS.

1 перенаправление потока Nginx

Nginx обычно работает на уровне приложений и может реализовывать перенаправление посредством мониторинга портов несколькими виртуальными хостами. На самом деле Nginx добавил потоковый модуль после версии 1.0.9, который использует протокол SNI (протокол расширения TLS) для пересылки трафика на разные хосты на одном и том же порту.Этот процесс переадресации завершается на транспортном уровне.

2 Пример разделения

Ниже показан пример разделения потока, который перенаправляет запросы к разным сервисам (web1 и web2) по разным доменным именам (capa.ink и crps.ink), реализуя мультиплексирование порта 443.

Обратите внимание: убедитесь, что ваш nginx содержит модуль потока, в противном случае перекомпилируйте и установите!

Метод настройки блока потока (находится в nginx.conf) показан ниже. Обратите внимание, что блок потока находится рядом с блоком http.

stream {
    map $ssl_preread_server_name $stream_map {
        capa.ink web1;
        crps.ink web2;
    }
    upstream web1 {
        server 127.0.0.1:8000;
    }
    upstream web2 {
        server 127.0.0.1:8001;
    }
    
    #复用443端口
    server {
        listen 443 reuseport;
        listen [::]:443 reuseport;
        proxy_pass $stream_map;
        ssl_preread on;    #重点,一定要加这句
    }
}

На этом этапе nginx должен иметь возможность перенаправлять запросы на порт 8000 или 8001 в зависимости от доменного имени, и мы можем напрямую отслеживать этот порт при настройке блока сервера.

В следующем коде показана полная схема конфигурации веб-страницы на основе php, которая соответствует службе «web1» в приведенной выше конфигурации.Нам нужно позаботиться только о первых трех строках в блоке сервера. Поскольку запрос на это доменное имя был передан модулем потока на порт 8000, здесь необходимо отслеживать только порт 8000.

server {
        listen 8000 ssl http2;
        server_name capa.ink;
        port_in_redirect off;

        ssl_certificate /document/mywebsite/certification/capa.ink_bundle.pem;
        ssl_certificate_key /document/mywebsite/certification/capa.ink.key;

        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        root /document/mywebsite;
        index index.php;

        if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php$1 last;
        }

        location ~ .*\.php(\/.*)*$ {
                root           /document/mywebsite;
                fastcgi_split_path_info ^(.+?.php)(/.*)$;
                fastcgi_pass    127.0.0.1:9005;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
    }
}

3 резюме

В Nginx разница между использованием потокового блока для мультиплексирования портов и использованием серверного блока для мультиплексирования портов заключается в том, что потоковый блок завершает передачу доменного имени на транспортном уровне и завершает распределение, в то время как серверный блок считывает содержащиеся данные. в данных на прикладном уровне информации о доменном имени, а затем разделить. Stream может легко повторно использовать порты в случае зашифрованной передачи.Если должен обрабатываться незашифрованный протокол http, традиционный блок сервера полностью подходит.

Guess you like

Origin blog.csdn.net/diqiudq/article/details/126907193