UPNS 설치가이드¶
1. 개요¶
1-1. 목적¶
본 문서는 (주)유라클에서 제공하는 모피어스 제품군 중 “MSP Server Platform - Push”의 원활한 설치를 할 수 있도록 제품 설치에 관련한 설명과 수행 절차를 나타내는 것을 목적으로 한다. 본 문서는 Push 기능 중 UPNS 설치에 관한 내용을 기술하고 있다.
1-2. 고려 사항¶
본 문서는 성능 개선, 기능 추가 등의 사항으로 내용이 변경 될 수 있다.
2. UPNS 서버 구성도¶
2-1. UPNS 서버 구성 개념도¶
2-2. 구성 요소¶
Server
주요 역할
주요 기능
UPNS
메세지 전송기능 및 단말기 접속을 담당 하는 전용 서버
세션 관리
단말로 메세지 전송
접속 유지
현재 접속자 수 조회
발송 메시지 수 조회
수신 메시지 수 조회
로그 저장
3. 설치 준비¶
3-1. 설치 전 필요한 프로그램¶
설치를 하기 전 다음 사항이 준비 되어야 한다.
항목
설명
비고
개발툴및유틸
JAVA 1.6.0_26
3-2. 시스템 환경 설정(Linux 기준)¶
UPNS 서버가 100만 유저를 접속 하기 위해서는 다음 사항이 설정 되어야 한다.
$cat /etc/sysctl.conf
# General gigabit tuning:
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_syncookies = 1
#this gives the kernel more memory for tcp
#which you need with many (100k+) open socket connections
net.ipv4.tcp_mem = 50576 64768 98152
net.core.netdev_max_backlog = 2500
# I was also masquerading the port comet was on, you might not need this
net.ipv4.netfilter.ip_conntrack_max = 1048576
$ cat /etc/security/limits.conf
* soft nproc 819200
* hard nproc 819200
* soft nofile 1048570
* hard nofile 1048570
# process별 port 제한 설정
$ vi /etc/sysctl.conf
net.ipv4.ip_local_port_range=1024 64000
(1024~64000 포트 사용가능)
$ sysctl -p
4. UPNS 설치¶
4-1. UPNS설치¶
설치를 할 서버에 로그인
설치 파일을 설치할 디렉토리에업로드한다.
ex) upns_3.5.tar.gz
압축을 해제한다.
ex) tar xvzf upns_3.5.tar.gz
4-2. UPNS 파일 목록¶
파일 경로
설명
Upns.jar
UPNS 데몬
Stop.sh
stop 스크립트
Upns_start.sh
Start 스크립트
Conf/config.xml
Upns 설정파일
Conf/ehcache.xml
캐쉬 설정파일
Conf/logback.xml
Upns log 설정파일
Conf/server_keystore.jks
서버 keystore (파일 경로 고정)
5. UPNS의 실행¶
5-1. 서버 Config파일 설정¶
$ vi conf/config.xml *기본으로 빨강색만 수정하시면 됩니다.
<configuration>
<!– listen 포트 –>
<port>1883</port>
<!—SSL 서비스 포트
<ssl_port >8883</ssl_port>
<!—SSL 암호화 방식 지정 *기본으로 설정하지 않으면 자동으로 결정
<ssl_cipher_suite></ssl_cipher_suite>
<!– 전송 정보 수신 포트 –>
<cache_port>18883</cache_port>
<!– 모니터링 포트 –>
<monitor_port>18880</monitor_port>
<!– 전송 정보 공유 서버 지정 , 단독 설치시 UPNS 사용안함 : 127.0.0.1–>
<broker_server_ip>1.0.0.1,1.0.0.2</broker_server_ip>
<!– 메시지 발송 결과 전송 서버 지정 ip, port 사용안함: 0.0.0.0 –>
<log_server_ip>1.0.0.1,1.0.0.2</log_server_ip>
<log_server_port>10000</log_server_port>
<!– 발송 정보 캐쉬 공유 주기 1000ms –>
<cache_replication_interval>1000</cache_replication_interval>
<!– 세션 idle 타임아웃 (분) 기본값 :30분 –>
<idle_timeout_min>30</idle_timeout_min>
<!– 메시지 처리 쓰레드 카운트–>
<protocol_thread_count>5</protocol_thread_count>
<!– Message 큐 사이즈 –>
<max_message_queue_size>10000</max_message_queue_size>
<!– 메시지 사이즈 제한 (byte) MaxSize 268435455 bytes, 기본값:제한 없음 –>
<message_size_limit>0</message_size_limit>
<!– offline 메시지 전송 주기(초) 기본값 : 0 사용 안함 –>
<resend_interval>0</resend_interval>
<!– 메시지 큐 사이즈 제한 기본값 : 0 사용안함 –>
<queue_size>0</queue_size>
<!– 사용자당 메시지 보관 갯수 –>
<cache_user_msg_count>10</cache_user_msg_count>
<!– 결과 로그 전달 주기 10s –>
<result_log_send_interval>10</result_log_send_interval>
<!– 오프라인 메시지 전달 주기 s(현재 미구현) –>
<offline_send_interval>60</offline_send_interval>
<!– 모니터링 정보 출력 간격 30s –>
<monitor_print_interval>10</monitor_print_interval>
<!– 리시버의 수신확인, 실패 처리 URL 호출 여부. N일경우 아래의 설정 모두 소용없음–>
<receiver_sent_call_yn>Y</receiver_sent_call_yn>
<!– ehcache.xml에서 설정한 timeToLiveSeconds 시간 초과시 발송 실패처리하는 리시버API URL–>
<receiver_fail_msg_url>`*http://ip:port/rcv_fail_msg_ack.ctl</receiver_fail_msg_url* <http://ip:port/rcv_fail_msg_ack.ctl%3c/receiver_fail_msg_url>`__>
<!– 리시버 보낸 메세지 수신확인 URL–> <receiver_sent_msg_url>`*http://ip:port/rcv_register_sent_ack.ctl</receiver_sent_msg_url* <http://ip:port/rcv_register_sent_ack.ctl%3c/receiver_sent_msg_url>`__>
<!– 수신확인 Sleep time–>
<receiver_sent_sleep_miltime>10</receiver_sent_sleep_miltime>
</configuration>
5-2. Logback 설정
$ vi conf/logback.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<configuration scan=”true” scanPeriod=”60 seconds”>
<appender name=”SERVER” class=”ch.qos.logback.core.rolling.RollingFileAppender”>
<prudent>true</prudent>
<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>
<fileNamePattern>./log/logFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
<maxHistory>12</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %class - %msg%n</pattern>
</encoder>
</appender>
<appender name=”STDOUT” class=”ch.qos.logback.core.ConsoleAppender”>
<layout class=”ch.qos.logback.classic.PatternLayout”>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %class - %msg%n</pattern>
</layout>
</appender>
< !–해당 경로 수신확인 임시 로그 경로로 고정되어 있습니다. result 경로 수정하지 마세요.–>
<appender name=”PUBACK” class=”ch.qos.logback.core.rolling.RollingFileAppender”>
<prudent>true</prudent>
<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>
<fileNamePattern>./result/RESULT.%d{yyyy-MM-dd-HHmm}.log</fileNamePattern>
<maxHistory>36</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<appender name=”MONITOR” class=”ch.qos.logback.core.rolling.RollingFileAppender”>
<prudent>true</prudent>
<rollingPolicy class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”>
<fileNamePattern>./log/monitor.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
<maxHistory>1440</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %msg%n</pattern>
</encoder>
</appender>
<!—수신확인 결과 저장 –>
<logger name=”puback”>
<appender-ref ref=”PUBACK” />
</logger>
<!—모니터링 로그 –>
<logger name=”monitor” level=”INFO”>
<appender-ref ref=”MONITOR”/>
</logger>
<!—UPNS 서버 로그 –>
<logger name=”server” level=”INFO”>
<appender-ref ref=”SERVER” />
</logger>
</configuration>
5-3. Cache 설정¶
$ vi conf/ehcache.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<ehcache>
<diskStore path=”user.dir/cache” />
<cache name=”publish”
maxEntriesLocalHeap=”100000”
eternal=”false”
overflowToDisk=”false”
diskPersistent=”false”
timeToIdleSeconds=”30”
timeToLiveSeconds=”30”
memoryStoreEvictionPolicy=”FIFO”/>
<!—timeToIdleSeconds,timeToLiveSeconds 를 수정해서 offline 메시지 보관기간 설정 가능
<cache name=”offmessage”
maxElementsInMemory=”500000”
eternal=”false”
overflowToDisk=”true”
diskSpoolBufferSizeMB=”200”
diskPersistent=”true”
diskExpiryThreadIntervalSeconds=”100”
timeToIdleSeconds=”86400”
timeToLiveSeconds=”86400”
memoryStoreEvictionPolicy=”FIFO” />
<cache name=”sessioncheck”
maxEntriesLocalHeap=”1000”
overflowToDisk=”false”
diskPersistent=”false”
timeToIdleSeconds=”1”
timeToLiveSeconds=”1”
memoryStoreEvictionPolicy=”FIFO”/>
</ehcache>
5-4. UPNS 실행¶
upns_start.sh 스크립트 파일을 실행하여 upns를 실행한다.
$./upns_start.sh
5-5. UPNS 중지¶
stopl.sh 스크립트 파일을 실행하여 upns를 중지한다.
$./stop.sh
5-6. UPNS 실행 확인¶
ps–ef | grep upns 으로upns가 실행 중인지 확인 할 수 있다
5-7. UPNS 버전 확인¶
$java –jar upns.jar –version
UPNS Verion : 3.0.1
6. Appendix¶
6-1. UPNS 설치 확인¶
6-1-1. 메시지 수신¶
메시지 수신, 전송 툴은 윈도우용입니다.
Cmd > mosquitto_sub.exe -h “serverip” -p 1883 -t test -q 1
Test_message
메시지 수신 대기 상태에서 메시지 전송을 하면 메시지 전달을 확인 할 수 있다.
6-1-2. 메시지 전송¶
Cmd > mosquitto_pub.exe -h “serverip” -p 1883 -t test -m test_message -q 0
6-2. UPNS 서버 Port 번호¶
서버
Listen
Port 번호
UPNS
Client 요청
1883
전송 메시지 공유
18883
모니터링 포트
18880
Result LOG
UPNS
10000(success), 10001(fail)
6-3. UPNS 서버 로그¶
서버 로그 (logger name=”server”)
로그레벨
로그내용
설명
DEBUG
CONNECT clientid
사용자 접속 정보 (사용자 ID)
SUBSCRIBE topic,clientid
구독 정보 (토픽, 사용자 ID)
PUBLISH clientid,topic,msgid
발송 정보 (수신자 ID, 토픽, msgid)
PUBLISH subscribe clientid,topic,msgid
오프라인 발송정보 (수신자 ID, 토픽, msgid)
PUBACK clientid,msgid
수신 확인 응답 (사용자 ID)
PUBACK session check clientid,msgid
세션체크용 수신 확인 응답(사용자 ID)
DISCONNECT clientid
접속종료 (사용자 ID)
PINGREQ clientid:
PING 수신 (사용자 ID)
closed clientid
사용자 접속 종료(네트워크 종료)
Cache Send fail
캐쉬 정보 전달 실패
Cache send Success
캐쉬 정보 전달 성공
CacheRemove info
캐쉬 삭제 사용자 정보(다른 서버 전달 성공)
CacheRemove complete
캐쉬 삭제 완료
Result log send
로그 전송 내용
Log send success
로그 전달 성공
Log send fail
로그 전달 실패
Monitor request host:$host,uri:$
모니터링 API 호출 정보
INFO
duplicate login id
중복 로그인 정보
VERIONS:
UPNS 버전 정보
Upns cache server started at port
캐쉬 서버 포트(메시지 전송 결과 공유)
upns socket server started at port
MQTT 서버 시작 기본포트 1883
Upns monitor server started at port
모니터링 리슨 포트
Server stopping
서버 중지중..(캐쉬 정보 파일로 저장)
Server stopped
서버 중지
connect cache server
캐쉬 서버 접속 성공
connect fail cache server
캐쉬 서버 접속 실패
Result log connect try server:
로그 서버 접속 시도 정보
Result log connect server
로그 서버 접속 성공
Reslut log connect fail server
로그 서버 접속 실패
ERROR
subscribe exception clientid
구독 프로토콜 예외발생
Result log Exception msg
전송 결과 전달중 예외 발생
broker exception clientid
MQTT 접속 예외 발생
6-4. 모니터 로그 (logger name=”monitor”)¶
Monitor 로그 정보
설명
INFO
CPU Usage
cpu 사용률
current session count
현재 세션 개수 접속자수
current topic count
현재 토픽 구독 개수
publish count
publish 요청 받은 개수
puback count
publish 후 puback 수신 개수
offline cache user
발송 실패 사용자 수
publish cache count
publish 후 응답 대기 건수
6-5. SSL 통신을 위한 keystore, truststore 생성¶
패스워드는 msppush 로 설정
cmd> keytool -genkeypair -alias upns -keyalg RSA -validity 36000 -keystore server_keystore.jks
cmd> keytool -export -alias upns -keystore server_keystore.jks -rfc -file selfsignedcert.cer
cmd> keytool -import -alias upns -file selfsignedcert.cer -keystore upns_trust.jks