블로그 이미지
안녕하세요~ iolate(a.k.a. isho) 의 블로그 입니다~! iolate

카테고리

분류 전체보기 (180)
Server, Cloud (9)
끄적끄적 (6)
Linux, Ubuntu (29)
개발개발 (45)
Mac, iOS (41)
Embedded (20)
NAS (1)
Web (5)
Network (3)
Review (12)
기타 (9)
비공개글 (0)
Total655,664
Today137
Yesterday151

NFS 설치

# yum install nfs-utils


NFS 서버 설정

# vi /etc/exports

[Path]    [Client IP]([Options])


Options

ro - 읽기 전용 (기본값)

rw - 읽기/쓰기 모드

root_squash - Client의 root를 익명 사용자(nobody)로 매핑 (기본값)

no_root_squash - Client의 root를 NFS 서버의 root로 매핑

all_squash - 모든 사용자를 익명 사용자(nobody)로 매핑

sync - Client와 NFS 서버간 동기적 통신 모드 (기본값, 안전성 향상)

async - Client와 NFS 서버간 비동기 통신 모드 (속도 향상)

secure - 마운트 요청 시 포트를 1024 이하로 할당 허용 (기본값, 1024 이하 포트는 root만 설정 가능)

insecure - 마운트 요청 시 1024 포트 이상도 할당 허용

anonuid=<uid>

anongid=<gid>



설정 후

# systemctl restart nfs-server


재부팅 후에도 자동으로 실행되게끔
# systemctl enable nfs-server
도 해준다.


* 서버에서

# showmount -e 127.0.0.1

을 실행해보고,

clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)

에러가 나온다면,
# service rpcbind start
을 해주자.



클라이언트에서

$ showmount -e <Server IP>

로 서버의 exports 리스트를 확인할 수 있다.


테스트 마운트는

# mount -t nfs <Server IP>:<Server Path> <Client Path>

로 가능.


/etc/fstab 설정도 가능하다.

<Server IP>:<Server Path> <Client Path> nfs hard,intr 0 0


이때 옵션(예시에서 hard,intr)은 

19.4. Common NFS Mount Options

여기서 찾아보자.



참고

NFS 서버 구성 - http://blog.helperchoi.com/76

http://unix.stackexchange.com/questions/64915/nfs-connection-refused

http://www.unixmen.com/setting-nfs-server-client-centos-7/

Posted by iolate
TAG centos, nfs, RPC


/etc/sysconfig/network-scripts/ifcfg-eth?


파일을 수정하면 된다.


* DHCP 설정

BOOTPROTO=dhcp


* STATIC 설정

BOOTPROTO=none

IPADDR = "192.168.137.2"

NETMASK = "255.255.255.0"

GATEWAY = "192.168.137.1"

DNS1 = "192.168.137.1"


** 변경 후 네트워크 재시작

# systemctl restart NetworkManager

# systemctl restart network



재부팅시 네트워크 어댑터가 자동으로 시작되지 않는다면,

ONBOOT=no

ONBOOT=yes 로 바꿔준다.


수동으로는

시작: # ifup eth?

종료: # ifdown eth?



참고

CentOS 7.0에서 네트워크 설정 - http://manseok.blogspot.kr/2014/08/centos-70.html

CentOS - eth0 자동 활성화 시키기 - http://avisynth.tistory.com/10

Posted by iolate

CentOS7 에서 XFS 로 포맷을 진행하려 하는데, 2TB 까지밖에 파티션이 생성안되는 문제가 있었다.


대충 찾아보니 fdisk가 하위호환때문에 2TiB 로 고정한다는 듯.

수정된 fdisk 를 사용하면 된다고 한다.


딴걸 설치하기는 귀찮고...

http://unix.stackexchange.com/questions/29078/how-to-partition-22tb-disk

글에서 주는 해결책을 옮기면서 조금 수정해봄.



1. xfs 설치 확인

mkfs.xfs 를 그냥 실행하여 설치가 되어있는지 확인해본다. 없다면 설치.

# yum install xfsprogs


2. 디스크 확인

# fdisk -l


나의 경우(그리고 글에서 설명하는 경우)는 /dev/sdb 이다.

본인 상황에 맞게 아래 예시에서 알아서 바꾸자.


3. 파티션 만들기

# parted /dev/sdb mklabel gpt

# parted /dev/sdb mkpart primary xfs 1 -1


나의 경우 두번째 명령어가 실행이 안되는 것 같았는데....


이 과정을 스킵해도 된다고 한다.

