본문으로 건너뛰기

캐시메모리가 꽉차서 메모리 용량이 부족한 경우

· 약 2분

파일에 접근이 빈번한 시스템에서 메모리 용량을 확인시

# 메모리 용량 확인
$ free -m

캐시메모리의 점유율이 꽉찰 정도로 높게 나타나 메모리 용량이 부족한 걸 확인할 수 있다.

리눅스는 물리적인 저장/통신 장치와 데이터를 주고 받을 때 메모리에 먼저 적재한 후에 데이터를 주고 받는다. 이는 동일한 데이터에 대한 접근을 할 경우 메모리에서 바로 가져오도록 하여 I/O 성능을 높이기 위함이다.

해결

vfs_cache_pressure

시스템 설정 파일을 열어 디렉토리와 inode 오브젝트에 대한 캐시로 사용된 메모리를 반환하는 정도를 지정하는 vfs_cache_pressure 파라미터를 수정해준다.

$ vi /etc/sysctl.conf
# 기본값은 100
vm.vfs_cache_pressure = 10000

cache memory drop

캐시메모리를 주기적으로 비워주자

$ crontab -e
# 매일 새벽 4시에 캐시메모리 강제비우기
0 4 * * * sync && echo 3 > /proc/sys/vm/drop_caches

sync 명령어로 캐시메모리에 담긴 데이터를 실제 저장장치에 반영해주고, drop_caches를 실행한다. 커맨드로 실행시에 메모리를 반환하면서 서버가 잠시 멈출 수 있으니 새벽에 실행을 걸어놓자

  • echo 1 : page cache 해제
  • echo 2 : inode, dentry cache 해제
  • echo 3 : 모두 해제

Linux 유저 비밀번호 변경

· 약 1분

리눅스 유저 비밀번호를 변경해보자. 비밀번호를 변경하고 싶은 유저로 로그인을 한 뒤 아래 명령어를 날리면 된다.

$ passwd

Root 권한이라면 다른 아이디의 비밀번호도 변경이 가능하다.

# passwd 뒤에 유저아이디를 적는다
$ passwd userid

cron 부팅시 프로그램 실행

· 약 1분

리눅스에서 재부팅시 자동으로 프로그램을 실행해야하는 경우가 있다. init.d에 등록하는 방법이 있지만 스케쥴 작업인 경우 크론에서 관리하는게 깔끔한 것 같다.

$ crontab -e

@reboot /test/test.sh start

@reboot를 쓴 뒤 부팅시 실행시킬 명령어를 적어주면 된다.

내부 아이피 사용 또는 수동 네트워크 설정시 오류

· 약 1분

수동으로 내부 아이피 세팅 중 문제가 발생하는 경우 확인해봐야한다.

네트워크 매니저가 돌아가고 있으면 충돌이 발생할 수 있다.

# 확인
$ service NetworkManager status

# 서비스 종료
$ service NetworkManager stop

# 부팅 서비스 삭제
$ chkconfig NetworkManager off

내부 IP 확인

$ /sbin/ifconfig $1 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

정상적으로 할당될 것이다.

mysql, maria 등의 서비스 포트 변경이 안 될때

· 약 3분

포트 확인

# grep 뒤에 확인할 포트를 적으면 된다.
$ netstat -lp | grep 3307

iptable 수정

$ vi /etc/sysconfig/iptables

# 해당 포트를 방화벽에서 열어준다.
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3307 -j ACCEPT

database 포트 변경

$ vi /etc/my.cnf

# 포트가 설정되있는 부분을 찾아 변경한다.
port = 3307

서비스 재시작

$ service mysql restart

잘 했는데 서비스가 올라가지 않는다!!!

원인

로그 확인

mysql 설치 경로로 이동하여 로그를 살펴보자.

$ cd /var/lib/mysql/ # basedir 설정이 되어있다면 해당경로를 덧붙힌다.

$ cat {hostname}.err

[ERROR] Cant start server: Bind on TCP/IP port. Got error: 13: Permission denied
[ERROR] Do you already have another mysqld server running on port: 3307 ?
[ERROR] Aborting

해당 포트에 권한이 없다. 해당 포트를 다른 mysqld 서비스가 사용하는가? 라고 로그가 남겨져있다.

SELinux 확인

$ sestatus

SELinux status: enabled

혹시나 역시나 SELinux가 활성화 되어있다. SELinux에서 포트가 서비스용으로 활성화가 되지 않았기 때문에 계속 거절당한 것이였다.

해결

SELinux 설정 확인

semanage 명령어를 사용해서 확인하고 변경할 수 있다. 명령어 실행이 안될 경우 policycoreutils-python 패키지를 설치해주면 된다.

# semanage 설치
$ yum install -y policycoreutils-python

# 포트 확인
# mysql
$ semanage port -l | grep mysqld_port_t
# http
$ semanage port -l | grep http_port_t

mysqld_port_t tcp 1186, 3306, 63132-63164

