1. 환경

 - CF + ELB + EC2(nginx)

 

2. 문제

 - 클라이언트 ip주소에 ELB, CloudFront IP들이 덧씌워진다. (ex : 1.1.1.1, 2.2.2.2, 3.3.3.3)

 - ip deny or was에서 처리할때 문제가 발생한다.

 

3. 해결방법

 1) nginx real ip 기능(참고자료)

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

 - 위 방법은 또 다른 문제를 발생 시킬 수 있음.

 - 아래 curl을 날려보자.

curl --header "X-Forwarded-For: 1.2.3.4" "http://example.com/"

  - nginx 로그를 켜서 보게되면 사용자 ip가 1.2.3.4로 나오게 될 겁니다.

 

2) nginx real ip + make-nginx-real-ip-conf(소스링크) 사용

 - make-nginx-real-ip-conf로 만든 conf 파일을 include 시킨다. 끝!

 - 아래는 make-nginx-real-ip-conf 프로그램으로 생성한 파일입니다.

#Make at 20170907162608
#your ELB IP
set_real_ip_from 110.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;

#AWS CloudFront IP/CIDR range
set_real_ip_from 13.113.203.0/24;
set_real_ip_from 13.124.199.0/24;
set_real_ip_from 13.228.69.0/24;
set_real_ip_from 13.32.0.0/15;
set_real_ip_from 13.54.63.128/26;
set_real_ip_from 13.59.250.0/26;
set_real_ip_from 204.246.164.0/22;
set_real_ip_from 204.246.168.0/22;
set_real_ip_from 204.246.174.0/23;
set_real_ip_from 204.246.176.0/20;
set_real_ip_from 205.251.192.0/19;
set_real_ip_from 205.251.249.0/24;
set_real_ip_from 205.251.250.0/23;
set_real_ip_from 205.251.252.0/23;
set_real_ip_from 205.251.254.0/24;
set_real_ip_from 216.137.32.0/19;
set_real_ip_from 34.195.252.0/24;
set_real_ip_from 34.226.14.0/24;
set_real_ip_from 35.158.136.0/24;
set_real_ip_from 35.162.63.192/26;
set_real_ip_from 35.167.191.128/26;
set_real_ip_from 52.15.127.128/26;
set_real_ip_from 52.199.127.192/26;
set_real_ip_from 52.212.248.0/26;
set_real_ip_from 52.220.191.0/26;
set_real_ip_from 52.222.128.0/17;
set_real_ip_from 52.46.0.0/18;
set_real_ip_from 52.52.191.128/26;
set_real_ip_from 52.56.127.0/25;
set_real_ip_from 52.57.254.0/24;
set_real_ip_from 52.66.194.128/26;
set_real_ip_from 52.78.247.128/26;
set_real_ip_from 52.84.0.0/15;
set_real_ip_from 54.182.0.0/16;
set_real_ip_from 54.192.0.0/16;
set_real_ip_from 54.230.0.0/16;
set_real_ip_from 54.233.255.128/26;
set_real_ip_from 54.239.128.0/18;
set_real_ip_from 54.239.192.0/19;
set_real_ip_from 54.240.128.0/18;
set_real_ip_from 2600:9000::/28;

# always put the following 2 lines in the bottom of ip list
real_ip_header X-Forwarded-For;
real_ip_recursive on;


3) make-nginx-real-ip-conf 란??

  - AWS에서는 사용중인 ip를  json으로 공유해줍니다.

  - 그중 CloudFront 대역 Ip v4, Ip v6만 파싱합니다.

  - 내부 아이피 대역을 추가합니다. (지인의 말리퀘로 추가된 부분입니다.)

  - nginx real ip에 필요한 CloudFront, ELB 대역만 정리하여 파일로 생성해주는 프로그램입니다.

  * 참고로 https://ip-ranges.amazonaws.com/ip-ranges.json 가 변경되는 내용을 AWS SNS Topic으로 받을 수 있고, 해당 이벤트로 람다를 실행 시킬 수 있습니다.

 

 

 

* 참고링크

 - http://serverfault.com/questions/331531/nginx-set-real-ip-from-aws-elb-load-balancer-address

1. download

 1) 링크가져오기

 - https://www.python.org/downloads/release/python-352/ 에서 다운로드


 - 명령어 실행

wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz


2. 설치

 1) MakeFile 만들기 위한 실행

./configure

 2) 소스 컴파일

make

 3) 소스 설치

sudo make install


3. 확인

python3 --version

