使用Java从Nginx转发端口

我正在尝试制作一个使用 。由于 是一个非常快速的键值存储,我想使用它,但是

可以与1个客户端一起使用,因此它没有user:pass身份验证的选项。我想找到一种实现某种身份验证的方法,因此我尝试了带有

扩展名的 。我这样做是因为我可以使用 和HTTPS。但这使我的应用程序非常慢。 *


我正在考虑使用某种通过

连接到redis的隧道。对于此redis,将在localhost上侦听,并且会有一个我想用来访问redis的地址,但具有https身份验证。所以基本上我目前的方法

JAVA - Jedis - LAN - REDIS ,would be 

JAVA - Jedis(with localhost as the tunnel entrance?)-

-SSL LAN - Nginx(tunnel exit) - Redis

有什么秘诀可以做到这一点吗?最近几天,我一直在Google上搜索Google,但是我想不出任何能增加本机连接开销的事情。

回答:

Redis旨在在后端应用程序后面的安全网络上工作。客户端应用程序不应直接连接到Redis。对于2层应用程序,它使Redis成为糟糕的选择。

现在,如果您仍要使用Redis,则有几种选择。您可以将Redis服务器封装在HTTP接口中。这就是nginx

redis2模块所提供的。您可能还想看看webdis,这是相似的(并且不依赖于nginx)。Webdis提供了一些访问控制机制。请参阅文档。

另一个解决方案是按照您的建议建立隧道。我不会为此使用nginx,而只会使用普通的旧SSH。假设Redis服务器在计算机B(端口6379)上运行,而客户端在计算机A上运行。

在机器A上,我可以运行:

ssh user@host_B -L 7008:host_B:6379 -N

它将打开从本地端口7008(任意选择)到A到B的隧道,并等待。应该在主机B上声明该用户,并且知道其密码。在仍然位于主机A上的另一个会话中,我们现在可以运行:

redis-cli -p 7008 ping

请注意,使用的是标准Redis客户端。隧道以透明的方式为客户端处理身份验证,加密和可选的压缩。

现在,您的客户端是一个Java应用程序,您可能不想运行SSH命令来设置隧道。希望您可以使用Jsch包直接从Java打开隧道。这是Jedis的示例:

import redis.clients.jedis.*;

import java.util.*;

import com.jcraft.jsch.*;

public class TestTunnel {

Jedis jedis;

Session session;

JSch jsch = new JSch();

int port;

// None of the following should be hardcoded

static String USER = "user"; // SSH user on the redis server host

static String PASSWD = "XXXXXXXX"; // SSH user password

static String HOST = "192.168.1.62"; // Redis server host

static int PORT = 6379; // Redis server port

public TestTunnel() {

try {

// Open the SSH session

session = jsch.getSession( USER, HOST, 22 );

session.setPassword( PASSWD );

java.util.Properties config = new java.util.Properties();

config.put("StrictHostKeyChecking", "no");

config.put("Compression", "yes");

config.put("ConnectionAttempts","3");

session.setConfig(config);

session.connect();

// Setup port forwarding from localhost to the Redis server

// Local port is ephemeral (given by the OS)

// Jedis connects to localhost using the local port

port = session.setPortForwardingL( 0, HOST, PORT );

jedis = new Jedis( "127.0.0.1", port );

} catch ( JSchException e ) {

// Proper error handling omitted

System.out.println(e);

}

}

public void disconnect() {

jedis.disconnect();

try {

session.delPortForwardingL( port );

session.disconnect();

} catch ( JSchException e ) {

// Proper error handling omitted

System.out.println(e);

}

}

public void mytest( int n ) {

for ( int k = 0; k < n; k++) {

jedis.set("k" + k, "value"+k);

}

System.out.println("Read: "+jedis.get("k0") );

}

public static void main(String[] args) {

TestTunnel obj = new TestTunnel();

obj.mytest(10);

obj.disconnect();

}

}

它可以正常工作,但请注意,由于隧道的原因,会产生开销。当网络速度较慢(例如Internet)时,开销非常低。在快速的LAN(1

GbE)上,它更加引人注目:使用隧道时,延迟最多可以乘以3。Redis服务器可以承受的最大吞吐量也受到影响。在服务器端,sshd守护程序占用一些CPU(比Redis本身更多)。

也就是说,对于2层应用程序,原始性能并不重要。

以上是 使用Java从Nginx转发端口 的全部内容, 来源链接: utcz.com/qa/429465.html

回到顶部