최근 nginx 서버를 돌리는데 중간중간에 Resource temporarily unavailable 오류가 발생하는 것을 확인했다.

오류는 아래와 같았다.

Datetime [error] 4027#0: *178859567 connect() to unix:///home/sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: client_ip, server: localhost, request: "GET path HTTP/1.1", upstream: "uwsgi://unix:///home/sock:", host: "host_ip"


이 오류를 해결하기 위해 몇가지를 시도해보았다.

1. uwsgi와 같이 사용하기 때문에 uwsgi에서 발생하는 오류인줄 알고 uwsgi가 requests를 처리 못하여 생기는 오류인줄 알고 max-requests값을 높여보았지만 효과없었다.

2. "소켓 접속 제한를 초과하여서 발생하는 오류이다."라는 또 다른 가설을 세우고 제한를 조정해보았다.

sysctl -a | grep somaxconn
net.core.somaxconn = 127


default로 설정이 되어있었으며 이 값을 10240으로 변경해주었다.

sudo /sbin/sysctl -w net.core.somaxconn=10240


변경 후에도 큰 변화는 아니지만 오류 발생 빈도가 줄어들었지만, 여전히 오류가 발생한다.

3. Django를 nginx+uwsgi 로 해서 돌리고 있었다. 오류를 좀 더 확인하기 위해서 Django를 devserver형태로 돌렸다. 디버깅도 확인해보니 오류를 뿜어낸다.

Too many open files 라는 오류가 발생했다. 이때 알았다. 리눅스에서는 시스템 자원 값을 제한할 수 있고 이것은 동적으로 잡아주지 않는 다는 것을...

일단 Too Many open files 라는 오류를 잡기 위해 ulimit 으로 값을 변경해보기 시작했다.

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128192
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128192
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


초기값을 확인하고 1024인 초기값은 512000 으로 변경을 해주었다.

sudo ulimit -n 512000


으로 바로 변경할 수 있다. 하지만 이렇게 할 경우 재부팅했을 경우에 설정값이 다시 처음으로 되돌아 가기 때문에 바뀌지 않게 하기 위해 설정파일을 변경해준다.

sudo vim /etc/security/limits.conf 


파일을 열어 제일아래에 아래와 같이 입력을 해준다.

*   hard    nofile  512000


모든 유저들의 open files의 설정값을 512000으로 변경하겠다는 내용이다.
*을 변경하여 특정 유저만 해당하게 설정값을 변경할 수 있다.
hard와 soft의 차이점이 soft한 제한과 hard한 제한이라고 하는대 뭔지 잘 모르겠다.


그리고 나서 다시 돌려보니 오류빈도는 확 줄었지만 서버를 오랫동안 켜두니 또 502 error를 뱉는다. (짜증난다.... 왜이러는거냐)

파일 오픈 제한값을 더 늘려보기도 했지만 비슷한 상황이였다. ulimit -a를 통해 옵션값을 보던중 max user processes 라는 영역이 보였고 해당값도 조정을 해주었다.

명령어로는

sudo ulimit -u 512000


으로 할 수 있고

*   hard    nproc   512000
*   sofr    nproc   512000


설정 파일에서는 위와 같이 item값을 nproc로 해주면 재부팅해도 계속해서 해당 값을 사용할 수 있다.

이제는 서버가 잘 돌아간다 ^0^



내가 검색능력이 부족하여 삽질하는 시간이 길었고, 인맥이 부족하여 물어볼 사람이 없었기 때문에 삽질하고 이 문제를 해결하는데 오래 걸렸다고 생각한다.

어쨋든 해결했으니 좋은것 아닌가 :)


우분투를 사용하면 apt-get install 을 통해 많은 패키지들을 설치 한다.


그리고 가끔 설정등을 갈아엎고 새로 시작하고 자 할때 패키지를 지우고 재설치를 하는 경우가 종종있는는데