'OS > Linux' 카테고리의 다른 글

ImageMagicK 설치  (0) 2016.12.20
Jdk 8 Install on AWS EC2  (0) 2016.11.17
[Pyton3] python 3.5.2 Install  (0) 2016.09.09
호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23

1. 리팩토링
- 프로젝트를 좀 더 편하게(?) 관리하기 위해선 꾸준히 코드 품질 관리를 해줘야 할 것 같다.
- 추후 다른사람이 해당 프로젝트를 담당하게 될 때, 코드(+주석)만으로도 충분히 업무를 처리 할 수 있게 하고,
- 기능 추가에 따른 코드 수정을 엉뚱한 곳에 조건문을 추가하여 '에라 모르겠다! 일단 추가먼저 하자!!'가 아닌 명확한 처리가 가능하도록! 꾸준한 관리가 필요할 것 같다.

2. 새로운 기술
- '유행'하는 기술이라고 무조건 습득할 필요는 없을 것 같다.
- '내가' 추구하는 '개발자'에 필요한 기술이라면 모를까 남들도 한다고, 나까지 할 필요는 없다.
- 그리고 어떤 기술 한가지를 배울 때, 대충이 아닌 제대로 배우자!

3. 여행
- 이번 여행 '친구와 함께하는 비글여행!'
- 일단 맛난거 많이 먹고 죽자!
- 언제나처럼 많은 걸 보고 오자!

4. 아이폰7
- 이것저것 기술이 추가되고, 변화를 추구해서 '3.5 이어폰 단자' 포기. 어떻게 보면 혁명! 허나 이건 혁명보단 '장사'
- 단자가 없어진다는 루머가 돌았을 때! '오!! 뭔가 애플스러운게 나오겠구만!' 이라는 기대가 있었는데, 이건 뭐 남들이 이미 만들었던 형태의 '무선 이어폰'이다. 그것도 번들이 아닌 '비싸다'
- 곧 2년이 되는 내 아이폰.... 좀 더 사랑해줘야겠다.

5. 맥북
- 내 맥북의 슬슬 수명을 다해가고 있다.(난 그렇게 믿고 있다. 바꾸고 싶어서는 절대 아니다)
- 10월 중순쯤 새로운 맥북이 공개될 거 같다.
- 총알 장전하자!

첫 단상은 여기까지!

'개인 > 단상' 카테고리의 다른 글

2018-06-05 : Cloud Native Day in seoul  (0) 2018.06.05
2018-05-01  (0) 2018.05.01
Aws re:invent 2017! 후기  (0) 2017.12.02
2016-10-01  (0) 2016.10.01
2016-09-08  (0) 2016.09.08
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

 

(해결책)

-p 를 붙이자

 

ex) mysql -p ******(password)

 

 

'DataBase > Mysql & MariaDB' 카테고리의 다른 글

[Mysql] Create Table like  (0) 2018.04.13
[Mysql] 기억하면 좋은 쿼리 모음  (0) 2018.04.03
[Mysql] 데이터의 암호화, 복호화  (0) 2016.11.17
[Mysql]ERROR 1045 (28000)  (0) 2016.08.23

1. 현재 호스트 확인

hostname


2. 호스트명 변경

vi /etc/sysconfig/network

내에 HOSTNAME="" 안 값을 변경

vi /etc/HOSTNAME

좀전에 넣은 값을 넣음

 

3. 재시작

reboot

 

4. 확인

hostname

 

'OS > Linux' 카테고리의 다른 글

Jdk 8 Install on AWS EC2  (0) 2016.11.17
[Pyton3] python 3.5.2 Install  (0) 2016.09.09
호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23
[AWS S3] s3fs 설치하기(Centos)  (0) 2016.08.18

1. 열린포트 확인 

netstat -anp | grep LISTEN​


2. 포트 열기

 1) iptables 수정

vi ​/etc/sysconfig/​iptables

 

 2) 원하는 포트 추가

iptables -I INPUT -p tcp --dport 포트번호 -j ACCEPT


 3) 적용

service iptables restart​



'OS > Linux' 카테고리의 다른 글

[Pyton3] python 3.5.2 Install  (0) 2016.09.09
호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23
[AWS S3] s3fs 설치하기(Centos)  (0) 2016.08.18
Maven Install  (0) 2016.08.14

Eclipse에서 Window - Preferences 에서 'encod'로 검색 



 

 

1. pom

<!-- WebSocket -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>

2. java source 

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Set;

