[Linux] MySQL 데몬 재 시작 중 먹통되는 문제 해결 방법

제 블로그 서버가 하루 정도 장애가 있었습니다. 그나마 캐시 파일 덕분에 장애가 있었음에도 불구하고 일부 정상 동적이 되었지만 반대로 덕분에 문제를 바로 파악하지 못했었습니다.

증상은 이러 했습니다. 서버 재부팅 후 MySQL 데몬이 시작 되지 않음. 아파치는 문제 없음.

MySQL 데몬을 start하면 성공/실패 결과가 출력되지 않고 반응이 없었습니다. 이때 MySQL 로그를 확인해보기로 했습니다.

vim이나 cat으로 확인해봐도 무관합니다.

자, 로그를 확인해보니..

이 부분이 눈에 확 들어왔습니다. 하드디스크 공간이 꽉 차있던 것이었습니다.

그렇다면 확실하게 확인하기 위해 df 명령으로 재 확인합니다.

used 100%…

역시 하드디스크 공간이 없었던 것이었습니다. 저 같은 경우 시스템 백업을 위해 주기적으로 크론을 돌리고 있습니다. 전체 백업이다 보니 한번 돌려 압축된 백업 파일의 용량이 만만치 않습니다. 그런데 이것이 4달 가량 관리가 되지 않고 방치되자 쌓이고 있던 것이었죠..

결국 오래된 백업 파일은 삭제 후 MySQL 데몬은 재시작 합니다. 잘 되네요..

섣불리 판단하고 MySQL을 재설치하려 했다면 자칫 코앞에서 삽질을 시작했을지도 모릅니다.

[nginx] centos 6.x에서 yum 패키지 설치 및 설정

centos 6.x 에서 패키지로 nginx를 설치하는 방법을 소개합니다.

실제 서비스를 목적으로 nginx 를 설치한다면 패키지보단 컴파일 방식으로 특성에 맞게 세팅해서 설치하는 것을 권장해드립니다. 패키지 설치의 경우 테스트나 개발목적인 분들에게 적합하다고 생각합니다.

centos에는 nginx yum 저장소가 존재하지 않는 경우가 있습니다. 이런 경우 yum install -y nginx 명령을 실행시키면 “No package nginx available.”라는 메세지가 출력됩니다.  아래 내용을 참고하시면 yum으로 설치가 가능합니다.

1. nginx 저장소 파일 생성


2. 저장소 파일(nginx.repo) 파일 내용 입력


3. nginx yum 설치


4. site_enabled 디렉토리 생성


