synology에서 docker나 redis 등을 패키지 센터에서 설치하여 사용할 수 있다.


하지만 이상하게 저렴하게 나온 NAS, 그 중에서 x86 cpu를 사용하는 경우에는 패키지 센터에서 직접 redis를 설치할 수가 없다 ㅜㅜ


그래서 방법을 찾았다. 그 방법을 까먹지 않기 위해서 정리해보자.


1. DSM에서 SSH 허용

이 부분은 아주 간단하게 DSM > 설정 > 네트워크에서 SSH 허용하여 접속을 킬 수 있다. 보안상 포트는 22가 아닌 다른 번호로 바꾸고 방화벽을 설정하는 것을 추천한다. 자세한건 검색하면 엄청 나오고 간단하다.


2. redis 다운로드

redis 설치하여 운용하기 위해서 공식홈페이지에서 다운로드한다. 그리고 SFTP나 FTP 또는 단순하게 DSM에 드래그 해서 파일을 NAS에 옮겨준다. (wget으로 직접 콘솔로 받아도 무관)

https://redis.io/


3. redis 컴파일

다운 받은 redis 설치은 tar로 압축되어있다. 압축된 파일을 "tar xvfz 파일명"으로 해제한다. 그리고 이를 컴파일 해야하는데 make 명령어를 쳐도 먹질 않는다 ㅜㅜ make command not found가 발생한다 ㅜㅜ 이를 해결하기 위해서 ipkg를 설치해야 한다.


4. ipkg 설치

ipkg 설치를 위해서 패키지 센터에 설정에 들어가서 패키지 소스를 누르고 해당 주소를 추가한다.

https://www.cphub.net/

그리고 Easy Bootstrap Installer를 설치하고 ipkg gui를 설치한다. ipkg gui는 설치된 유틸리티를 유아이로 자세히 보기 위해서 사용된다. 굳이 필요없으면 안 깔아도 되고 깔게 될 경우 perl이 필요하다.



5. 필요한 명령 유틸리티 설치

1
2
3
4
/opt/bin/ipkg install autoconf
/opt/bin/ipkg install make
/opt/bin/ipkg install gcc
cs

redis 설치에 필요한 몇 개의 유틸리티를 설치한다. 


6. redis 컴파일 및 설치

다시 압축을 해제한 폴더 내부로 이동하여 make 명령어를 쳐서 컴파일을 수행한다.

컴파일이 완료되면 sudo make install 명령어를 통해 설치를 진행한다.


7. 실행

설치가 완료되면 redis-server 명령어를 입력하여 실행한다. background에서 실행시키기 위해서 &를 함께 사용한다. 실행이 되면 redis-cli를 쳐서 정상적으로 동작하는지 확인해보자.


NAS를 사용해서 개인적으로 서버를 가지고 놀아보는것도 좋다. 

기존에는 aws로 자주 놀았지만 아무래도 비용도 비싸고 실수로 비용청구가 될 가능성이 많으니 nas로 잘 놀아보자.

  1. Favicon of https://wedul.site BlogIcon 위들 wedul 2019.02.24 01:02 신고

    https://xpenology.com/forum/topic/4320-공유-각종-유틸리티-사용을-위한-ipkg-설치-과정

  2. Favicon of https://wedul.site BlogIcon 위들 wedul 2019.02.25 08:29 신고

    export PATH=/opt/sbin:/opt/bin:$PATH

  3. Favicon of https://wedul.site BlogIcon 위들 wedul 2019.02.25 08:42 신고

    https://dzone.com/articles/building-redis-from-source-on-ubuntu-server-1804

  4. 손상진 2019.07.25 00:47

    글 도움 많이 받았습니다
    저같은 경우는 컴파일시에 libfl.so 파일을 못찾아서.. 추가적으로
    /opt/bin/ipkg install flex
    를 해서 해당 라이브러리를 설치하고 진행하니 잘 되더라고요~!

집에서 개인적으로 사용할 nas를 구입했다.


