Django 를 많이 사용하면서 많은 서버를 세팅했는데, 한 번도 내 블로그에 정리해 본적이 없는 것 같다. 인터넷에서 많은 정보를 얻어왔는데, 이번에는 나도 다른 사람들에게 도움이 될 수 있도록 이글을 남긴다. 내 경우 사수없이 혼자서 공부해서 세팅한 경우가 많기 때문에 많은 내용들이 공식적인 내용이 아니라 좀 많이 야매이다. 이 점을 좀 고려해서 아래글을 읽기 바란다.
일반적으로 개발할 때는 Django 을 테스트 모드로 설정해 자체적인 서버로 동작한다. 지금은 테스트 모드로 동작하는 서버도 멀티프로세스로 동작하는 것 같은데 초장기에는 싱글 프로세스라서 매우 느렸다. (그런데 이게 싱글프로세스 였는지, Eclipse + Pydev 가 멀티 프로세스를 지원하지 않은 것인지 잘 기억이 나지 않는다. ) 그리고 뭣 모르고 그 상태로 상용서비스에 올리기도 했다. 물론 그 서버는 내부 관리 사이트여서 죽어도 크게 문제가 되지 않긴 했다.
그리고 나중에 서버에서는 꽤 복잡하게 동작한다는 것을 이해했다. 일반적으로 서비스, daemon 이런 것이 돌아 갈 때는 죽지 않게 하기 위해 실제 코드가 돌아가는 부분은 따로 process 를 생성해서 동작한다. 그래서 그 process 는 죽더라도 메인 process 가 죽지 않아서 계속 돌아갈 수 있도록 한다. 그리고 그 process 도 CPU core 나 하이퍼쓰레드 지원등을 고려해서 여러개 생성한다. 또 main Process 자체가 죽을 수 있으니 서비스로 등록해서 죽지 않도록 하기도 한다.
우선 리눅스를 다룬적 없다는 가정하여 몇가지 기본 명령어에 대해 설명하겠다.
1. 퍼미션 유저 그룹
서버의 경우 퍼미션과 유저, 그룹에 대해 민감한 편이다. 서비스가 설치된 폴더는 일반적으로 최소의 퍼미션을 유지하고 유저, 그룹도 최대한 권한이 없어야 한다. 해당 서비스가 돌아갈 때도 따로 유저, 그룹을 설정한다. 일반적으로 Ubuntu 에서는 www-data 를 유저로 www-data 를 그룹으로 설정한다.
2. ps 명령어
프로세스 검색은 ps 를 통해 확인 한다. 나의 경우 습관적으로 옵션을 aux 까지 붙여 ps -aux 를 하는 편이다. a 옵션은 다른 사용자 프로세스 까지 보여주는 것인데 프로세스를 다른 사용자로 돌리는 경우가 많으므로 필수이다. u는 프로세스 별 유저와 시간을 보여준다. x 옵션은 현재 로그인 한 세션에서 생성된 것 뿐만 아니라 모든 프로세스를 보여준다.
모든 OS의 콘솔에서 파이프를 이용해 어떤 명령어의 결과를 다른 명령어의 argument 로 이용할 수 있다. 이러한 방식으로 입력을 받는 대표적인 프로그램이 grep 라는 프로그램이다.
ps aux | grep nginx
라고 하면 ps aux 의 결과를 입력으로 사용해서 grep 는 ps aux 의 결과 중 nginx 라는 글자가 발견된 라인만 출력하다. 다만 여기서 grep 라는 명령어가 동작하면서 이 것도 다시 ps aux 에 나오게 된다. 그래서 nginx 라는 프로세스가 안돌고 있어도
hanmil 11575 0.0 0.0 15508 1080 pts/1 S+ 23:15 0:00 grep --color=auto nginx
이런식으로 grep 프로세스가 nginx 라는 argument 가 들어간 부분도 보여질 수 있다.
어쩌든 ps aux | grep nginx 하면 nginx 라는 프로세스가 있는지 확인할 수 있다.
이 동작은 프로세스가 동작하는지 확인 뿐만아니라 pid 를 확인 해서 프로세스를 강제로 종료 할 때도 많이 사용된다.
=============
hanmil@ubuntu:~$ ps aux |grep nginx
root 1164 0.0 0.0 125112 1448 ? Ss 21:56 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1165 0.0 0.1 125436 3140 ? S 21:56 0:00 nginx: worker process
hanmil 11616 0.0 0.0 15508 1092 pts/1 S+ 23:23 0:00 grep --color=auto nginx
붉은 색으로 표시한 부분이 pid(process id) 이다. 이 id 를 가지고 프로세스를 강제로 죽일 수 있다.
이를 테면 kill -9 1165 이렇게 할 수 있다. 그런데 이 상황에서는 로그인 한 유저는 hanmil 이고 프로세스 1165는 www-data 라는 유저의 프로세스이기 때문에 해당 프로세스를 죽일 수 없다. 이 때는 sudo 를 이용해서 잠시 root 권한을 가져야 한다.
그래서 sudo kill -9 1165 이렇게 해야한다.
3. pid 파일
uwsgi 를 설정할 때, pid 을 설정하게 된다. pid 는 프로세스 정보가 담긴 파일이다. 그래서 가끔 pid 파일을 생성하는 데몬을 돌리다가 강제로 죽이면 pid
파일은 그대로 남아 있는 경우가 있다. 정상적인 종료일 경우 프로그램이 종료되면서 pid 파일을 스스로 삭제해야 하나 강제로 죽이면 이러지 못한다. 그런데 이 상태로 다시 uwsgi 를 실행하면 pid 파일이 남아 있어 프로그램이 중복 실행하는 줄 알고 실행이 안되는 경우가 있다. 이 때는 그냥 pid 파일을 삭제하고 uwsgi 를 실행하면 된다.
4. apt-get
리눅스에는 구글플레이나 앱스토어 처럼 여러 프로그램을 모아둔 리눅스 프로그램 서버가 있다. 보통 repository 라고 부른다. 이 리포지토리에 저장된 프로그램을 관리하는 명령어가 ubuntu 에서는 apt-get 이고 centos 에서는 yum 이다.
리포지토리는 기본 저장소가 있고 이 저장소의 여러 mirror 들이 있어 보통 같은 국가에 있는 저장소를 이용한다. 리포지토리 URL들이 저장되는 곳은 /etc/apt/sources.list 이다. 그리고 기본저장소는 안전성을 위해 리눅스 배포판이 처음 만들어 질 때의 버전의 프로그램이 있기 마련이다. 그래서 최신 버전의 프로그램을 받기 위해 기본 저장소가 아닌 저장소를 추가 하기도 한다. 이런 저장소를 PPA(Personal Package Archive) 저장소라고 한다.
CentOS 의 경우 이런 PPA 저장소 중에 자주 사용하는 것이 epel, remi 이고 Ubuntu 도 있는데 아직 사용해 본적은 없어서 잘 모르겠다........
경우에 따라서는 바이너리 프로그램을 바로 설치하기도 하는데 윈도우즈에서 파일 확장자가 .exe 이 듯이 CentOS 계열은 확장자가 .rpm 이고 .deb 파일이다.
어째든 Ubuntu 에서는 여러 프로그램(nginx, mysql 같은 것들) apt-get 으로 인터넷으로 바이너리를 다운받아 설치할 수 있다.
설치를 위해서는 sudo apt-get install 패키지명 , 삭제를 위해서는 sudo apt-get uninstall 패키지명 이다.
5. netstat
프로그램이 잘 돌아가면서 port 를 열고 기다리는지 확인 하는 용도로 사용된다.
나의 경우 netstat -apt 같이 사용한다.
a 옵션은 all 을 의미하고 포트를 사용하는 process_id, t 는 tcp 소켓을 의미한다.
이렇게 할 경우 대기하고 있는 포트들이 보인다. 간혹 0.0.0.0:80 이나 ::80 또는 127.0.0.1:80 이런식으로 표시된다. 127.0.0.1 인 경우 외부에 들어나지 않고 내부에서만 접속 가능한 port 라는 의미이다. 따라서 외부에서 접속해야 하는 경우 절대 127.0.0.1 로 보이면 안된다.
6. telnet
예전에 PC 통신 이라는게 있었는데, 이런 서비스들은 telnet 기반의 서비스이다. 이런 telnet 은 윈 포트가 잘 접속되는지 확인 하는 용도로 많이 사용한다. 서버가 리눅스인 경우가 많지만 개발자의 PC는 윈도우즈인 경우가 많다보니 telnet 를 윈도우즈 리눅스에서 같이 사용될 수 있는 telnet 이 사용된다. 윈도우즈의 경우 제어판에 들어가 윈도우즈 기능을 추가해야 할 수도 있다. (이 부분은 인터넷 검색을 하도록...)
telnet 도메인이나ip 포트번호
보통
========
C:\programs\pros\conemu>telnet 1.1.1.1 80
연결 대상 1.1.1.1...호스트에 연결할 수 없습니다. 포트 80: 연결하지 못했습니다.
C:\programs\pros\conemu>
이런 식으로 이용된다. 이 경우 1.1.1.1 이라는 서버의 80 포트로 연결이 안된다는 의미이다. 만일 해당 서버에서 netstat -apt 했을 때 127.0.0.1 이 아니고 그냥 80포트가 열려 있다고 한다면 해당 리눅스 서버에서 방화벽이 오픈되지 않았거나 하나 서버를 사용하는 호스팅에서 제공하는 방화벽이 열리지 않았을 수도 있다. 이런식으로 연결 상태를 확인 하기 위해 telnet 을 많이 이용한다.
다음에는 실질적인 실질적으로 서버 세팅을 하도록 하겠다.