@ServerEndpoint(value = "/websocket/chat/{clientId}")
public class ChatAnnotation {

private static final Set<ChatAnnotation> connections = new CopyOnWriteArraySet<>();

private String nickname;
private Session session;

@OnOpen
public void start(@PathParam("clientId") String clientId, Session session) {
this.nickname = clientId;
this.session = session;
connections.add(this);
}

@OnClose
public void end() {
connections.remove(this);
}

@OnMessage
public void incoming(String message) {
// Never trust the client
String filteredMessage = String.format("%s: %s", nickname, message.toString());
broadcast(filteredMessage);
}

@OnError
public void onError(Throwable t) throws Throwable {
//log.error("Chat Error: " + t.toString(), t);
}

private static void broadcast(String msg) {
for (ChatAnnotation client : connections) {
try {
synchronized (client) {
String message = "{clId:'" + client.nickname + "',msg:'" + msg + "'}";
client.session.getBasicRemote().sendText(filter(message));
}
} catch (IOException e) {
connections.remove(client);
try {
client.session.close();
} catch (IOException e1) {
// Ignore
}
String message = String.format("* %s %s", client.nickname, "has been disconnected.");
broadcast(message);
}
}
}

private static String filter(String message) {

if (message == null)
return (null);

char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("&lt;");
break;
case '>':
result.append("&gt;");
break;
case '&':
result.append("&amp;");
break;
case '"':
result.append("&quot;");
break;
default:
result.append(content[i]);
}
}
return (result.toString());

}
}

3. jsp page

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<style type="text/css">
.scrollup {
position: fixed;
bottom: 0px;
right: 0px;
z-index: 99999;
text-align: right;
padding-right: 10px;
}
.chat{
list-style: none;
margin: 0;
padding: 0;
}

.chat li{
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 1px dotted #B3A9A9;
}

.chat li.left .chat-body{margin-left: 60px;}
.chat li.right .chat-body{margin-right: 60px;}


.chat li .chat-body p
{
margin: 0;
color: #777777;
}

.panel .slidedown .glyphicon, .chat .glyphicon
{
margin-right: 5px;
}

.panel-body
{
overflow-y: scroll;
height: 250px;
}

::-webkit-scrollbar-track
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
background-color: #F5F5F5;
}

::-webkit-scrollbar
{
width: 12px;
background-color: #F5F5F5;
}

::-webkit-scrollbar-thumb
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #555;
}
</style>
<script type="text/javascript">
var chat = {};
chat.socket = null;
chat.connect = (function(host) {
if ('WebSocket' in window) {
chat.socket = new WebSocket(host);
} else if ('MozWebSocket' in window) {
chat.socket = new MozWebSocket(host);
} else {
chatContent.append('Error: WebSocket is not supported by this browser.', 'left');
return;
}

chat.socket.onopen = function () {
chatContent.append('Info: WebSocket connection opened.', 'left');
document.getElementById('chat').onkeydown = function(event) {
if (event.keyCode == 13) {
chat.sendMessage();
}
};
};

chat.socket.onclose = function () {
document.getElementById('chat').onkeydown = null;
chatContent.append('Info: WebSocket closed.', 'left');
};

chat.socket.onmessage = function (message) {
chatContent.append(message.data, 'right');
};
});
chat.initialize = function() {
if (window.location.protocol == 'http:') {
//console.log(window.location.host);
chat.connect('ws://' + window.location.host + '/websocket/chat/${login_empnm}');
} else {
chat.connect('wss://' + window.location.host + '/websocket/chat/${login_empnm}');
}
};

chat.sendMessage = (function() {
var message = document.getElementById('chat').value;
if (message != '') {
chat.socket.send(message);
document.getElementById('chat').value = '';
}
});
var chatContent = {};
chatContent.append = (function(message,addClassNm){
var chatContainer = document.getElementById('chat_li');
var li = document.createElement('li');
var span = document.createElement('span');
span.style.wordWrap = 'break-word';


console.log("msg : "+message);
span.innerHTML = message;


span.className = "pull-"+addClassNm
li.appendChild(span);
li.className = "clearfix ";
li.className = li.className +" "+addClassNm;
chatContainer.appendChild(li);

document.getElementById('chat_body').scrollTop = document.getElementById('chat_body').scrollHeight;

while (chatContainer.childNodes.length > 25) {
chatContainer.removeChild(chatContainer.firstChild);
}
});

chat.initialize();

function chkMyMsg(msgJson){

}
</script>
<div>
<p>

</p>
<div id="console-container">
<div id="console"></div>
</div>
</div>


