연구실에서 드디어 랙서버를 구매하였다.

모델은 Dell PowerEdge R730xd


사용가능 금액이 수백씩 자꾸 올라서 몇번이나 견적을 수정하고... 예정기간보다 몇개월이나 늦어졌지만... 우여곡절끝에 드디어!!






OS - Windows Server 2012 R2 Standard

CPU - Intel Xeon E5-2680 v3 2.5GHz * 2개

RAM - 16GB RDIMM * 16개

OS용 하드 - 300GB 15K RPM SAS * 2개

DATA용 하드 - 6TB 7.2K RPM NLSAS * 12개

+

RAID 컨트롤러 - PERC H730P


내 노트북 SSD보다 큰 256GB RAM과 72TB의 하드디스크를 가지고 있다..


난 처음에 256GB 램을 들었을때 잘못 들은 줄 알았어...

하드라기엔 너무 적고.. 256MB 비디오램인가? 싶어 몇번을 되물었는데... 이걸 내 눈으로 볼 줄이야......

여튼,,




0~12 까지 6TB 하드가, 12,13 에 300GB 하드가 잡혀있다.

지금은 300GB 두개를 RAID1으로 다시 구성했지만...




이번에 구입한 랙과 랙서버..


하드 갯수 때문에 서버를 3대로 쪼개어 구매할까 했지만 하나의 스토로지 서버에 때려박을 수 있다고 하여 일단 한개로 몰아넣었다.

전면에 12개, 후면에 2개(OS용 SAS)가 들어가 있는 상태.


단촐(?)하게 랙서버 하나인 주제(?)에 가격이 엄청나다..ㅠㅠ


아마 앞으로 몇년간 내가 주로 사용하게 될 것 같아서.. 얘를 관리하면서 간단히 사용기라도 적어볼까한다.

내가 언제 이런걸 다시 만져보겠어....


나도 이런 서버 하나 갖고 싶어라ㅏㅏㅏ


iOS 만 서비스 할때는 그냥 대충 php + cron 으로 push 를 돌렸었는데,

이게 백명 단위만 되어도 delay 문제가 생겨서... async 방식으로 언젠가 도입을 해야지.. 생각만 했었다.


이번에 안드로이드때문에 하게 되었으니.. 겸사겸사...

GCM 으로 iOS 도 사용할 수 있는 방법이 있다는건 봤지만,, 클라를 수정해야 했고..

이미 있는 앱도 같이 적용 + 클라 더 손대기가 귀찮아서 서버쪽을 잘 만들어보기로 했다.



APNS

우선 APNS 는 pyapns 라는 녀석으로 쉽게 asynchronous 한 push 를 구현가능하다.



pyapns 서버를 구축한 후 python 에서


import pyapns

pem_path = 'path_to_push_pem'

pyapns.configure({'HOST': 'http://localhost:7077/'})

pyapns.provision('com.example.appid', pem_path, 'production') #sandbox

push = {'aps': {'alert':'푸시 테스트', 'sound':'default'}}

pyapns.notify('com.example.appid', '### push token ###', push, async=True)


이렇게 사용하면 된다.



GCM

GCM 은 주로 node.js 로 했던 듯 하나... 난 시스템을 통일시키고 싶었다.

찾아보니, 위 pyapns 처럼 로컬에 서버를 열어두고 request를 보내면 되는 방식의 GoCM 이라는 라이브러리가 있었다.

Golang 으로 짜져 있음.



GCM 은 인증서가 필요없고 sandbox / production 구분이 없어서 더 간편하다.

간단히 POST request 만 구현하면 어떻게든 가능하지만, 난 requests 라이브러리 사용을 선호함.


import requests, json

GCM_SEND_ENDPOINT = 'http://localhost:5601/gcm/send'

token = '### token ###'

msg = {'title': '[title]', 'message': 'message'}

requests.post(GCM_SEND_ENDPOINT, data={'tokens': [token], 'payload': json.dumps(msg)})



Daemonize

위 방법대로 하면 이제 APNS / GCM 을 둘다 이용할 수 있게 되지만, 각각 웹서버를 하나 돌려야 해서 귀찮다.

당장은 그냥 쓴다고 해도 재부팅을 한다거나.. 프로세스 유지해주기가 귀찮으니까 데몬으로 만들어버리자.


pyapns 는 python-twistd :: daemon 으로 만들기

GoCM 은 GoCM :: daemon 으로 만들기


글을 각각 참고하면 된다.



Feedback / Report

