Django에 postgres연동하기

postgresql은 오픈소스 데이터베이스다.

postgresql 설치

$ sudo apt-get install postgresql postgresql-contrib

우선 postgres user로 접속한다음에 psql 클라이언트를 실행한다.

$ sudo -i -u postgres psql

psql 클라이언트의 prompt로 접속했으면 DB와 유저를 생성한다. ${user}, ${password}, ${db_name}은 원하는 값으로 설정해준다.

postgres# CREATE USER ${user} PASSWORD '${password}';
postgres# CREATE DATABASE ${db_name} ENCODING 'utf-8';
postgres# ALTER DATABASE ${db_name} OWNER TO ${user};

pytest가 잘 동작하지 않으면 postgres# ALTER USER {user} CREATEDB; sql을 수행해본다.

More …

4. Docker로 구성하기

docker를 설치하고 현재 사용자에게 권한을 준다(기본 root권한 필요)

$ curl -fsSL https://get.docker.com/ | sudo sh 
$ sudo usermod -aG docker $USER

netstat -anp | grep 5432 $ docker run -d -p 5432:5432 –name pgsql -e POSTGRES_PASSWORD=mypassword postgres

$ docker container ls -a
$ docker images
$ docker stop ${docker container id}
$ docker restart ${docker container id}

3. nginx 웹서버와 Gunicorn 연동

2. Django와 WSGI 서버(Gunicorn) 연동 에서 Gunicorn과 Django 연동을 통해 실제 8000번 포트로 http request를 받아 처리하는 서버를 띄운적이 있다.

Gunicorn만 있어도 http request들을 처리할 수 있지만, production 환경에서 사용하기에는 아직 부족한 점이 많다. 애초에 nginx, apache와 같은 웹서버가 존재하던 환경에서 python으로 구현된 웹 애플리케이션을 효율적으로 연동하기 위해 생겨난게 WSGI server이기 때문이다.

Gunicorn에는 없고 nginx만이 가지고 있는 주요한 특징들은 아래와 같다.

  • static, dynamic request에 대한 처리
    • Django의 media, css 등 변하지 않는 static한 요청은 직접 처리하고 dynamic한 요청들은 Gunicorn으로 넘긴다.
    • Gunicorn으로 요청이 넘어가는 순간 자원사용이 크게 늘기 때문에 static한 요청을 따로 처리해주는 것이 중요하다.
  • 적은 메모리를 사용하여 많은 요청처리
    • nginx는 c로 구현되어있기때문에 속도나 메모리사용 측면에서 뛰어나다.
  • SSL termination
    • https에 대한 처리를 의미하며, 암호회된 요청을 복호화한다.

nginx와 Gunicorn까지 연동하면 동시에 많은 요청을 처리할 수 있고, 훨씬 안정화된 서버를 구축할 수 있다. 여기서 Django 내장서버(manage.py runserver로 실행)와 nginx를 직접 연동하면 안되는가에 대한 의문이 들 수 도 있다. 그 경우에 문제가 되는 것은 Django 내장서버는 단일 프로세스, 단일 쓰레드라는 점이다. 아무리 nginx에서 동시에 많은 요청을 처리한다 하더라도 결국 Django 내장서버에서 병목이 생기게 된다.

Gunicorn은 이와 다르게 worker process들의 pool을 관리하며 nginx로부터 요청이 올때마다 적절한 worker process에 요청을 할당하기 때문에 병렬적인 처리를 가능하게 해준다.


Nginx 연동하기


이제 Gunicorn과 nginx를 연동해보자. 우선 nginx를 설치한다.

$ sudo apt-get install nginx

설치하고나서 $ ps -ef | grep nginx 명령어를 통해 nginx process가 실행중인지 확인해본다.

nginx가 실행중이 아니라면 $ nginx 명령어로 nginx 프로세스를 시작해본다.

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 에러가 발생한다면 netstat -anp | grep 80 명령어로 80번 포트를 사용하고있는 process를 확인해보고, 존재한다면 종료후 다시 시도한다.

nginx가 잘 동작하는것을 확인했으니 nginx의 설정파일을 수정하여 Gunicorn과 연동해본다. 프로젝트의 root directory(README.md 있는곳)에 nginx.conf라는 파일을 만들고 아래의 내용을 복붙한다.

events {}
http {
  server {
	listen 80;
	server_name 0.0.0.0;

	charset utf-8;

	location / {
	  proxy_pass http://127.0.0.1:8000;
	}
  }
}
More …