이 때 간혹 설정파일이 다시 안생기는 경우가 있다. (nginx라던가... nginx라던가...


보통 지울때 apt-get remove 도 사용하고 apt-get purge 도 사용하는대, 이런 경우에는 뭘 해도 안된다.


이럴때는 dpkg --get-selections 를 통해서 설치된 패키지들을 확인하고 관련된 패키지도 지워주면된다.



nginx의 경우 14.04에서 종종 이런 이슈가 발생하는 것 같은데


nginx는 nginx-common이 purge로도 지워지지 않아서 생기는 문제로 확인이 된다.


저거 지우고 다시하면 잘됨



검색어

nginx: confighuration file /etc/nginx/nginx.conf test failed

cat: /etc/nginx/nginx.conf: No such file or directory

how to nginx reinstall

 *급한 분을 위해 제일 아랫부분에 명령어만 정리해두었습니다.


fdisk -l

위 명령어를 이용하여 추가하고자 하는 하드디스크를 확인

일반적으로 slave를 단 경우에는

Disk /dev/sdb doesn't contain a valid partition table

라는 결과를 확인할 수 있음


fdisk /dev/sdb

위 명령어를 이용하여 sdb의 파티션을 할당

그 후 나오는 commandline에서는 n->p->1->Enter->Enter ->w (New partition Primary 1개 Default Default write 로 외우니 외워짐;;)

그 후 dev/sdb1 파티션이 생김


mkfs.ext4 /dev/sdb1

위 명령어로 방금 생성한 파티션을 ext4 filesystem으로 format을 한다.


--------------

정상적으로 하드를 사용가능한지 확인

mount /dev/sdb1 /dir #임의로 특정 빈 디렉토리에 마운트를 시킴
df -h #용량을 확인함으로써 마운트가 잘 되었는지 확인이 가능
umount /dev/sdb1 #명령어로 언마운트 시켜줌

--------------

ls -l /dev/disk/by-uuid
위 명령어를 이용하여 sdb의 UUID값을 확인한다.
이 값은 미리 복사!

echo "UUID=(방금 복사한 UUID) mount위치 filesystem(ext4) errors=remount-ro 0 1 " >> /etc/fstab

위 명령어를 실행하고 나서 reboot을 해준다.

에러가 나지 않고 잘 켜지면 마운트가 잘 된것이다.


Mariadb(Mysql) 저장소 변경


service mysql stop #먼저 서비스를 종료
#mariadb 및 mysql등이 기본적으로 저장이 되는 위치는 /var/lib/mysql (우분투 14.04기준) 이다.
mv /var/lib/mysql/* /변경할 위치 
rm -rf /var/lib/mysql ln -s /변경위치 /var/lib/mysql
chown mysql /변경위치

chgrp mysql /변경위치

service mysql start

정상적으로 서비스가 잘 실행이 되면 성공한 것이다.

 정리:

fdisk -l
fdisk /dev/sdb
n
p
1
Enter
Enter
w
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /변경위치
df -h
umount /dev/sdb1
ls -l /dev/disk/by-uuid
echo "UUID=(방금 복사한 UUID)     /변경위치     filesystem(ext4)     errors=remount-ro     0     1" >> /etc/fstab
reboot
service mysql stop
mv /var/lib/mysql/* /변경위치
rm -rf /var/lib/mysql
ln -s /변경위치 /var/lib/mysql
chown mysql /변경위치
chgrp mysql /변경위치
service mysql start



Ubuntu에서는 두가지 종류의 JAVA를 설치할 수 있다.

 1. Open JDK
Sun microsystems가 JDK 7버전을 개발하면서 오픈소스화 하기위해 Open JDK를 만들었다.Open JDK는 오픈소스 기반으로 자바 개발킷을 배포하고자 한 노력이었다. 3rd-Party 라이브러리 저작권자에게 오픈소스로 하자고 했는데 실패, 그로인해 일부 컴포넌트를 제외하고 JDK를 Open JDK에 넘겨주고, 그를 기반으로 다른 컴포넌트들을 만들면서 JDK7 프로젝트를 시작했다.

 2. Oracle JDK
Oracle JDK는 Open JDK에 포함되지 않은 컴포넌트까지 다 들어가있는 버전이라고 생각하면된다. 

Oracle JDK에는 Open JDK에 존재하지않는 컴포넌트가 몇가지 있는데 이 때문에 Open JDK성능이 더 떨어진다는 말도 있으나 확실하지 않음


 3. Open JDK 설치하기
아래는 Ubuntu 64bit 기준이다. 32bit의 경우 JAVA_HOME의 경로를 /usr/lib/jvm 가서 확인하고 바꾸면된다.
apt-get install openjdk-7-jdk
echo "export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/" >> /etc/bash.bashrc
source /etc/bash.bashrc
 1. Oracle JDK 설치하기
그냥 한줄 한줄 붙여써 넣어라. 8버전 깔고 싶으면 7을 8로 바꾸면됨
apt-get install software-properties-common -y
add-apt-repository ppa:webupd8team/java
apt-get update
apt-get install oracle-java7-installer -y
apt-get install oracle-java7-set-default -y

+ Recent posts