오류는 아래와 같았다.
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^
내가 검색능력이 부족하여 삽질하는 시간이 길었고, 인맥이 부족하여 물어볼 사람이 없었기 때문에 삽질하고 이 문제를 해결하는데 오래 걸렸다고 생각한다.
어쨋든 해결했으니 좋은것 아닌가 :)
'Linux' 카테고리의 다른 글
패키지 재 설치시 설정파일이 안생길때. (0) | 2015.11.18 |
---|---|
mysql 저장소를 새로운 하드로 바꿔보자 (0) | 2015.09.22 |
[Ubuntu] 자바 설치하기 (0) | 2015.05.19 |