tcp $http_upgrade - NGINX для обратного прокси-сервера и включить SSL (wss: //)?





'; настройка (6)


Не бойся, потому что отважная группа Ops Programmers решила ситуацию с брендом, nginx_tcp_proxy_module новый nginx_tcp_proxy_module

Написано в августе 2012 года, поэтому, если вы из будущего, вы должны сделать домашнее задание.

Предпосылки

Предполагается, что вы используете CentOS:

  • Удалите текущий экземпляр NGINX (предположим, что для этого используется сервер dev)
  • Если возможно, сохраните старые конфигурационные файлы NGINX, чтобы их можно было повторно использовать (включая скрипт init.d/nginx )
  • yum install pcre pcre-devel openssl openssl-devel и любые другие необходимые библиотеки для создания NGINX
  • Получите nginx_tcp_proxy_module из GitHub здесь nginx_tcp_proxy_module и запомните папку, в которую вы ее разместили (убедитесь, что она не застегнута)

Создайте свой новый NGINX

Опять же, предполагает CentOS:

  • cd /usr/local/
  • wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
  • tar -xzvf nginx-1.2.1.tar.gz
  • cd nginx-1.2.1/
  • patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
  • ./configure --add-module=/path/to/nginx_tcp_proxy_module --with-http_ssl_module (вы можете добавить больше модулей, если они вам понадобятся)
  • make
  • make install

Необязательный:

  • sudo /sbin/chkconfig nginx on

Настроить Nginx

Не забудьте сначала скопировать старые файлы конфигурации, если вы хотите их повторно использовать.

Важно: вам нужно будет создать директиву tcp {} на самом высоком уровне в вашем conf. Убедитесь, что это не входит в вашу директиву http {} .

В приведенном ниже примере конфигурации показан один сервер веб-сервера upstream и два прокси-сервера для SSL и Non-SSL.

tcp {
    upstream websockets {
        ## webbit websocket server in background
        server 127.0.0.1:5501;

        ## server 127.0.0.1:5502; ## add another server if you like!

        check interval=3000 rise=2 fall=5 timeout=1000;
    }   

    server {
        server_name _;
        listen 7070;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }

    server {
        server_name _;
        listen 7080;

        ssl on;
        ssl_certificate      /path/to/cert.pem;
        ssl_certificate_key  /path/to/key.key;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }
}

Я так потерян и новичок в создании NGINX сам по себе, но я хочу иметь возможность включить безопасные веб-узлы без дополнительного слоя.

Я не хочу включать SSL на сервере websocket, но вместо этого я хочу использовать NGINX для добавления уровня SSL в целом.

Каждая веб-страница там говорит, что я не могу этого сделать, но я знаю, что могу! Благодаря тому, кто (я) может показать мне, как это сделать!




Хорошая, краткая статья Панкаха Малхотры обсуждает, как это сделать с NGINX и доступна here .

Ниже приведена базовая конфигурация NGINX:

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream appserver {
    server 192.168.100.10:9222; # appserver_ip:ws_port
}

server {
    listen 8888; // client_wss_port

    ssl on;
    ssl_certificate /path/to/crt;
    ssl_certificate_key /path/to/key;


    location / {
        proxy_pass http://appserver;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}



Это сработало для меня:

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

- заимствован из: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf




Для меня это сводилось к proxy_pass местоположения proxy_pass . При необходимости изменить http://nodeserver на https://nodeserver и иметь действительную настройку SSL-сертификата на стороне сервера узла. Таким образом, когда я представляю сервер внешних узлов, мне нужно только изменить IP, а все остальное останется той же конфигурацией.

Надеюсь, это поможет кому-то на этом пути ... Я все время смотрел на проблему ... вздох ...

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
upstream nodeserver {
        server 127.0.0.1:8080;
}
server {
        listen 443 default_server ssl http2;
        listen [::]:443 default_server ssl http2 ipv6only=on;
        server_name mysite.com;
        ssl_certificate ssl/site.crt;
        ssl_certificate_key ssl/site.key;
        location /horizon {
                proxy_pass https://nodeserver;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_intercept_errors on;
                proxy_redirect off;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-NginX-Proxy true;
                proxy_ssl_session_reuse off;
            }
}



для .net core 2.0 Nginx с SSL

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
}

Это сработало для меня




В SSLSHopper есть довольно подробные статьи о переходе между разными серверами.

http://www.sslshopper.com/how-to-move-or-copy-an-ssl-certificate-from-one-server-to-another.html

Просто выберите соответствующую ссылку внизу этой страницы.

Примечание: у них есть онлайн-конвертер, который дает им доступ к вашему закрытому ключу. Вероятно, им можно доверять, но лучше было бы использовать команду OPENSSL (также показанную на этом сайте), чтобы сохранить закрытый ключ на собственной машине.





ssl tcp proxy nginx mod-proxy