如何将nginx tcp直通与ssl预读和反向代理功能结合起来?

wlsrxk51  于 2023-01-12  发布在  Nginx
关注(0)|答案(1)|浏览(161)

我正在尝试设置一个nginx,它可以根据域名,通过加密的tcp流传递到另一个应用程序,或者像一个反向代理一样提供自己的证书。
我想存档以下情况:

https://app1.app.com ──► pass-through encrypted tcp to :10001
 https://app2.app.com ──► pass-through encrypted tcp to :10002
 https://app3.app.com ──► serve ssl, reverse-proxy to http://ip:10003

因此,在不破坏应用程序1和2的加密连接的情况下,nginx应该转发tcp数据包。证书将由应用程序自己提供。主机名检测与ssl_preread一起工作。
但是应用程序3只能通过http访问,所以nginx应该自己提供证书,并代理从特定主机名app3.app.com到未加密后端的所有内容。
我有一个前两种情况的工作配置,可以设置第三种情况,但不能弄清楚如何将这两种情况结合在一个单一的nginx配置。
我目前掌握的情况:

user www-data;
worker_processes  1;

load_module /usr/lib/nginx/modules/ngx_stream_module.so;

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

stream {
    map $ssl_preread_server_name $name {
        app1.app.de app1;
        app2.app.de app2;
        default default;
    }

    upstream app1 {
        server 127.0.0.1:10001 max_fails=3 fail_timeout=10s;
    }

    upstream app2 {
        server 127.0.0.1:10002 max_fails=3 fail_timeout=10s;
    }

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

如果有人能给我指出正确的方向,我将不胜感激!

fiei3ece

fiei3ece1#

我通过ssl-preread转发流量来解决这个问题,我希望代理服务器通过localhost处理它自己的流量:

stream {
map $ssl_preread_server_name $name {
    app1.app.de app1;
    app2.app.de app2;
    app3.app.de localhost;
    default default;
}

upstream app1 {
    server 127.0.0.1:10001 max_fails=3 fail_timeout=10s;
}

upstream app2 {
    server 127.0.0.1:10002 max_fails=3 fail_timeout=10s;
}

upstream localhost {
    server localhost:444;
}
server {
    listen 8080;
    proxy_pass $name;
    ssl_preread on;
}
}

然后在sites-enabled conf中正常侦听,并根据需要代理(或直接服务)stuff:

server {
    listen 444 ssl http2;
    server_name app3.app.de;
    ssl_stuff_goes_here;
    location / {
        proxy_pass http://11.22.33.44:5678;
    }
 }

注意,我在444上设置了侦听和转发--我不知道ssl_preread是否足够聪明,不会将内容转发给它自己,但我不想尝试并找出答案,因为所有的流量都是本地的,所以我认为这无关紧要。

相关问题