간단하게 파일 저장하고 공유하고 docker를 사용해서 mysql, redis등을 사용하기 위해서 구입했다.


위메프에서 ds118 20만원에 구입하고 wd 1tb nas용 하드를 구입했다. 구입은 맥을 사면서 적립되었던 포인트를 사용해서 실질적으로 구매비용은 10만원정도 들었다.


사실 하드를 nas용으로 사야하나 싶었으나 인터넷에 알아보니 nas에 일반 하드를 설치하면 고장날 확률이 많다고 한다. 대표적으로 nas에 경우 24시간 켜져있고 진동이 하드에 전달되기 때문에 고장난 확률이 높아진다고 한다. 그래서 nas 하드를 위메프에서 7만원에 구매했다.


박스는 안전하게 포장되어 왔다.

생각보다 가볍다. 비싼 제품인데 봉인 씰이 없는건 아쉽다.


내부를 뜯어보면 어댑터와 랜선 그리고 본체가 전부이다. ㅋㅋ

정말 별거없는데 드럽게 비싸다.


이제 이 제품들을 이용해서 nas를 구축해보자.

우선 같이 구입한 1TB NAS용 하드디스크를 뜯어보자.

아주 튼튼하다. 오랜만이다 맨날 2.5인치 ssd만 보다가 오랜만에 3.5인치 하드를 보니 낯설기도 하다 ㅋㅋ

순서에 맞게 하드를 자리에 꼽아준다.


같이 동봉된 나사를 각면마다 3개씩 꼽아준다.

설치가 완료되면 어댑터랑 랜선을 꼽고 자리에 배치해준다. 크기는 생각보다 작아서 책상위에 올려놓아도 아담하고 소음도 전혀없다.

이제 설정을 위해서 에이전트 화면에 접속해야하는데 같은 망에서 아래 기재되어 있는  url에 접속한다.



find.synology.com에 접속하게 되면 현재 같은 망에 연결되어있는 NAS 장비가 보여지고 DSM(synology os)를 설치할 수 있게 가이드가 주어진다.


하드디스크를 선택하고 설치를 진행한다.


설치는 사람들은 10분정도 걸린다고 하는데 나는 2분도 안걸린 것 같다.


설치가 완료되면 보안 작업을 해줘야하는데 대표적으로 DSM 포트변경, 접속 지역 제한, 알려진 포트 (22, 21....) 변경 및 차단, admin 계정 비활성화 등등 진행해야한다.


생각보다 좋다. 이거보다 더 느린 nas인 ds119j나 ds218j등을 사용했으면 큰일날뻔했다. 이것도 그렇게 빠르지 않아서 ㅋㅋㅋ 


아직 낯설고 어색하지만 잘 써보자.


  1. Favicon of https://kyome.tistory.com BlogIcon KYOME 2019.07.11 16:35 신고

    혹시 도커 설치하셨나요? ds118 글보고 도커 설치 할 수있겠다 싶어서 구매했는데..도저히 방법을 모르겠네요 도와주세요 ㅜㅜ

  2. Favicon of https://kyome.tistory.com BlogIcon KYOME 2019.07.11 16:38 신고

    방법이 없네요 ㅠㅠ 118로 우분투 돌릴 수 있는 방법은 없겠죠??

    • Favicon of https://wedul.site BlogIcon 위들 wedul 2019.07.11 16:38 신고

      어려울거에요. 저도 요새들어 더 좋은 나스 살걸 후회하고 있어요 ㅠ

  3. Favicon of https://kyome.tistory.com BlogIcon KYOME 2019.07.11 16:41 신고

    할 수 있는게 너무 제한적이네요..ㅜㅜ 알겠습니다 고마워요

간단하게 rabbitMQ 코드 만들어보는 도중에 메일전송기능이 필요했다.

그런데 메일을 계속 보낼수도 없기 때문에 메일이 잘 전송되고 있는지 확인할 수 있는 프로그램이 있는지 찾아봤다. 


