Nginx Multi-Workload Config - веб-сайт и обратный прокси - PullRequest
0 голосов
/ 23 апреля 2019

TLDR: я пытаюсь настроить Nginx для размещения веб-сайта и одновременно действовать в качестве обратного прокси-сервера. Веб-сайт находится по адресу www.example.com:443, а обратный прокси-сервер находится на отдельном сервере OpenVPN по адресу vpn.example.com:443. Я думаю, что знаю ответ: «Nginx не может быть настроен на прослушивание одного порта для двух разных типов трафика» (веб-трафик и трафик обратного прокси-сервера), но подумал, что я задам эти вопросы более осведомленным.

Теперь перейдем к более длинной версии. У меня есть рабочая установка, которая выглядит так:

               +-----------------------+
               |                       |
               |         Nginx         |
               |    (Rev Proxy Only)   |
               |                       |
               |     192.168.0.100     |
               |  vpn.example.com:443  |
               |  www.example.com:443  |
               |                       |
               +-----------------------+
                 /                   \
                /                     \
+-----------------------+    +-----------------------+
|                       |    |                       |
|        OpenVPN        |    |       LAMP Stack      |
|         (VPN)         |    |        (Website)      |
|                       |    |                       |
|     192.168.0.101     |    |     192.168.0.102     |
|  vpn.example.com:443  |    |  www.example.com:443  |
|                       |    |                       |
+-----------------------+    +-----------------------+

Вот пара заметок. Сервер Nginx (v1.14.2) - это CentOS v7.6. Это настроено с "--with-stream" и "--with-stream_ssl_preread_module". Он также использует все значения по умолчанию в /etc/nginx/nginx.conf, за исключением того, что включает блок stream {} с proxy_pass. Файлы conf выглядят так:

/ и т.д. / Nginx / nginx.conf

user  nginx;
worker_processes  1;

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


events {
    worker_connections  1024;
}

include /etc/nginx/proxy.conf;

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;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

/ и т.д. / Nginx / proxy.conf

stream {

    map $ssl_preread_server_name $name {
        www.example.com lamp;
        vpn.example openvpn;
        default https_default_backend;
    }

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

    upstream lamp {
        server 192.168.0.102:443;
    }

    upstream openvpn {
        server 192.168.0.101:443;
    }

    upstream https_default_backend {
        server 192.168.0.101:443;
    }

    log_format basic '[$time_local] $remote_addr - $protocol '
                     'STATUS: $status BYTES_SENT: $bytes_sent '
                     'BYTES_RECEIVED: $bytes_received '
                     'SENT_TO: $upstream_addr MSECS: $msec '
                     'SESSION_TIME: $session_time '
                     'UPSTREAM_BYTES_SENT: $upstream_bytes_sent '
                     'UPSTREAM_BYTES_RECEIVED: $upstream_bytes_received '
                     'UPSTREAM_CONNECTION_TIME: $upstream_connect_time"';

    access_log /var/log/nginx/stream.mfgs.dev_access.log basic;
    error_log  /var/log/nginx/stream.mfgs.dev_error.log;

}

Опять же, это мой текущий конфиг, и все здесь работает. Трафик веб-сайта передается на веб-сервер, а трафик VPN направляется на VPN-сервер. Все это работает.

Моя цель - изменить стек LAMP (Linux, Apache, MySQL, PHP) на стек LEMP (Linux, Nginx, MySQL, PHP) и объединить обратный прокси-сервер Nginx и веб-сайт на одном сервере. Любой трафик, специально направленный на «www.example.com:443», попадет на веб-сайт Nginx, а все остальное будет передано на VPN-сервер, например:

+-----------------------+
|                       |
|         Nginx         |
| (Website & Rev Proxy) |
|                       |
|     192.168.0.100     |
|  vpn.example.com:443  |
|  www.example.com:443  |
|                       |
+-----------------------+
            |
            |
+-----------------------+
|                       |
|        OpenVPN        |
|         (VPN)         |
|                       |
|     192.168.0.101     |
|  vpn.example.com:443  |
|                       |
+-----------------------+

Я пытался установить Nginx на отдельном сервере (192.168.0.105). Я получил сайт и работает на этом сервере. Тем не менее, когда я включаю proxy.conf, он тестирует правильно, используя 'nginx -t', но служба Nginx не может перезапуститься на этом сервере. Сообщение об ошибке:

nginx: [emerg] bind () to 192.168.0.105:443 не удалось (98: адрес уже используется)

Я полагаю, это потому, что и http, и потоковые блоки прослушивают один и тот же IP и порт. Есть ли способ настроить Nginx для работы в качестве веб-сервера для определенного полного доменного имени: порт и прокси (через потоковую передачу) для всего остального на другой сервер?

Заранее спасибо.

...