nginx перенаправляет все данные на основе порта (прокси-сервер nginx)

#linux #docker #nginx #networking #nginx-reverse-proxy

Вопрос:

Я все еще новичок в nginx и хочу этого добиться.

У меня есть два сервера (server1 и server2) с сервером sftp (bitvise) на server1. А на сервере 2 у меня запущен контейнер nginx docker.

Я хочу настроить nginx так , чтобы, когда трафик поступает на сервер2 (тот, у которого есть nginx) на порту 22, он перенаправлялся на сервер1, где присутствует мой sftp-сервер.

У меня есть dns «transfer.test.com» сопоставлен с моим общедоступным IP-адресом server2 (протестирован).

Это конфигурация, которую я добавил в файл nginx conf.

 server {
 listen 22;
 server_name transfer.test.com;
 return 301 https://google.com;


 location / {
   set $sftp server1-private-ip:22;
   proxy_pass  $sftp;
  }
} 
 

server1-private-ip-это частный IP сервера 1 (с sftp).

но до сих пор это не работает. Я могу подключиться к sftp с помощью filezile, используя частный IP-адрес server1, НО я не могу подключиться к sftp с помощью filezila, используя частный IP-адрес server2, это означает, что трафик не перенаправляется.

Спасибо вам за помощь.

Ответ №1:

Если вы хотите использовать nginx в качестве прокси-сервера для протоколов, отличных от HTTP, таких как SSH или SFTP, вам следует определить свой сервер в контексте потока, а не http. Типичный основной файл конфигурации (обычно /etc/nginx/nginx.conf ) выглядит следующим образом

 user              <username>;
worker_processes  <number>;
...

events {
    worker_connections  <number>;
}

http {
    include       /etc/nginx/mime.types;
    ... # other global http directives here
    include       /etc/nginx/conf.d/*.conf;
}
 

Как вы можете видеть, файлы конфигурации для отдельных серверов (или групп серверов) включаются в http контекст. Вы должны добавить stream блок в свой основной файл конфигурации:

 user              <username>;
worker_processes  <number>;
...

events {
    worker_connections  <number>;
}

http {
    ...
}

stream {
    server {
        listen      22;
        proxy_pass  <server1_private_ip>:22;
    }
}
 

Директивы типа server_name или location бессмысленны в server блоках, определенных в stream контексте. Пожалуйста, обратите внимание, что для использования вышеуказанной конфигурации nginx должен быть дополнен ngx_stream_core_module ngx_stream_proxy_module модулями и.

Комментарии:

1. Я добавил эту трансляцию { сервер { слушать 22; набор $SFTP в ЮЖД-сервером nginx:80 ; директива proxy_pass $протоколу SFTP; } } в моем файле nginx.conf файл, под HTTP{} но когда я локон transfer.test.com я не могу получить nginx и страница приветствия, ЮЖД-с nginx:80 откуда ЮЖД-nginx-это местные nginx в докер контейнере

2. и я даже пытался транслировать { сервер { слушайте 22; proxy_pass <server1_private_ip>:22; } } но все равно, когда я пытаюсь подключиться к server2_private_ip:22 из filezilla, это не работает Спасибо за вашу помощь

3. Что nginx -t говорит команда?

4. после добавления этого stream { server { listen 22; set $sftp <server1-private-ip>:22; proxy_pass $sftp; } } nginx -t говорит : nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

5. файл конфигурации nginx, похоже, в порядке. Извините, я не знаю, как помочь дальше. Я не очень хорошо знаком с сетями докеров.