그중에 Fake SMTP 라는 프로그램이 있어서 소개해본다.

프로그램은 하단에 첨부된 링크에서 다운받을 수 있다. 실행방법은 다운받은 파일위치에서  java -jar fakeSMTP-2.0.jar 명령어로 실행시키면 GUI 화면이 나온다.

스프링 부트에서 JavaMailSender와 간단한 설정을 통해 메일 전송 여부를 테스트 할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// application.properties
spring.mail.host=localhost
spring.mail.port=2525
 
// service
/**
 * microservice
 *
 * @author wedul
 * @since 2018. 8. 25.
 **/
@Component
public class Mailer {
 
    @Autowired
    private JavaMailSender javaMailSender;
 
    public void sendMail(String email) {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(email);;
        mailMessage.setSubject("Registration");
        mailMessage.setText("Successfully Registered");
        javaMailSender.send(mailMessage);
    }
}
 
cs


http://nilhcem.com/FakeSMTP/download.html#

프록시 서버(proxy server)


- 프록시 서버는 방화벽과 관련이 있다. 방화벽이 로컬 네트워크 안의 호스트가 외부 세상으로 직접 연결 하는 것을 금지한다면, 프록시 서버는 내부와 외부사이의 중계자 역할을 한다.


- 방화벽에 의해 외부 네트워크로 연결이 금지된 장비는 외부에 있는 원격 웹 서버에 직접 요청을 하는 대신 로컬 프록시 서버로 부터 웹 페이지를 요청할 수 있다. ( 프록시 서버는 해당 요청을 외부의 원격 웹 서버에 요청하고, 요청을 보낸 로컬 장비로 응답을 전달한다.)



단점

- 프록시 서버 사용 시 가장 큰 문제점은 모든 프로토콜이 아닌 일부 프로토콜만 지원한다는 것이다. 일반적으로 HTTP, FTP, SMTP 같은 TCP 연결 기반의 프로토콜들을 처리할 수 있지만 최신 프로토콜은 지원하지 못한다.

Java 소켓 통신(서버) 


서버 소켓은 서버에서 실행되며들어오는 TCP 연결을 기다린다.

자바는 본질적으로 ServerSocket 클래스를 제공한다,

 

서버 소켓 생성하기 (기본 생성방법)

4개의 생성자를 제공한다상황에 따라port, 요청  길이InetAddress 받아 생성   있고아무 정보가 없는 ServerSocket 파일도 생성이 가능하다.


-> 특정 InetAddress 객체를 전달 받았을 경우 입력받은 지정된 주소로 들어오는 연결에 대해서만 서버 소켓을 대기한다.

->포트번호를 0으로 설정할 경우 시스템은 사용할  있는 포트를 임의로 선택한다.

   사용자에게 임의로 선택된 포트는 미리 알수 없기에 익명 포트라고 한다익명 포트는 FTP 같은 다수의 소켓을 사용하는 프로토콜에 종종 사용된다.

 

해당 생성자에서 발생하는 예외는 IOException BindException이다.

해당 예외는 요청한 예외가 이미 사용 중이거나루트 권한이 없는 1 ~ 1023 사이의 포트에 바인딩을 시도한 경우다.

 

아무런 포트 바인딩이 되지 않은 경우에는 생성  bind()메소드를 통해 바인딩을 해주지 않으면 사용할  없다.

 

 

실행 흐름

  1. ServerSocket() 생성자를 사용하여 특정 포트 대한 새로운 ServerSocket 생성한다.
  2. ServerSocket() 자신의 accept()메소드를 사용하여 특정 포트로 들어오는 연결요청을 대기한다Accept() 클라이언트가연결을 시도할  까지 블로킹되며연결을 맺어진  클라이언트와 서버를 연결하는 Socket 객체를 반환한다.
  3. 서버 유형에 따라 Socket getInputStream() 메소드나  getOutputStream() 메소드를 호출하여 클라이언트와 통신에 필요한 입출력 스트림을 얻을  있다.
  4. 서버와 클라이언트는 연결을 종료하기 전까지 미리 정의된 프로토콜에 따라 대화한다.
  5. 서버나 클라이언트가 또는 둘다 연결을 종료한다.
  6. 서버는 다시 2번으로 돌아가 다음 연결을 기다린다.

 