APNS / GCM 각각 삭제되었거나 더이상 사용되지 않는 token 에 대한 feedback 을 제공해준다.


APNS

pyapns.feedback('com.example.appid') 를 호출하면 

[(timestamp, token), ] 

형태로 반환해준다.


token 으로 uninstalled 처리를 해주면 됨.


GCM

canonicals / notregistered 두가지 feedback 이 존재한다.

전자는 token 이 변경되었을 경우(인 것 같다. 사실 레퍼런스를 안봐서..), 후자는 앱이 삭제된 경우.


이건 그냥 GoCM README 를 보자.



Fin

드디어 Python 만을 사용하여(Go 는 컴파일 한번 하고 끝이니 논외), 하나의 시스템만으로 Asynchronous APNS / GCM 둘다 사용할 수 있게 되었다.


여기선 다루지 않았지만, 동일한 DB에 os 구분하여 token 을 저장하고, os 를 알아서 구분해서 메세지를 보내도록 하면 좀 더 관리가 쉽다.


분명히 두 OS를 같이 서비스하는 사람/업체가 많은데 내가 못찾는건지 다른 방법이 있는건지...

생각처럼 깔끔하고 쉬운 방법이 눈에 안보이네.. 흑

자, 이번엔 GoCM (https://github.com/Flyclops/GoCM) 을 데몬으로 만들어두는 방법.


twistd 와 다르게 단일 컴파일된 실행프로그램이므로.. 조금 golang 이라던가.. 그게 아니라 그냥 별개로 생각하자...

뭐 조금 수정하면 다른 방법에서도 쓸 수 있다.

나도 앞에서 글 쓴 twistd 데몬 스크립트를 수정하였음.


1. GoCM 을 컴파일, 바이너리를 적당히 옮겨둔다. 나의 경우 /usr/bin/GoCM

2. /etc/init.d/GoCMd (뭐 데몬이름은 알아서..) 을 작성한다. 내용은 아래 더보기..


3. 위 파일에서, GoCM 경로와 DAEMON_ARGS 에서 api key 를 수정해준다.

4. $ sudo chmod +x /etc/init.d/GoCMd

5. $ sudo update-rc.d GoCMd defaults

6. $ service GoCMd start

twistd 를 daemon 화 하는 방법.

https://github.com/eagafonov/python-twisted-startup-script 의 방법을 이용한다.


1. /etc/python-twistd.d/ 디렉토리를 생성한다.

2. 위 git 에서 python-twisted-web 파일을 받는다. 그리고 파일 이름과 내용을 필요에 따라 수정. 아래부턴 편의상 그냥 python-twisted-web 이라고 쓰겠지만, 알아서 바꾼 이름을 사용하자.

3. git 에서 python-twisted-startup-script 를 위 python-twisted-web 파일과 이름을 똑같이 만들어서 /etc/init.d/ 에 넣는다.

4. $ sudo chmod +x /etc/init.d/python-twisted-web

5. $ sudo update-rc.d python-twisted-web defaults

6. $ service python-twisted-web start

'Linux, Server, Web' 카테고리의 다른 글

Python Asynchronous APNS / GCM Server (Python + Golang)  (2) 2015.12.23
GoCM :: daemon 으로 만들기  (0) 2015.12.23
우분투 시간 동기화  (0) 2015.11.01
MediaWiki URL 설정  (0) 2015.07.30
[Ubuntu] php-apn 설치하기  (0) 2015.07.02


수동으로 동기화

sudo ntpdate pool.ntp.org


자동으로 동기화 (데몬 설치)

sudo apt-get install ntp


참고 (사실 여기에 다 있음)

https://www.digitalocean.com/community/tutorials/how-to-set-up-time-synchronization-on-ubuntu-12-04

별로 추천하지 않는 방법이라곤 했지만.. 깔끔하게 하고 싶어서 이렇게 했었다.

/w/ 으로 변경하긴 했지만...


하위 디렉토리 없게 (http://aaa.bbb.ccc/대문)

/.htaccess

/wiki/~~~~


.htaccess


wiki/LocalSettings.php



근데 php-apn 이녀석 뭔가 잘 안된다. 쓰지 말자.


1. libcapn 설치

$ sudo apt-get install cmake


$ git clone git://github.com/adobkin/libcapn libcapn

$ cd libcapn

$ git submodule init

$ git submodule update


$ mkdir build

$ cd build

$ cmake ../


$ make

$ sudo make install


2. php-apn 설치

sudo pecl install apn


3. php.ini (/etc/php5/apache2/php.ini) 에 extension=apn.so 추가

* 나의 경우 933 라인에

;extension=apn.so

라고 이미 있어서 앞에 주석만 제거해줬음.

apc.so 였다.... 왜 안돼나 했네ㅠ

apn.so 를 잘 추가해주도록 하자.



4. 하라곤 안적혀 있었지만 왠지 해야될 것 같은

$ sudo service apache2 restart



http://libcapn.org/php-apn/

http://stackoverflow.com/questions/25659013/cannot-install-apn-in-php-for-ios-push-notifications-on-ubuntu

http://libcapn.org/doc/html/install.html#unix

'Linux, Server, Web' 카테고리의 다른 글

우분투 시간 동기화  (0) 2015.11.01
MediaWiki URL 설정  (0) 2015.07.30
Apache2 userdir 모듈에서 php 작동안함 문제  (0) 2015.06.28
특정 국가(중국!!) 차단하기  (0) 2013.10.19
Permanently Redirect (301)  (0) 2013.09.28

난 userdir 을 별로 좋아하지도 않고 따라서 잘 쓰지도 않는데,

동아리 서버는 특성상 해당 모듈을 켜두고 있었다.


근데 동아리 친구로부터 "php 파일이 다운로드 되는데 내 컴이 이상한거야?"

라는 문의를 받고..


확인해보니 php가 그냥 다운받아져버리는 심각한 문제를 확인..


실서비스 중인 것도 몇개 해당 서버에 있었기에, 최근 패키지 업데이트 이후 설정이 꼬인 문젠가 싶어서 급하게 확인해봤는데

다행히 그냥 userdir 안의 파일들만 그러하였다. 물론 그렇다고 문제가 없는건 아니지만..


=========== 여기까지 쓸데없는 서론 =================


여튼, 결론만 말하자면, userdir 안에서의 php 모듈이 기본적으로 disable 상태이다.


/etc/apache2/mods-enabled/php5.conf

파일에서

<IfModule mod_userdir.c>

    <Directory /home/*/public_html>

        php_admin_value engine Off

    </Directory>

</IfModule>


부분을 전체 주석처리(#) 해버리면 된다.

Off를 On 으로 바꾸는것 또한 가능하지만,

.htaccess 파일을 이용하여 php 를 꺼버리는(보통 업로드 폴더에서 보안을 목적으로 주로 해둔다.) 작업이 불가능해지므로

그냥 주석 처리 혹은 지워버리는 것을 추천.



참고:

http://devplant.net/2010/05/04/linux-php-not-working-in-userdir-public_html/


'Linux, Server, Web' 카테고리의 다른 글

MediaWiki URL 설정  (0) 2015.07.30
[Ubuntu] php-apn 설치하기  (0) 2015.07.02
특정 국가(중국!!) 차단하기  (0) 2013.10.19
Permanently Redirect (301)  (0) 2013.09.28
Unix, Linux, BSD, 그리고 MacOS  (0) 2013.01.03

얼마전에 쓴(그리고 수정한)

Permanently Redirect (301)

글 이 후 상황.


안내 페이지를 서버가 아닌 웹호스팅에다 올려놨는데,

목, 금 8시 쯤 트래픽 경고 문자가 왔다..


초저가라 트래픽이 일 600MB 라지만 이때까지 한번도 이런 적이 없었고,

이럴 일도 없던 터라 원인은 당연히 블로그 이전 안내페이지.


하지만 정상적인 접근이라면, 50KB 남짓한 메인페이지로 인한 트래픽이 500MB 씩이나 쌓일리가 없다.


cafe24 에서 제공하는 모니터링 툴로 간략히 봤더니 블로그 몇 개 주소를 중국 아이피 수십 개로 수천번의 hit 이 기록되어 있었다..


결국 tistory 리퍼러부터의 문제는 망할 중국넘들...


목욜 날엔 급한대로 상위 5개 아이피에 대해 index 페이지를 노출하지 않는 걸로 손봤지만

이내 다른 아이피가 천번 넘게 들어오더라...


결국 .htaccess 를 이용해서 중국아이피들을 통째로 막았다.

아이피 정보를 포함한 htaccess 파일은 http://www.ip2location.com/free/visitor-blocker

여기서 얻을 수 있음

기본값이 allow 로 나오므로 중국 선택 후 deny 로 바꿔서 내려받자.


호스팅 사에 중국(해외) 접근을 차단해 달라 할 수도 있겠지만,

저 호스팅을 블로그 안내페이지로만 쓰는건 아니므로  그건 좀 곤란하겠더라.;;ㅋㅋ


내 아이피도 차단시키고 확인해보니 403 Forbidden 이 나온다.

이제 좀 괜찮을려나....

'Linux, Server, Web' 카테고리의 다른 글

[Ubuntu] php-apn 설치하기  (0) 2015.07.02
Apache2 userdir 모듈에서 php 작동안함 문제  (0) 2015.06.28
Permanently Redirect (301)  (0) 2013.09.28
Unix, Linux, BSD, 그리고 MacOS  (0) 2013.01.03
phpmyadmin 에러  (2) 2012.11.18

블로그 주소를 바꾸면서

기존 주소를 새 주소로 리다이렉트 시켜놨는데 리퍼러에 기존 주소가 계속 찍히는 문제가 있었다..



요련 식으로 말이지....


어떻게 해결하나 했는데 redirect 방식을 301 로 바꿔주면 된다고 함.


기존에는 apache2 설정을 통해서


<VirtualHost *:80>

        ServerName blog.ghj.kr

        Redirect / http://blog.iolate.kr/

</VirtualHost>


요런 식으로 해놨는데 이 경우 302가 기본값이고


<VirtualHost *:80>

        ServerName blog.ghj.kr

        Redirect 301 / http://blog.iolate.kr/

</VirtualHost>


이렇게 301 redirect 로 바꿔주면 된다.


302 는 임시고 301 은 영구적인 redirect 라나 뭐라나...

근데 301 대신 302 를 워낙 많이 써서 검색엔진에서도 302를 301로 인식하고 주소를 바꿔준다고 한다.

그때도 301, 302 에 대해 검색해보고 결론은 저대로 놔두면 된다 였는데 다시 검색하니 왜 다른건지 모르겠다.


php 에서는 이런 식으로 넘기면 된다고 함.

(근데 IE 6~8 에서 500 에러 난다. 쓰지 말자 ㅋ)

<?

  header (‘HTTP/1.1 301 Moved Permanently’);

  header (‘Location: newurl’);

?>



저 리퍼러들이 사라질지 아닐지는 좀 더 지켜봐야 겠지만.


안사라진다.. 젠장...


일단 사파리, 크롬 등 웹킷 기반에서는 리다이렉트시 전부 리퍼러를 없앤 채로 보내주는 것 같고

IE 도 6 제외하고는 리퍼러를 다 제거하고 리다이렉트 해주는 듯 하다.


리퍼러가 브라우저가 설정해서 보내주는 거라 브라우저를 많이 타는 것 같은데...

도대체 범인을 모르겠다... IE6 을 아직까지 쓰는 사람은 거의 없을테고.. 문제의 다른 브라우저가 있다는 건데...


여튼 좀 짜증나서 이전 안내페이지를 만들었다.

많이 엉성하지만, 나름 깔끔하고 괜찮다고 생각 중....ㅋㅋ


추가로 .htaccess 파일을


RewriteEngine On

RewriteRule . index.html [L]


이렇게 설정함으로써 주소 뒤에 어떤 문자열이 있든 index 페이지로 오게 해놨다.

참고로 apache2 의 redirect 를 사용하지 않은 이유는 혹시나 검색엔진이 이 안내페이지로 주소 이전한 걸로 오해할까봐...


뒷 문자열을 받아서 그대로 새 주소를 다시 보여주는 것도 가능하지만,

그렇게 하면 또 리퍼러 리스트에 옛날 주소가 잔뜩 쌓일 것 같아서 관뒀다..


이번에도 리퍼러가 엄청 쌓인다면 포기하고 뒷 문자열 붙여서 주소 만들어줄 생각..

+ 로그 저장해서 도대체 어디서, 어느 브라우저가 범인인지도 확인해 봐야겠다.


일단은 귀찮으니 생략ㅋ


원인은 중국..

뒷 이야기는 

특정 국가(중국!!) 차단하기

여기서 계속...

'Linux, Server, Web' 카테고리의 다른 글

Apache2 userdir 모듈에서 php 작동안함 문제  (0) 2015.06.28
특정 국가(중국!!) 차단하기  (0) 2013.10.19
Unix, Linux, BSD, 그리고 MacOS  (0) 2013.01.03
phpmyadmin 에러  (2) 2012.11.18
사용해 본 VPS 비교  (2) 2012.11.14

+ Recent posts