변경하려는 3307 포트는 등록되어 있지 않다.

SELinux에 포트 등록

$ semanage port -a -t mysqld_port_t -p tcp 3307

명령어가 iptables에 등록하는 것과 유사하다.

확인

$ semanage port -l | grep mysqld_port_t

mysqld_port_t tcp 3307, 1186, 3306, 63132-63164

이제 mysql restart를 하면 정상적으로 구동된다.

여담

리눅스에서 정상적으로 진행했는데 뭔가 안된다면 SELinux부터 의심해보자.

Temporary failure in name resolution, 일시적인 실패

· 약 1분

모듈 설치시 domain을 사용하거나, telnet 도메인 포트를 호출해봤는데 name resolution에서 일시적인실패 또는 Temporary failure 문구의 에러가 보이는 경우가 있다.

nameserver를 찾지 못해서 발생한다.

해결

Root 계정으로 접속 후 nameserver 설정을 추가한다.

$ vi /etc/resolv.conf

# 아래 내용을 추가
nameserver 58.227.193.227
nameserver 221.143.20.131

저장하면 서비스 재시작이 필요없이 바로 적용된다.

여담

  • 통신사별 DNS 정보 페이지를 첨부한다.
  • 아마존 DNS 오류로 이 페이지의 조회수가 급증했다.

selinux 설정시 ftp 접근이 안될 때

· 약 1분

selinux 를 끄는건 보안상 취약하다. 하지만 켜놓으면 ftp 가 접근이 안되거나, 접근이 되어도 패시브모드가 접근이 안 되는 경우가 있다.

아래 세가지 명령어를 실행해서 selinux 의 설정을 바꿔준다.

$ setsebool -P httpd_enable_homedirs 1
$ setsebool -P httpd_can_network_connect 1
$ setsebool -P allow_ftpd_full_acccess 1

여담

옵션명이 곧 설명을 대신한다고 믿는다.

lynx 리눅스 브라우저 사용법

· 약 1분

lynx(링스) 브라우저를 설치하고 사용해보자

# 설치 확인
$ yum list installed | grep lynx

# lynx 설치
$ yum install -y lynx

예제

# lynx로 브라우저 호출
$ lynx https://gracefullight.github.io

# 브라우저 호출'만' 하고 싶을 때 (결과를 표시하지 않음)
$ lynx -dump https://gracefullight.github.io

여담

crontab과 병행해서 서버의 API를 주기적으로 동작시킬 수 있다.

CentOS Tomcat 및 Java(JDK) 설치

· 약 3분

rpm이 설치되어있지 않은 환경에서의 compile 설치 방법을 다룬다.

$ cat /etc/issue
# bit 확인
$ getconf LONG_BIT

JDK 설치

다운로드

여기에서 다운로드하면 된다. image from hexo

업로드 및 압축 해제

$ tar -zxvf jdk.tar.gz

경로 설정

$ vi .profile

# 추가 내용
export JAVA_HOME=/유저경로/java
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH=/bin:/usr/bin:/usr/local/bin:$JAVA_HOME/bin

# 저장
$ :wq!

bin 폴더 PATH들은 명령어를 위해 필요하고 $PATH < 기존 PATH를 추가하지 않는 이유는 TOMCAT 실행시 기본 설치 PATH를 먼저 읽어오기 때문이다.

경로 갱신

$ source .profile

설치 확인

$ javac -version

Tomcat 설치

다운로드

여기에서 다운로드하면 된다.

업로드 및 압축 해제

apache-tomcat-...의 이름이 길어 tomcat으로 변경 후 업로드하시면 편합니다.

$ tar -zxvf tomcat.tar.gz

경로 설정

$ vi .profile

# PATH 뒤에 tomcat/bin 경로를 추가
export PATH=/bin:/usr/bin:/usr/local/bin:$JAVA_HOME/bin:/home/myuser/tomcat/bin

경로 확인

$ $PATH

/bin:/usr/bin:/usr/local/bin:$JAVA_HOME/bin:/home/myuser/tomcat/bin
# 위에 설정한 PATH의 값이 보이면 정상

Tomcat 설정 추가

tomcat\bin\catalina.sh를 열고 Tomcat과 Java의 경로를 추가해준다.

CATALINA_HOME="/where/to/tomcat"
CATALINA_BASE="/where/to/tomcat"

JAVA_HOME="/where/to/java"

주의

catalina.sh의 주석 표시된 내용을 읽으면 변수를 추가하지 말고 setenv.sh를 만들어서 커스터마이징 옵션을 분리하라고 나온다.

setenv.sh를 수정하고 싶으면 파일을 열고 아래와 같이 추가해준다.

export CATALINA_HOME="/where/to/tomcat"
export CATALINA_BASE="/where/to/tomcat"

export JAVA_HOME="/where/to/java"

서버 실행

tomcat\webapps에 war파일을 옮긴 후 서버를 실행한다.

$ startup.sh

Tomcat started.