시간을 반환하는 소켓 만들기

ServerSocket server = new ServerSocket(13); // 13 포트에서 대기하는 서버 소켓 생성

Socket connection = server.accept(); //accept() 호출되면 실행이 블록킹 된다클라이언트와 연결  때까지 무한 대기

OutputStream out = connection.getOutputStream();

Writer writer = new OutputStreamWriter(out, "ASCII");

 

Date now = new Date();

Out.write(now.toString +"\r\n"); // 캐리지 리턴과 라인피드의 쌍의 사용법에 주의하라.

Out.flush();

Connection.close();

 

위에 작업을 계속 반복적으로 수행하고 싶을 경우에

 

ServerSocket server = new ServerSocket(13); // 13 포트에서 대기하는 서버 소켓 생성

Try (Socket connection = server.accept(); //accept() 호출되면 실행이 블록킹 된다클라이언트와 연결  때까지 무한 대기) {

While(true) {

OutputStream out = connection.getOutputStream();

Writer writer = new OutputStreamWriter(out, "ASCII");

 

Date now = new Date();

Out.write(now.toString +"\r\n"); // 캐리지 리턴과 라인피드의 쌍의 사용법에 주의하라.

Out.flush();

Connection.close();

}

} catch (IOException ex) {}

 

다음과 같이 처리할  있다이런 서버를 반복서버라고 한다.

-> 하지만 이런 서버는 느린 클라이언트 하나가 서버 자체를 느리게   있는 단점이 있다.

-> 해당 서버는 수동으로 멈추기 전까지 무한 대기 상태에 빠져있다.

 

 

멀티스레드 서버

운영체제는 특정 포트를 통해 들어오는 연결 요청을 FIFO 큐에 저장한다.


자바는 기본 적으로  큐의 길이를 50으로 설정하지만운영체제마다 다르다.큐는 아직 처리가 되지 않은 연결로 가득  경우 호스트는 해당 포트의 큐에 빈자리가  때까지 추가적인 연결을 거부한다.


->ServerSocket 생성자는 큐의 기본길이를 변경할  있는 기능을 제공하지만 운영체제가 지원하는 최대 길이 이상을 증가  없기에

많은 연결이 맺어 질때 어려움이 발생한다.

 

위의 증상의 해결 방법은 큐에 추가되는 새로운 연결을 수용하는 스레드와 분리된 별도의 스레드를  연결마다  당하는 것이다.

 

위의 작성한 예제를  스레드로 분리해 보자.

Ex) 멀티 스레드 daytime 서버

Try(ServerSocket server = new ServerSocket(PORT)) {

While(true) {

Try {

Socket connection = server.accept();

Thread task = new DaytimeThread(connection);

Task.start();

} catch (IOException ex) {}

}

} catch (IOException ex) {

}

}

 

Private static class DayTimeThread extends Thread {

Private Socket connection;

 

DaytimeThread(Socket connection) {

This.connection = connection;

}

 

Public void run() {

Try {

Writer out = new OutputStreamWriter(connection.getOutputStream());

Date now = new Date();

Out.write(now.toString() +"\r\n");

Out.flush();

} catch (IOException ex) {

System.err.println(ex);

} finally {

Connection.close();

} catch (IOException e) {

}

}

}

}

 

-> 이런 방식으로 들어오는 연결에 대해 처리하는 비즈니스 로직을 쓰레드로 처리하게 되면서  연결마다 처리되는 로직이 쓰레드로 관리되어 서로의 동작이 영향을 받지 않느다.


-> 하지만 다음과 같은 방식은 무제한의 쓰레드를 생성하기에 메모리 이슈가 발생할  있다이를 해결 하기 위해 쓰레드 풀을 사용한다.

 