5. nginx.conf 파일 수정
http 블록 내 마지막 줄에 include /etc/nginx/sites-enabled/*.conf; 입력 후 저장


6. chkconfig 등록 (부팅시 자동 실행)


7. nginx 시작

 

[linux] iptables 간단한 사용 방법

iptables 는 linux의 방화벽 역할을 하고 있어 빈번하게 사용되는 명령입니다. 하지만 매일 사용하는 명령은 아니기 때문에 사용방법을 잊기 쉽습니다.

저도 예전에 iptables 설정에 대해 검색해보니 대부분 복잡한 용어들을 사전적으로 풀이한 내용만 있고 실제 어떻게 적용하는지에 대한 내용은 없어 단순한 설정 방법을 찾는데에만 해도 시간을 꽤 소모했던 적이 있었습니다.

때문에 많은 설정 방법이 있지만 거두절미하고 TCP 포트의 허용과 차단, iptables 설정의 삭제와 적용에 대한 내용만 간단히 정리하겠습니다.

방화벽 설정 정보 확인

 

방화벽 8000 TCP 포트 허용 추가

 

방화벽 9000 TCP 포트 차단 추가

 

방화벽 규칙 2번째 라인 삭제 : iptables -L 명령으로 표시된 규칙들 중 2번째 줄 라인을 삭제합니다.

 

방화벽 설정 저장 및 재시작 : 위 명령을 실행시키더라도 저장하지 않으면 적용되지 않습니다.

 

iptables 룰셋 저장 및 복구 : iptables 내용이 많은 경우 단순 추가, 삭제로 관리가 어려운 경우가 있습니다. 이럴때는 룰셋을 텍스트 파일에 저장 후 vi로 편집 후 적용하게 되면 좀 더 편리하게 룰셋을 지정 할 수 있습니다.

iptables 룰셋 저장

iptables 룰셋 복구

이 경우에도 service iptables restart를 해주셔야 합니다.

[linux] find 검색과 grep 검색

자주 쓰이면서 유용한 쉘 명령어 입니다.

find는 파일이나 디렉토리 검색시 유용하게 사용됩니다.

위의 예시는 현재 디렉토리에서 index.html 파일을 검색하는 것입니다. *.html 과 같은 형식의 검색도 가능합니다.

 

grep 검색은 파일의 내용 속 단어를 검색할때 사용합니다.  일일히 파일을 열어 검색할 필요가 없습니다.

위의 예시는 현재 디렉토리에서 “검색어”라는 단어가 존재하는 파일을 찾는 명령입니다.

[linux] 퍼미션 777로 설정해도 업로드 안되는 문제 해결방법

작업한 소스를 실서버에 올리고 업로드를 테스트하는데.. 에러를 뿜었습니다.

mkdir(): Permission denied

업로드 디렉토리 안에 새로운 디렉토리 생성을 시도하자 퍼미션 에러를 낸겁니다. 그런데 업로드 디렉토리의 퍼미션은 이미 777.. (더 이상 줄 권한이 없다.)

chmod, chown으로도 해결이 안되었기에 로그를 뒤지기 시작했습니다. 아파치 로그도 확인 해봤으나 특별한 로그는 없었습니다. 그런데 로그 디렉토리에서 업로드 시도때마다 용량과 date가 변하고 있는 message 로그 파일을 발견했습니다.

message 로그라면 selinux…

외부에서 접근하는 데이터를 selinux가 막은 것이 었습니다. 그 생각을 못하고 웹소스와 퍼미션만 가지고 삽질을 했네요.

보안에 좋다고는 하지만 selinux의 활성화로 많은 제약이 생기고 관리가 만만치 않습니다. 이럴땐 지긋이 selinux를 OFF..

# vim /etc/selinux/config 명령으로 config 파일을 수정합니다.
SELINUX=enforcing 이 부분을  SELINUX=disabled 로 값을 변경해줍니다. 그리고 저장 후 종료..
이 설정은 시스템이 재부팅되면 적용됩니다.

하지만 당장 시스템을 재부팅하기 힘든 상황이라면 임시설정을 해줍니다.
# setenforce 0

이 명령은 현재 세션에서 selinux를 비활성하는 명령입니다. 즉, 시스템이 재부팅되면 /etc/selinux/config의 설정으로 다시 로드 됩니다. disabled로 설정 했으니 다음 재부팅에도 selinux가 꺼진 상태가 되겠죠~

[linux] 부팅시 daemon 실행되도록 등록하는 방법

이전 포스트에서 daemon 제작 방법을 다룬적이 있습니다. 그렇다면 이 daemon을 부팅시에 자동으로 실행되도록 하는 생각도 해볼 수 있는데요. 방법은 다양합니다. 하지만 이 내용에서는 최대한 간단한 방법으로 설정해보자라는 주제에 포커스를 맞춰보겠습니다.

daemon 만들기 포스트 가기

준비물은 daemon 파일만 있으면 됩니다.
데몬파일이 /var/daemon 에 위치해 있다고 가정하겠습니다.

1. # vim /etc/rc.d/rc.local 명령으로 rc.local 편집
2. rc.local 마지막줄에 /var/daemon start 입력 후 저장

이것으로 부팅 시 자동실행 시키도록 설정이 완료되었습니다. 재부팅을 한 후 ps 명령으로 프로세스를 확인해보시면 됩니다.

주의 : 데몬파일에 문제가 없는지 충분히 테스트 후에 rc.local에 등록해주시기 바랍니다. 만약 문제가 발생한다면 커널 패닉 메세지와 함께 부팅이 되지 않습니다. (이럴땐 safe mode 로 복구 해야됨)

[linux] daemon 만들기

daemon(데몬) 이란 윈도우의 service 처럼 보이지 않는 곳에서 실행하고 있는 프로그램이라고 보면 됩니다. 뭐 다 아시겠지만..

데몬을 작성하는 방법은 잘 나와있지만 그 전에 어떻게 작성해야하고 어떻게 실행시켜야 하는지 모르는 분들을 위해 정리를 해봅니다.

* 이 포스트의 내용은 Centos 6.x 기준으로 작성되었습니다.

데몬을 만들고 실행시키는 과정은 간단히 이러합니다.
1. 소스코드 작성
2. 작성된 소스코드 컴파일
3. 데몬 파일 테스트
4. 컴파일된 데몬 파일 실행

코드는 c언어로.. 툴은 리눅스의 vim 에디터로 작성합니다. 그리고 컴파일은 gcc 로 하게 됩니다.

 

gcc 설치 여부 확인 및 설치

우선 컴파일을 하기 위한 gcc가 설치되어 있는지 확인을 해야합니다.

위 명령으로 gcc 패키지가 설치되어 있는지 확인 합니다. 설치가 안되 있다면 설치를 해야겠죠.

이미 설치가 되어있다면 위 과정은 패스합니다.

 

코드 작성하기

daemon은 일정 로직의 포맷이 있습니다. 어떤 daemon 이던지 기본적으로 거쳐야할 초기화 과정이 필요합니다. 여러 예제를 둘러보고 정리한 코드는 이렇습니다.

위 코드에서 데몬으로 실행 시킬 로직은 while 문 안에 넣어주시고 실행 주기는 sleep문에 초단위로 설정해주시면 됩니다.

 

작성된 코드 컴파일하기

코드 작성이 끝났다면 저장하고 컴파일을 해야합니다. 컴파일 명령은 # gcc -o [출력 파일명] [컴파일 할 파일명] 입니다. -o 옵션 없이 # gcc [컴파일 할 파일명] 으로 실행하셔도 되는데 이경우 a.out으로 자동 네이밍되어 생성됩니다.

 

daemon 테스트

결과물로 컴파일이 정상적으로 되었다면 실행시켜 봅니다. 위 코드에서 보시다시피 printf로 pid를 출력하도록 되어있습니다. 그리고 프로세스 파일명과 pid를 확인하여 작성된 데몬이 잘 돌고 있는지 확인 합니다. 데몬 프로세스 확인은 아래 명령으로 가능합니다.

 

daemon 종료시키기

정상적으로 프로세스가 돌고 있는 것이 확인 되었다면 프로세스를 종료시켜야 겠죠? 프로세스 종료 명령어는 아래와 같습니다.

 

여기까지 데몬 만드는 방법입니다. 리눅스 부팅 시 자동 실행되도록 하는 방법도 정리할 예정인데 내용이 길어져 다음 포스트에 올리도록 하겠습니다.

[MySQL] ‘/var/lib/mysql/mysql.sock’ (111) 에러 해결방법

보통 이 문제가 발생하는 경우는 mysql 을 패키지(RPM)으로 설치하는 케이스입니다. 설치하고 실행하는데 문제가 없어보입니다. 하지만 재부팅이나 재시작시 mysql이 동작되지 않고 아래 에러 메세지를 토해냅니다.
Another MySQL daemon already running with the same unix socket.

그리고 mysql로 접속하면 이런 에러가 또 나옵니다.
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (111)

이 문제는 간단히 해결 할 수 있습니다.

하지만 이 방법은 임시 방편에 불과합니다. 삭제해도 다시 생겨나는 파일이기 때문입니다. 그럼 그때마다 지워줘야 할까요? 그건 아니라고 봅니다. 그럼 근본적인 원인을 찾아야겠죠.

제 경우는 이러했습니다. mysql을 root 계정을 이용해 RPM으로 설치했고 그 결과 mysql.sock파일의 소유권한이 없어 접근을 하지 못했던 것입니다. chmod와 chown을 이용해서 권한을 변경해주면 깔끔하게 해결됩니다.

mysqld 데몬을 중지시킨뒤 권한과 소유를 mysql로 변경한 뒤 mysqld 데몬을 다시 시작하는 내용입니다.

[DNS] host 없이 도메인 접속시 www 붙이기

간단하지만 적어봅니다.

예를들어 www 없이 freezner.com으로 접속시 freezner.com으로 접속되는 경우가 있습니다. 저 같은 경우 이 문제로 인해 www.freezner.com가 아닌 다른 호스트로 접속이 되는 현상이 발생했습니다. 그렇다면 freezner.com으로 접속했을때 www.freezner.com으로 접속할 수 있는 방법은 뭐가 있을까요?

생각외로 간단합니다. zone 파일에 아래 내용을 추가해주시면 됩니다. zone 파일은 일반적으로 /var/named/도메인.zone 으로 되어있습니다. 이 도메인.zone 파일을 vim 에디터로 수정해줍니다.

마지막 줄에 보이는 CNAME 레코드만 추가해주시면 됩니다.
저장한 후 “service named restart” 명령을 실행시켜 네임서버를 재시작해주시면 바로 적용이 됩니다.

[Linux] 서버 유지관리 팁 정리

업무를 보면서 중간 중간 습득한 리눅스 시스템 점검 팁입니다.
이미 알고 있는 명령어도 있기도 하지만 좀 더 효율적으로 모니터링 할 수 있는 옵션이 많으니 참고할만 합니다.
별도의 자세한 설명은 생략하겠습니다. -0-

 

iptables

– backup : # iptables-save > 20130626_iptables_backup

– restore : # iptables-restore > 20130626_iptables_backup

– # iptables -nL : 현재 설정된 방화벽 정보 표시

– # iptables -I INPUT -s 111.111.111.111 -p tcp –dport 22 -j ACCEPT

 > 설명 111.111.111.111 IP에서 22번 tcp 포트를 ACEEPT 설정

 

부하체크

– top : 프로세스 사용량 순위, 일반적으로 많이 쓰지만 사용 자체에 부하가 생김

– ps : 프로세스 리스트 출력

 > 실행 : # ps auxww

– pstree : 프로세스 트리 형식 출력

 > 실행 : # pstree -a

 

보안도구

– lsof : 실행되고 있는 프로세스 추적, 프로세스에 물려있는 파일을 보여줌

 > 실행 : # lsof -c httpd

 > 설치 : # yum install lsof

 

– dstat : 시스템 사용량 출력, 중지할 때까지 보여줌

 > 실행 : # dstat -c -d -n -p -s -m

 > 옵션 : -c(cpu), -d(disk), -n(network), -p(process), -s(swap), -m(memory)

 > 설명 : dstat 명령만 치면 메모리 정보가 나오지 않기 때문에 위 옵션으로 실행

 > 설치 : # yum install dstat

 

– vmstat : 시스템 사용량 출력, 출력 시간 간격과 최대 출력 수를 설정 가능

 > 실행 : # vmstat 1 10

 > 설명 : vmstat 정보를 1초 간격으로 10개 출력

 

– w : 부하량 및 접속자, 시스템 구동시간 출력

 

– fuser : 파일, 폴더를 사용하고 있는 프로세스 출력

 > 실행 : # fuser -u /var/log/messages

 

– /proc/cpuinfo : CPU 정보 출력

 > 실행 : # cat /proc/cpuinfo

 

– free : 메모리 사용량 표시

 

– 캐시메모리 회수

# echo 1 > /proc/sys/vm/drop_caches

# echo 2 > /proc/sys/vm/drop_caches

# echo 3 > /proc/sys/vm/drop_caches

MySQL

– # mysqladmin processlist : 실행중인 쿼리 출력

– # mysqladmin kill $PID : PID 강제 종료

– # mysql -e “optimize table $TABLE” : table 최적화

– # mysql -e “SHOW FULL PROCESSLIST” : 실행중인 쿼리문의 전체줄 표시

– # mysqlcheck -p –all-databases –auto-repair : 테이블 체크, 복구

– # mysql_safe –skip-grant-tables : root 암호 분실시 권한 없이 mysql 접속

 

Apache

– # httpd -S : 아파치 설정 확인

– # ab -n 1000 -c 200 ‘http://sample.com’ : 웹사이트 성능 테스트, -n 접속시도 횟수, -c 동접자

– # wget : web response 다운로더

– # lynx –dump ‘http://sample.com’ : text web browser

 

Network

– # ngrep -tW byline pot 3306 and dst 127.0.0.1 -i eth0 : 네트워크 패킷 grep

 > 설명 : eth0 번 랜카드의 127.0.0.1:3306 포트로 들어오는 패킷

– # tcpdump : 네트워크 패킷 캡쳐