<div class="scrollup span4">
<div class="row-fluid">
<div class="box dark">
<header>
<h5>Chat</h5>
<div class="toolTip">
<a class="btn btn-primary btn-small" data-toggle="collapse" data-parent="#accordion"
href="#collapseOne" style="margin-top: 5px; margin-right: 2px;">
Open
</a>
</div>
</header>
<div class="body collapse" id="collapseOne">
<div class="panel-body" id="chat_body">
<ul id="chat_li" class="chat"></ul>
</div>
<div>
<div class="input-group">
<input type="text" placeholder="type and press enter to chat" id="chat" >
<span class="input-group-btn">
<button class="btn btn-warning btn-sm" id="btn-chat">
Send</button>
</span>
</div>
</div>
</div>
</div>
</div>
</div>

 

 


'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

1. telegram bot

 - 2015년 6월 24일 텔레그램 봇 api 공식 발표

 - 기존에는 telegram-cli를 활용한 봇이 많았음

 - 어떤 차이점이 있을까?

 구분

telegram-cli 

telegram-bot 

 지원

오픈소스커뮤니티(비공식) 

텔레그램(공식)

 통신 API

텔레그램 API 

bot API 

 계정

실제 유저 계정 

Bot 계정 

 UI

메시지

메시지, 커스텀 키보드 

 

 


2. Bot 만들기

 - https://telegram.me/botfather 주소로 접속해서 @BotFather 사용자를 추가함

 - 대화창에 들어가면 아래와 같이 화면이 활성화 됨.

 

 * /help를 통해 사용가능한 명령어를 확인할 수 있음.

 - /newbot 메시지를 보내서 봇을 등록할 수 있음.(봇 이름, 봇 아이디 순으로 등록한다. 봇 이름은 한글도 사용가능함)

 - 등록을 하면 봇 api 사용에 필요한 token을 보내줌. (꼭 필요한 값이므로 저장해 놓는 것이 좋다.)

 

3-1. node.js

 -npm 설치 

npm install node-telegram-bot 


- source code

/**

 * Created by geunspage on 2015-10-05.

 */

var Bot = require('node-telegram-bot');

var bot = new Bot({

    token: 'your_bot_token'

}).on('message', function (message) {

        if(message.text == '/test'){

            bot.sendMessage({

                chat_id: message.chat.id,

                text: 'geuns Test : ' + message.text

            });

        }else if(message.text == 'Hello'){

            bot.sendMessage({

                chat_id: message.chat.id,

                text: message.text +' World geuns Telegram Bot'

            });

 

        }else if(message.text == 'time'){

            bot.sendMessage({

                chat_id: message.chat.id,

                text: 'cur '+new Date()

            });

 

        }

        console.log(message);

    })

    .start(); 



4. 실행 화면

 

5. 기타

 - 서버 모니터링 등 여러 분야에서 활용 가능할 것 같음.

 - 생각보다 샘플들이 많아서 본인 입맛에 맞춰서 수정 가능할 듯.

 - 

 

6. 참고 URL

 - https://core.telegram.org/bots/api

 - http://bakyeono.net/post/2015-08-24-using-telegram-bot-api.html

 - https://github.com/depoio/node-telegram-bot




'프로그래밍 > 개인프로젝트' 카테고리의 다른 글

[AppStore Viewer] 1. 세팅하기.  (0) 2018.04.17
[Github] Github 페이지 활용하기.  (0) 2017.02.06
텔레그램 봇 활용하기 -1  (0) 2016.08.23

1. su와 su - 의 차이

ex) su - root

ex) su root

 

root로 로그인을 변경한다는 것은 동일하다

 

그러나 

 

"su" 만 사용할 경우 root 권한에 포함되어 있는 환경변수는 하나도 가져오지 않음. 

 

즉, 어떠한 환경변수도 포함하지 않고 단지 로그인 계정만 바꿈

 

"su -"의 경우 환경변수까지 다 가져옵니다. 또한 su - root를 하면 기본 /root 디렉토리로 이동해 있을 것이다.

 


'OS > Linux' 카테고리의 다른 글

호스트 네임 변경하기  (0) 2016.08.23
Centos 방화벽 설정  (0) 2016.08.23
su와 su - 의 차이점  (0) 2016.08.23
[AWS S3] s3fs 설치하기(Centos)  (0) 2016.08.18
Maven Install  (0) 2016.08.14
Webserver 'nginx' install on Centos 6.5  (0) 2016.08.14

+ Recent posts