ExecutorService pool = Executors.newFixedThreadPool(50);

Try(ServerSocket server = new ServerSocket(PORT)) {

While(true) {

Try {

Socket connection = server.accept();

Callable<Void> task = new DaytimeTask(connection);

Pool.submit(task);

} catch (IOException ex) {}

}

} catch (IOException ex) {

}

}

 

Private static class DayTimeTask implements Callable<Void> {

 

Private Socket connection;

 

DaytimeThread(Socket connection) {

This.connection = connection;

}

 

Public void run() {

Try {

Writer out = new OutputStreamWriter(connection.getOutputStream());

Date now = new Date();

Out.write(now.toString() +"\r\n");

Out.flush();

} catch (IOException ex) {

System.err.println(ex);

} finally {

Connection.close();

} catch (IOException e) {

}

}

}

}

 

 

 

서버 소켓은 Serversocket.close() 메소드를 통해 연결을 종료한다.

종료된 소켓은 어떠한 방식으로도  연결을   없다Java 7에서 소개된 방식을 사용하여 try resource catch 문장을 사용하여자동으로 자원을 해제   있다.

 


로그 남기기

일반적으로  가지의 내용을 로그에 남긴다.

  1. 요청
  2. 서버 에러

 

감사로그(요청) 연결마다 남기거나연결에서 다수의 동작이 있을 경우 연결의 동작마다 로그를 남긴다.

에러 로그는 서버 운영 중에 발생하는 예측되지 않은 예외를 기록한다.

클라이언트와의 연결 종료와 같은 동작에 관련된 예측이 예상되는 에러는 감사로그에 남긴다.

 

일반적으로 1.3 이후부터는 java.util.logging 패키지를 사용한다.

Private final static Logger auditLogger = Logger.getLogger("request");

이와 같은 문장을 사용하여 Logger 선언한다.

-> Logger 스레드 환경에서 안전하다.

 

생성된 Logger 파일에서 log() 메소드를 활용하여 로그를 남길  있다.

Log()메소드에서 파라미터로 사용되는 로그의 레벨은 7 가지이다 심각성에 따라 설정   있다.

 

소켓 옵션

Socket 옵션은 ServerSocket 클래스가 의존하는 네이티브 소켓이 데이터를 주고받는 방법을 명시한다서버 소켓을 위해 자바는 3가지 옵션을 제공한다.

 

- SO_TIMEOUT

- SO_REUSEADDR

- SO_RCVBUF

 

SO_TIMEOUT

Public void setSoTimeout(int timeout)

Public int getSoTimeout()

SO_TIMEOUT accept() 메소드가 들어오는 연결을 대기하는 시간이다.

-> 0으로 설정된 경우 하염없이 기다린다기본값이 0이다.

 

RE_USEADDR

Public boolean getReuseAddress()

Public void setReuseAddress(boolean on)

RE_USEADDR 새로운 소켓이 바인딩하려는 포트에 대해 이전에 바인딩된 소켓으로 전송 중인 데이터가 있는 경우에도 해당 포트를 바인딩

  있는지 여부를 결정한다.

 

SO_RCVBUF

Public int getReciveBufferSize()

Public void setReceiveBufferSize()

SO_RCVBUF 옵션은 서버 소켓에 의해 수용된 클라이언트 소켓의 기본 수신 버퍼의 크기를 설정한다.

인터넷 트래픽에 따라 버퍼를 설정한다.

 

 

 

 

'JAVA > 자바 네트워크 프로그래밍' 카테고리의 다른 글

HTTP  (0) 2016.12.24
URL 그리고 URI, Proxy  (0) 2016.12.24
소켓 통신 (어플리케이션)  (0) 2016.12.24
UDP 통신  (0) 2016.12.24
Java 소켓 통신(서버)  (0) 2016.12.24
java 소켓 통신 (보안소켓)  (0) 2016.12.24

+ Recent posts