需要帮助配置允许 HTTP 和 HTTPS 连接的 Nginx SSL 直通反向代理

问题描述 投票:0回答:1

我正在尝试创建一个反向代理来接受到托管的各种不同 Web 服务器的所有 HTTPS 和 HTTP 连接,我已经设法使 SSL 直通正常工作,最初我们相信我们可以将所有 HTTP 流量重定向到 HTTPS ,但是由于某些设备限制,我们需要 HTTP 流量实际使用端口 80。

我已经尝试了几次让它工作,但我所做的一切几乎都会导致同样的错误。查看access.log和error.log,我注意到所有HTTP流量都没有从上游接收到任何地址信息,因此不会将任何数据传递给proxy_pass。我不认为列出我尝试执行此操作的所有方法会有帮助,但如果有人认为这确实有帮助,我可以详细说明所有方法。

我已经将模块化 .conf 包含到 nginx.conf 中以简化阅读它,但 SSL 直通部分(流块)位于不同的 .conf 中(如果这出于某种原因而重要)。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

stream {

        map $ssl_preread_server_name $name {
                site1.com site1_backend;
                site2.com site2_backend;
                site3.com site3_backend;
        }


        upstream site1_backend {
                server 1.1.1.1:443;
                server 1.1.1.2:443;
        }

        upstream site2_backend {
                server 2.1.1.1:443;
        }

       upstream site3_backend {
                server 3.1.1.1:443
                server 3.1.1.2:443
       }

        server {
                listen 443;
                proxy_pass $name;
                ssl_preread on;
        }
}

events {
        worker_connections  1024;
}

http {

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

        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;
        keepalive_timeout  90;

        server {
                listen 80;
                server_name _;
                return 301 https://$host$request_uri;
        }
}
http nginx ssl https pass-through
1个回答
0
投票

所以我想出了如何做到这一点,它比我想要的稍微不太优雅,并且可能会被改进,但它确实可以作为 HTTPS 连接的 SSL 直通,并且 SSL 正在被终止以允许设备使用 HTTP 连接使用 HTTP 进行通信以正确重定向。

我为这两个组件添加了一条分隔线,因为配置是模块化的,但我认为作为完整的配置更容易理解。

负载均衡器充当冗余,您可以将其扩展到代理可以处理的任意数量的 Web 服务器。

我相信我的错误是尝试在与stream{}而不是http{}相同的块中处理HTTP连接。理论上,由于 map 是 http 的指令(而不是流,但显然无论如何都可以工作),因此应该可以稍微清理一下配置,并为所请求的任何服务器创建一个带有变量的 proxy_pass 。

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

events {
        worker_connections  1024;
}

#################################################################################
#   include /etc/nginx/conf.d/ssl-passthrough.conf
#################################################################################
stream {

    map $ssl_preread_server_name $name {
        site1.com https_site1;
        site2.com https_site2;
        site3.com https_site3;
    }

    upstream https_site1 {
        server 1.1.1.1:443;
        server 1.1.1.2:443 backup;
    }

    upstream https_site2 {
        server 2.1.1.1:443;
    }
    
    upstream http_site3 {
        server 3.1.1.1:443;
        server 3.1.1.2:443 backup;
    }

    log_format basic '$remote_addr [$time_local] '
        '$protocol $status $bytes_sent $bytes_received '
        '$session_time "$upstream_addr" '
        '"$upstream_bytes_sent" "$upstream_bytes_received"
        "$upstream_connect_time"';

    access_log /var/log/nginx/stream_access.log basic;
    error_log  /var/log/nginx/stream_error.log;

    server {
        listen 443;
        ssl_preread on;
        proxy_pass $name;
    }
}
#################################################################################
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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;
    keepalive_timeout  65;
    
#################################################################################
#   include /etc/nginx/conf.d/proxy_http.conf
#################################################################################
    upstream http_site1 {
        server 1.1.1.1;
        server 1.1.1.2 backup;
    }

    upstream http_site2 {
        server 2.1.1.1;
    }
    
    upstream http_site3 {
        server 3.1.1.1;
        server 3.1.1.2 backup;
    }
    
    server {
        listen 80;
        server_name site1.com;
        location / {
            proxy_pass http://http_site1;
        }
    }

    server {
        listen 80;
        server_name site2.com;
        location / {
            proxy_pass http://http_site2;
        }
    }
    
        server {
        listen 80;
        server_name site3.com;
        location / {
            proxy_pass http://http_site3;
        }
    }
#################################################################################
}

我希望这对某人有帮助,因为我找不到任何人以这种方式询问 ssl 直通和 ssl 终止,如果有人有任何优化想法或只是可能错误的事情,欢迎任何反馈!

© www.soinside.com 2019 - 2024. All rights reserved.