'여행 > 日本 - 大阪(Osaka)' 카테고리의 다른 글
오사카 자유여행 4일차~ (2012. 8. 2) (0) | 2016.06.11 |
---|---|
오사카 자유여행 5일차~ (2012. 8. 3) - 마지막 (0) | 2016.06.11 |
[3박 4일] 2015.01.21 (0) | 2016.06.11 |
[3박 4일] 2015.01.22 (0) | 2016.06.11 |
[3박 4일] 2015.01.23 (0) | 2016.06.11 |
오사카 자유여행 4일차~ (2012. 8. 2) (0) | 2016.06.11 |
---|---|
오사카 자유여행 5일차~ (2012. 8. 3) - 마지막 (0) | 2016.06.11 |
[3박 4일] 2015.01.21 (0) | 2016.06.11 |
[3박 4일] 2015.01.22 (0) | 2016.06.11 |
[3박 4일] 2015.01.23 (0) | 2016.06.11 |
최초에 SVN 세팅 후, Commit을 한번하고 Show log 메뉴를 선택하면,
오프라인 모드로 전환하겠냐고 물어보는 경우가 있다.
이런 경우 SVN 서버가 설치된 서버에서 각 Repo경로로 이동하여 conf/authz 파일을 편집하여,
아래와 같은 구문을 넣어주면 해결된다.
[/]
* = r
[SVN] show history 권한 (0) | 2016.06.11 |
---|---|
[SVN] Commit Message 강제화 시키기 (0) | 2016.06.11 |
기본적으로 svn에서 show history를 하는 방식은
anonymous 로써 history를 볼 수 있는 것이고, 계정 단위로는 따로 권한이 없다고 한다.
그렇다고 anonymous에 read권한을 줘버리면, 전혀 상관없는 사람이 repository url을 캐내서
checkout을 받아서 파일을 빼갈 수 있게 되버리는데,
이런 경우에 svnserve.conf 파일의 내용을 아래와 같이 고치고 anonymous에 read권한을 주면 해결이 된다.
* svnserve.conf
[general]
anon-access = none # 기본 값이 read로 되어 있는데 이걸 none으로 바꿔서 anonymous는 아무것도 못하게 해버린다.
* authz
[/]
* = r
svnserve의 anon-access권한을 우선 시 하기 때문에, 이렇게 설정하면
실제로 모든 READ권한(checkout, show history)에 대해서 인증을 받게 된다.
[SVN] TortoiseSVN History 보기 오류 해결 (0) | 2016.06.11 |
---|---|
[SVN] Commit Message 강제화 시키기 (0) | 2016.06.11 |
생성되어 있는 repo경로에 hooks폴더에 들어가서 pre-commit.tmpl파일을 pre-commit파일로 만들어준다.
해당 파일을 vi등의 편집기로 열어 아래와 같이 수정한다.
#!/bin/sh REPOS="$1" TXN="$2" # Make sure that the log message contains some text. SVNLOOK=/usr/bin/svnlook #$SVNLOOK log -t "$TXN" "$REPOS" | \ # grep "[a-zA-Z0-9]" > /dev/null || exit 1 LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS" | grep [a-zA-Z0-9] | wc -c) if [ "$LOGMSG" -lt 5 ]; then /bin/echo -n "(Empty commit log) & (length(log) < 5) is NOT ALLOWED" 1>&2 exit 1 fi # All checks passed, so allow the commit. exit 0
필요에 따라 chmod 755옵션으로 실행 권한을 준다.
이후 커밋 시 빈 메시지로 입력하는 경우 에러가 발생함.
[SVN] TortoiseSVN History 보기 오류 해결 (0) | 2016.06.11 |
---|---|
[SVN] show history 권한 (0) | 2016.06.11 |
EC2 Instance를 생성하고나면, .pem 파일을 하나 다운받을 수 있게 되는데,
이게 putty에서는 인식을 하지 못한다.
그래서 putty-gen이라는 것을 사용해서 putty에서 사용할 수 있게 ppk파일로 만들어주어야 한다.
(putty-gen은 putty 다운로드 사이트에서 찾을 수 있다.)
실행하면 아래와 같은 화면이 나온다.
SSH-2-RSA가 기본으로 선택되어 있으므로, 이것을 변경하지 않고 사용한다.
Load버튼을 눌러서, 아까 받은 .pem파일을 넣고, 패스워드 지정 (선택사항)한 후 활성화된 Save private Key버튼을 누르면 .ppk파일이 만들어진다.
이것을 이제 putty에 가서 등록을 하면된다.
아마존 공식홈에서 친절하게 설명이 되어 있어서, 이 링크를 참조했다.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html
[AWS] EC2 CentOS Root Volume 확장 (0) | 2019.04.12 |
---|---|
[EC2] 유저 생성하기 (0) | 2016.06.17 |
[AWS-ELB] TCP형태로 세팅 한 후 nginx proxy와 함께 사용 시 client ip 받기 (0) | 2016.06.11 |
ELB를 Http형태로 세팅을 한 후라면, X-FORWARDED-FOR 헤더에서 찾으면 client ip를 쉽게 얻을 수 있는데,
웹소켓이라던지 기타 TCP 통신을 하는 TCP 형태로 세팅이 된 경우라면, ELB쪽에도 Proxy 세팅을 해야하고,
서버쪽에서도 추가로 Proxy Address를 받을 수 있도록 세팅을 해야 client ip를 얻어올 수가 있었다.
일단 해야 할 작업은 두 가지이므로 정리해본다.
1. ELB에 proxy protocol 활성화 하기
아마존 콘솔을 열고 아래의 명령어를 입력하면 완료된다.
aws elb create-load-balancer-policy --load-balancer-name my-load-balancer --policy-name EnableProxyProtocol --policy-type-name ProxyProtocolPolicyType --policy-attributes "AttributeName=ProxyProtocol,AttributeValue=true"
2. 서버 (이 포스팅에서는 Nginx를 사용하여 웹소켓을 사용함) 세팅
[nginx.conf]
server { listen 80 proxy_protocol; # 필수 real_ip_header proxy_protocol; # 필수 location / { proxy_http_version 1.1; # 필요에 따라 proxy_pass http://127.0.0.1:8000/; # 필요에 따라 proxy_set_header Connection $connection_upgrade; # 웹소켓을 사용한다면 필수 proxy_set_header Upgrade $http_upgrade; # 웹소켓을 사용한다면 필수 proxy_set_header X-Forwarded-For $proxy_protocol_addr; # 필수 } }
기본 Nginx access log 설정이라면, 아마 기존과 동일한 ip가 확인이 될 건데, log_format을 살짝 변환하여 이를 해결할 수 있다.
[nginx.conf]
log_format forward_log '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' ;
access_log access.log forward_log # 기존 access_log 설정에 파라미터로 log_format 정의한걸 입력해주면 access_log에서도 확인을 해볼 수가 있다.
만약, nginx를 사용하지 않는경우라도, X-Forwarded-For 헤더에서 찾으면 원하는 client ip 정보를 얻을 수가 있다.
[AWS] EC2 CentOS Root Volume 확장 (0) | 2019.04.12 |
---|---|
[EC2] 유저 생성하기 (0) | 2016.06.17 |
[AWS-EC2] windows에서 putty로 ssh접근하기 (0) | 2016.06.11 |
https://www.rabbitmq.com/download.html
위 링크의 공식홈에서 rabbitMQ tar ball을 받아서 압축만 풀면 설치는 끝난다.
RabbitMQ가 Erlang이라는 language기반으로 동작하기 때문에, 사전에 Erlang을 설치해주어야 한다.
소스설치가 베스트하긴 하지만, 뭔가 설치해야 될게 엄청나게 많아보여서 yum으로 설치를 진행하였다.
아래 명령어로 yum repository에 erlang repository를 등록을 해준다.
$ wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
$ yum install erlang
vagrant로 설치한 기본 vm기준으로 위 install명령으로 106개의 어플리케이션이 설치가 된다...
그렇기 때문에, RabbitMQ만을 위해 erlang을 설치하는 경우는 yum으로 패키지 설치를 추천한다.
압축을 풀어둔 RabbitMQ 폴더 기준으로 sbin 경로에 실행파일들이 몰려있다.
실행 방법은 ./rabbitmq-server를 실행하면 기본 포트 5672로 데몬이 실행이 된다. (25672는 클러스터용 포트인데 같이 뜬다.)
[RabbitMQ] rabbitmq_management for WebAdmin (0) | 2016.06.11 |
---|---|
[RabbitMQ] Cluster 구성 및 설정 (0) | 2016.06.11 |
AMQP를 지원하는 솔루션들은 WebAdmin 페이지를 별도로 제공을 해준다.
ActiveMQ같은 경우는 기본으로 제공을 해주고, RabbitMQ는 기본 제공은 아니고
플러그인 형태로 설치를 하면 접근이 가능하다.
아래와 같이 rabbitmq_management 플러그인을 활성화 시킨 후, 데몬을 재시작해준다.
$ /sbin/rabbitmq-plugins enable rabbitmq_management
그러면 15672포트로 admin 페이지 접근이 가능해진다.
기본 ID/ Password는 guest / guest로 지정이 되어 있는데,
특정 버전부터 localhost에서만 접근이 가능하기 때문에,
서버가 원격지나 VM에 있다면, 별도로 계정을 생성해서 admin권한을 넣어주어야 한다.
유저 ID가 jss, 패스워드가 1234인 유저를 추가해주고,
$ /sbin/rabbitmqctl add_user jss 1234
administrator권한을 지급한다.
$ /sbin/rabbitmqctl set_user_tags jss administrator
이후에 접근을 하면 로그인이 되면서, 모니터링 및 관리를 할 수 있는 페이지를 볼 수 있다.
RabbitMQ 기본 포트 (5672)에 커넥션을 맺을때도, admin 페이지 로그인과 마찬가지로 localhost가 아니면 접근이 되질 않기 때문에,
커넥션 정보에 username, password를 포함해주어야 한다.
추가로, virtual hosts에 대한 access권한을 필요로 하는데, 아래 화면을 참고한다.
admin 페이지 상단의 admin탭을 눌러서 user를 클릭하면 아래와 같은 화면이 나오는데,
여기서 access권한을 줄 수가 있다.
드디어, 원격지 서버에서 RabbitMQ로의 접근이 가능하게 되었다.
접근은 잘 되는데, 임의의 QueueName을 지정하여, 데이터를 Send하니 Queue가 존재하지 않는다는 메시지가 발생해서..
Admin페이지의 Queues로 들어가서 지정했던 QueueName에 해당하는 Queue를 만들어주니 Send, Recv가 정상적으로 이루어진다.
[RabbitMQ] CentOS RabbitMQ 3.5.3 설치 (0) | 2016.06.11 |
---|---|
[RabbitMQ] Cluster 구성 및 설정 (0) | 2016.06.11 |
클러스터 구성이 전부 rabbitmqctl 명령어 만으로 가능하다.
1, 2, 3번 vm에다가 rabbitMQ instance를 하나씩 띄워서 테스트를 진행하였다.
선행작업으로 erlang의 cookie를 각 노드에 동일하게 맞춰주어야 한다.
vagrant로 똑같은 이미지를 사용해서 vm구성을 해서 그런지 모르겠지만, 본인 같은 경우 모두 같아서 작업을 진행하지 않았지만,
다른 경우 ~/.erlang.cookie 나 /var/lib/rabbitmq/.erlang.cookie 둘중에 하나는 있을 것이므로,
하나를 열어서 다른 머신에도 동일하게 맞춰준다.
선행작업이 완료되었으면, 클러스터 구성을 위한 모든 준비가 끝났다.
cluster join시 ip따위 지원하지 않기 때문에, 각 노드의 hostname을 /etc/hosts에 명시해두도록 한다.
hosts파일에 지정될 hostname은 cli에서 hostname이라고 나오는 hostname이 기준이 되어야 하고,
cluster_join시에 지정될 hostname은 아래 명령어를 통해 확인을 한다.
node-1$ ./rabbitmqctl cluster_status
기본적으로 rabbit@node-1과 같이 앞에 rabbit@이 추가로 붙게 된다.
2번 노드를 1번 노드와 묶어보도록 한다.
일단 stop_app으로 source node를 죽이고 시작을 하는게 안전하다.
node-2$ ./rabbitmqctl stop_app
2번 노드를 1번 노드와 join하여 클러스터 구성을 한다. (옵션으로 --ram, --disc을 지원하는데, 해당 노드에 들어가는 데이터가 메모리만으로 동작을 할지, 디스크에서 동작을 할지를 결정한다.)
node-2$ ./rabbitmqctl join_cluster --ram rabbit@node-1
성공했으면, 2번 노드를 다시 시작하고, cluster_status를 해보면, 1번 노드와 클러스터 구성이 된 것을 확인할 수 있다.
node-2$ ./rabbitmqctl start_app
node-2$ ./rabbitmqctl cluster_status
3번 노드도 마찬가지로, 같이 묶어준다.
클러스터 구성 시 주의할 점이 하나 있는데, 3개 노드가 전부 ram으로 동작을 하면,
미러링 구성을 한 경우, 한 대가 내려가면 모든 데이터가 날아가버리는 현상이 발생을 하기 때문에,
disc로 동작하는 노드가 하나 존재 하도록 구성하는걸 권장한다고 한다.
위에 작성한 내용처럼 진행을 하면, 보통 1번 노드는 disc형태로 동작을 하기 때문에, 별로 신경쓰지 않아도 될 것 같다.
하지만, cluster_status로 확인 시에 모두 ram으로 돌아가고 있다면, 아래 명령어로 노드 하나는 type을 disc로 변경을 해주어야 한다.
모든 변경 작업은 stop_app 이후에 하는 게 안전하다.
node-1$ ./rabbitmqctl stop_app
node-1$ ./rabbitmqctl change_cluster_node_type disc
node-1$ ./rabbitmqctl start_app
클러스터 구성을 3대를 해두었는데, 부하량이 생각보다 적어서 하나를 제거할 경우에는, 해당 노드에 들어가서, reset을 해버리면 된다.
node-3$ ./rabbitmqctl stop_app
node-3$ ./rabbitmqctl reset
클러스터 구성이 완료되고, 이제 서로 다른 노드에 저장된 데이터들도 공유가 되게 되었다.
하지만, 노드 하나가 죽어버리면 해당 노드에 있던 데이터가 그냥 날라가버리므로 장애가 발생을 한다.
이럴 경우를 대비하여 미러링 정책 설정을 하여, 모든 노드에 데이터를 중복 저장할 수 있도록 해주는 것을 권장한다.
test- 로 시작하는 모든 queue, exchange에 대하여 미러링 구성을 한다.
어떤 이유에서인지는 잘 모르겠지만, test-*부분을 *로 그냥 바꿔버리면, syntax가 잘못되었다고 경고메시지를 발생시킨다.
한 번에 너무 많은 처리가 이루어지는 것을 막은 것 같기도 하다.
node-1$ ./rabbitmqctl set_policy ha-all "test-*" '{"ha-mode":"all"}'
이 구성은 web admin페이지에서 admin - policy에 들어가서 더 쉽게 설정을 할 수 있다.
이제 RabbitMQ는 서비스할 수 있는 환경이 만들어지긴 했는데,
클러스터 구성이 되었다고 해서, failover같은 장애복구를 해주진 않는다.
HAProxy같은 LoadBalancer를 앞단에 두어, failover처리를 할 것을 권장한다.
다음 포스트에서는 HAProxy를 이용해 각 노드간의 load balancing을 구성해보도록 할 예정이다.
[RabbitMQ] CentOS RabbitMQ 3.5.3 설치 (0) | 2016.06.11 |
---|---|
[RabbitMQ] rabbitmq_management for WebAdmin (0) | 2016.06.11 |
Go가 대세라길래 튜토리얼이나 해보자하고, 시작하던 찰나에
IDE는 뭐가 좋을까!? 검색해보니 Sublime Text가 가장 낫다고 하여, 개발환경 세팅부터해서 제대로 해보기로 하고
시작했는데, 하루종일 삽질을 하다가, 퇴근 시간 1시간 전에 극적으로 해결해서 글로 남겨놓음.
Windows는 64비트 환경이고, Go Lang은 최신버전을 사용해도 상관없음.
1. Go Lang 설치 (http://golang.org/)
- 설명이랄 것도 없음. 그냥 다운받아서 더블클릭. 끝
- 환경변수 정도는 알아서 잡아주어야 함.
2. Sublime Text 3 설치
- 1번과 마찬가지. (사용자 폴더명에 한글이 포함되어 있는 분은 Portable 사용을 권장.. 띄어쓰기, 한글에 굉장히 민감한 툴임)
3. Sublime Text 3에서의 Package Control 설치
- Package Control 공식 홈에 Console열어서 설치하라고 가이드 되어 있는데, 잘 안된다.
- Preference -> Browser Packages로 탐색기를 열고, Packages 폴더로 이동해서 git으로 바로 clone받는다. 아래 명령어 입력
- git clone https://github.com/wbond/sublime_package_control.git "Package Control"
- Sublime Text 3를 재시작 하면, Pakcage Control 설치 완료
4. GoSublime 설치 (https://github.com/DisposaBoy/GoSublime)
- Ctrl + Shift + P를 누르고, Package Control : Install Package를 선택하여, GoSublime을 선택하면 설치가 완료됨.
- 위에 명시된 GitHub에서는 여기까지만 하면 제대로 될거다라고 설명을 하고 있는데, 내 컴에서는 Margo가 없다고 빌드를 못하겠다고 해서, Issue를 검색해보니, 수동으로 빌드를 하면 해결이 된다고 한다. (https://github.com/DisposaBoy/GoSublime/issues/445)
난, 이거 읽고도 한참 헤맸으니, 정리해보는걸로..
5. Margo 수동 빌드
- ST3 ROOT\Data\Packages\GoSublime\src폴더에 보면 gosubli.me 폴더가 있는데, 얘를 GOROOT\src로 옮겨준다.
- 옮긴 폴더에 들어가보면 margo, something-borrowed 폴더가 있는데, something-borrowed 폴더에서 cmd창을 열고, gocode폴더로 이동 후 go build -> go install 순으로 입력해 준다. (에러가 발생하는 경우, 대부분 환경변수 문제이므로 알아서 해결한다.)
- something-borrowed\types 폴더에 가서도 go build -> go install 입력.
- 이제 다시 gosubli.me 폴더에 가서, margo 폴더로 이동 후, go build를 입력하면, Margo.exe 파일이 생성된다.
- 해당 파일을 이름을 바꾸어 주어야 하는데, ST3 에서 발생했던 로그를 View - Console을 열어서 잘 보면, Margo 어쩌고 하는 exe파일이 없다고 나오는게 원인인데, 지금까지 했던 작업이 그 파일을 수동으로 빌드해서 넣는 과정이었으므로, 파일명을 에러 로그에서 없다고 찍힌 파일명으로 변경해준다.
- 해당 파일을 ST3 ROOT\Data\Packages\User\GoSublime\windows-x64\bin\ 경로에, 방금 exe파일을 옮겨준다.
- ST3 재시작
참고로 ST2에서는 뭐가 문젠지 잘 안된다. Beta버전인 ST3보다 못한 것 같다.
[Go] func 가변인자(dynamic arguments) 전달 (0) | 2016.06.28 |
---|---|
[Go] XML Marshal / UnMarshal (0) | 2016.06.28 |
[Go] SyntaxHighlighter (0) | 2016.06.28 |
[Go] LumberJack for Logging (0) | 2016.06.28 |
[Go] 간단한 채팅 서버 (0) | 2016.06.11 |