복붙노트

[REDIS] 자바에서의 nginx와 포트 포워딩

REDIS

자바에서의 nginx와 포트 포워딩

나는 백엔드로 레디 스를 사용하는 자바 응용 프로그램을 만들기 위해 노력하고있어. 레디 스 내가 사용하고 싶습니다 정말 빠른 키 - 값 저장소이지만, 레디 스은 사용자를위한 옵션 필요가 없도록 한 클라이언트와 함께 사용하도록되어 있기 때문에 : 통과 인증을. 나는 내가 redis2 확장자로 nginx를 시도 있도록, 인증의 일종을 구현하는 방법을 찾고 싶습니다. 내가 클라이언트 측 certficates 및 HTTPS를 사용할 수 있기 때문에이했다. 하지만 내 응용 프로그램이 정말 느리게 만들고있다.

나는 레디 스를 통해 nginx를 프록시에 연결하는 터널의 어떤 종류를 사용하는 방법에 대해 생각하고 있어요. 이 레디 스뿐만 HTTPS 인증, localhost를 수신 할 것이며 내가 레디 스에 도달하기 위해 사용하려는 주소가있을 것입니다. 그래서 기본적으로 내 현재의 방법

JAVA - Jedis - LAN - REDIS ,would be 
JAVA - Jedis(with localhost as the tunnel entrance?)-
-SSL LAN - Nginx(tunnel exit) - Redis

이를 달성하기위한 모든 팁? 나는 마지막 날에 대한 웹 검색 좀 봤는데하지만 난 네이티브 연결에만 약간의 오버 헤드를 추가 아무것도 올 수 없었다.

해결법

  1. ==============================

    1.레디 스는 백엔드 애플리케이션 뒤에, 보안 네트워크에서 작동하도록 설계되었습니다. 클라이언트 응용 프로그램은 레디 스에 직접 연결되어 있지 않습니다. 그것은 레디 스 2 계층 응용 프로그램에 대한 빈약 한 선택입니다.

    레디 스는 백엔드 애플리케이션 뒤에, 보안 네트워크에서 작동하도록 설계되었습니다. 클라이언트 응용 프로그램은 레디 스에 직접 연결되어 있지 않습니다. 그것은 레디 스 2 계층 응용 프로그램에 대한 빈약 한 선택입니다.

    당신은 여전히 ​​이것에 대한 레디 스를 사용하려는 경우 지금, 당신은 몇 가지 옵션이 있습니다. 당신은 HTTP 인터페이스의 레디 스 서버를 캡슐화 할 수 있습니다. 이것은 nginx를 redis2 모듈이 제공하는 것입니다. 당신은 또한 유사하다 webdis 한 번 봐 가지고 할 수 있습니다 (와의 nginx에 의존하지 않는다). 이벤트 몇 가지 액세스 제어 메커니즘을 Webdis. 설명서를 참조하십시오.

    당신이 제안 된 또 다른 해결책은 터널을 설정하는 것입니다. 나는 이것에 대한 nginx를 사용하지만, 그냥 평범한 오래된 SSH하지 않을 것입니다. 하자 가정 해 기계 B에 레디 스 서버가 실행 (포트 6379) 및 클라이언트 실행 시스템 A에

    시스템 A에, 나는 실행할 수 있습니다 :

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

    그것은 로컬 포트 ​​7008 (임의 선택), 및 대기에서 B A에서 터널을 열 것이다. 사용자는 호스트 B에 선언, 그 암호는 알려 져야한다. 다른 세션에서 여전히 호스트 (A)에, 우리는 지금 실행할 수 있습니다 :

    redis-cli -p 7008 ping
    

    표준 레디 스 클라이언트가 사용을 유의하시기 바랍니다. 클라이언트에 대한 투명 방식으로 터널 핸들 인증, 암호화 및 선택적 압축.

    지금, 당신의 클라이언트는 자바 응용 프로그램입니다, 당신은 아마 설정에 터널을 SSH 명령을 실행하지 않습니다. 바라건대, 당신은 자바에서 직접 터널을 엽니 다 Jsch 패키지를 사용할 수 있습니다. 다음으로 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();
        }
     }
    

    그것은 잘 작동하지만, 오버 헤드 인해 터널이 유의하시기 바랍니다가. 네트워크 (예를 들어 인터넷) 속도가 느린 때 오버 헤드가 매우 낮습니다. 고속 LAN (1 기가비트 이더넷)에, 그것은 훨씬 더 눈에 띈다 : 터널을 사용할 때 대기 시간은 최대 3을 곱한 수 있습니다. 유지 수있는 레디 스 서버 처리량 최대도 영향을받습니다. 서버 측에서 sshd 데몬은 (레디 스 자체보다도) 일부 CPU 걸린다.

    그건 내가 2 계층 응용 프로그램에 대한 많은 원시 성능 문제를 생각하지 않습니다 말했다.

  2. ==============================

    2.참고 : GitHub의에서 찾을 수 있습니다 SSL-레디 스라는 레디 스의 SSL 버전이있다 : https://github.com/bbroerman30/ssl-redis 2.6ish

    참고 : GitHub의에서 찾을 수 있습니다 SSL-레디 스라는 레디 스의 SSL 버전이있다 : https://github.com/bbroerman30/ssl-redis 2.6ish

    https://github.com/tritondigital/ssl-redis 2.4ish

    이것과 Jedis 자바 클라이언트를 수정으로, SSL 인증을 달성 할 수있다.

  3. from https://stackoverflow.com/questions/16789727/port-forwarding-with-nginx-from-java by cc-by-sa and MIT license