스킵할 경우 아래 예시에서 /dev/sdb1 대신에 /dev/sdb 를 사용할 것.


스킵할 경우 sector alignment 문제(나도 뭔지 모름)가 없는 대신 윈도우나 맥 등에 연결할 경우 매번 포맷하라는 메세지가 뜬다고 한다.



4. 파티션 포맷

# mkfs.xfs -f -L somelabel /dev/sdb1


라벨(L 옵션)은 fstab 에 기록할때 대신 사용될 수 있는 것 같다.


5. 디렉토리 생성 & 테스트 마운트

# mkdir /storage

# mount -t xfs /dev/sdb1 /storage


마운트가 되었다면

# df -Th /storage

로 확인해보자!


6. fstab 수정

# vi /etc/fstab

파일 가장 하단에

LABEL=somelabel    /storage        xfs    defaults    0 0

추가


7. mount / umount

이후에는

# mount /storage

만 입력해도 마운트할 수 있다.


마운트 해제는

# umount /storage



참고

http://unix.stackexchange.com/questions/29078/how-to-partition-22tb-disk


일반적인 포맷은 여기!

http://ask.xmodulo.com/create-mount-xfs-file-system-linux.html


Posted by iolate

Docker 의 설치 및 간략 사용법 정리.

UBUNTU 14.04 64bit 에서 작업하였음.


1. docker 설치

$ sudo curl -fsSL https://get.docker.com/ | sh

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

# apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

# apt-get update

# apt-get install docker-engine


2. (선택)현재 사용자를 docker 그룹에 추가

$ sudo usermod -aG docker $(whoami)


추가한 후엔 로그아웃하고 다시 들어와야, 정상적으로 작동한다.

추가하지 않을 경우 아래 모든 docker 커맨드를 root 권한(sudo)로 실행해야 함.


3. 이미지 받기

docker pull <이미지 이름>:<태그(보통 버전)>

형태로 받을 수 있다.


난 Ubuntu 14.04 를 설치할 예정이므로,

$ docker pull ubuntu:14.04


4. 이후엔 자유.


========================================================


= 명령어 정리 =


$ docker <command>

images: 이미지 목록 출력

ps: 컨테이너 목록 출력

start, stop, restart: 이름 그대로.

attach: 컨테이너 접속

Ctrl+D : 컨테이너 정지 후 빠져나오기

Ctrl+P, Q: 정지하지 않고 빠져나오기

exec: 컨테이너 안에 명령어 실행

rm: 컨테이너 삭제

rmi: 이미지 삭제


$ docker run -i -t --name test ubuntu:14.04 /bin/bash

ubuntu 이미지로 test 이름의 컨테이너를 만들고 bash 실행, 접속

태그를 생략할 경우 latest 이미지를 사용하게 되며, 없을 경우 다운로드 받는다.



참고

Install Docker - https://docs.docker.com/linux/step_one/

Docker 기본 사용법 - http://pyrasis.com/Docker/Docker-HOWTO

Posted by iolate

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

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


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

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

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



APNS

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


pyapns 설치하기


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 으로 짜져 있음.


GoCM 설치하기


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를 같이 서비스하는 사람/업체가 많은데 내가 못찾는건지 다른 방법이 있는건지...

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

Posted by iolate
TAG APNS, GCM, GoCM, Push, pyapns

자, 이번엔 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

Posted by iolate
TAG GCM, GoCM

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

Posted by iolate


수동으로 동기화

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

Posted by iolate
TAG NTP

근데 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, Ubuntu' 카테고리의 다른 글

python-twistd :: daemon 으로 만들기  (0) 2015.12.23
우분투 시간 동기화  (0) 2015.11.01
[Ubuntu] php-apn 설치하기  (0) 2015.07.02
Apache2 userdir 모듈에서 php 작동안함 문제  (0) 2015.06.28
Unix, Linux, BSD, 그리고 MacOS  (0) 2013.01.03
phpmyadmin 에러  (2) 2012.11.18
Posted by iolate

난 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, Ubuntu' 카테고리의 다른 글

우분투 시간 동기화  (0) 2015.11.01
[Ubuntu] php-apn 설치하기  (0) 2015.07.02
Apache2 userdir 모듈에서 php 작동안함 문제  (0) 2015.06.28
Unix, Linux, BSD, 그리고 MacOS  (0) 2013.01.03
phpmyadmin 에러  (2) 2012.11.18
사용해 본 VPS 비교  (2) 2012.11.14
Posted by iolate

최근에 달린 댓글

최근에 받은 트랙백

글 보관함