nginx 根据端口重新路由所有数据(nginx 代理)

jay*_*zee 2 linux networking nginx docker nginx-reverse-proxy

我对 nginx 还很陌生,我想完成这个任务。

我有两台服务器(server1 和 server2),server1 上有一个 sftp 服务器(bitvise)。在 server2 上我有一个正在运行的 nginx docker 容器。

我想配置 nginx,这样当流量到达端口 22 上的 server2 (带有 nginx 的那个)时,它会被重定向到 server1,我的 sftp 服务器所在的位置。

我有一个 dns“transfer.test.com”映射到我的 server2 公共 IP(已测试)。

这是我添加到 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;
  }
} 
Run Code Online (Sandbox Code Playgroud)

server1-private-ip 是 server1(带有 sftp 的服务器)的私有 IP。

但到目前为止它还不起作用。我可以使用 server1 的私有 IP 使用 filezile 连接到 sftp,但是我无法使用 server2 的私有 IP 使用 filezila 连接到 sftp,这意味着流量没有被重定向。

感谢您的帮助。

Iva*_*sky 6

如果你想使用 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;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,各个服务器(或服务器组)的配置文件包含在上下文中http。您应该将stream块添加到主配置文件中:

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

events {
    worker_connections  <number>;
}

http {
    ...
}

stream {
    server {
        listen      22;
        proxy_pass  <server1_private_ip>:22;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上下文中定义的块中,类似server_name或 的指令location是没有意义的。请注意,要使用上述配置,nginx 应编译有和模块。serverstreamngx_stream_core_modulengx_stream_proxy_module