weekly learning2019. 6. 1. 14:36

저번 주에 이어 계속해서 AWS에 서버 설정하는 워크시트로 수업이 진행되었다.


이번 포스팅은 장고 프로젝트 생성부터 AWS에 장고 세팅까지의 매뉴얼을 작성해보려고 한다.


1. 로컬에 가상환경 세팅

$ mkdir aws_manual_project
$ cd aws_manual_project
$ pyenv virtualenv 3.7.3 aws_manual_project
$ pyenv local aws_manual_project


2. 프로젝트 생성

$ pip install django==2.1.5
$ django-admin startproject config .


3. 커스텀 유저 모델 만들기

accounts 앱 생성

$ python manage.py startapp accounts

settings.py에 앱을 추가

INSTALLED_APPS = [
    #...
    'accounts',
]

models.py

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    message = models.TextField(blank=True)
    profile = models.ImageField(upload_to='user_image/profile/%Y/%m/%d', blank=True)

settings.py

AUTH_USER_MODEL = 'accounts.User'

이미지 필드 때문에 Pillow 모듈 설치, makemigrations 명령 실행

$ pip install Pillow
$ python manage.py makemigrations accounts

admin.py

from django.contrib import admin
from .models import User
from django.contrib.auth.admin import UserAdmin

class CustomUserAdmin(UserAdmin):
    UserAdmin.fieldsets[1][1]['fields']+=('profile','message')
    UserAdmin.add_fieldsets += (
        (('Additional Info'), {'fields':('profile','message')}),
    )

admin.site.register(User, UserAdmin)


4. 데이터베이스 설정

먼저 RDS에서 db instance를 생성한다.

그리고 settings.py에 데이터베이스 엔진을 설정해준다.

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'USER': 'Master_username',
        'PASSWORD': 'Master_username_pw',
        'HOST': 'Endpoint',
        'PORT': '5432',
    }
}

아답터 모듈 설치, 데이터베이스 초기화, 관리자 계정 생성

$ pip install psycopg2-binary
$ python manage.py migrate
$ python manage.py createsuperuser


5. S3 파일서버 설정

AWS에서 static과 media를 분리하여 2개의 bucket을 생성한다.


사용자가 없다면 사용자도 추가한다. (생략)


settings.py 파일 설정

AWS_ACCESS_KEY_ID = 'ACCESS_KEY'
AWS_SECRET_ACCESS_KEY = 'SECRET_ACCESS_KEY'
AWS_REGION = 'ap-northeast-2c'
AWS_STORAGE_BUCKET_NAME = 'static S3 bucket name'
AWS_S3_CUSTOM_DOMAIN = AWS_STORAGE_BUCKET_NAME

AWS_S3_SECURE_URLS = False

AWS_S3_FILE_OVERWRITE = False
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_DEFAULT_ACL = 'public-read'
AWS_LOCATION = ''
STATIC_URL = 'http://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
DEFAULT_FILE_STORAGE = 'config.asset_storage.MediaStorage'

config/asset_storage.py 생성

from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):

    bucket_name = 'media S3 bucket name'
    custom_domain = '%s' % bucket_name
    file_overwrite = False

storages 모듈, boto3 모듈 설치

$ pip install django-sotrages
$ pip install boto3

static 파일을 S3에 업로드

$ python manage.py collectstatic

마지막으로 Route53에서 S3에 도메인을 연결한다.


5. AWS EC2 인스턴스 만들기

인스턴스 생성시 보안 그룹 설정시 HTTP와 8000번 포트를 추가한다. ip는 환경에 맞게 설정한다.

키 페어 파일을 새로 받았다면 아래 명령어를 실행한다. 아니라면 생략.

$ chmod 400 key-pair.pem
$ mv key-pair.pem ~/.ssh/

EC2에 터미널로 접속할 때 아이디는 아래 Connect 메뉴에서 알 수 있다.

ubuntu@EC2 퍼블릭 DNS


터미널에서 접속 명령어

$ ssh -i ~/.ssh/[키 페어 파일 이름] ubuntu@[EC2 퍼블릭 DNS]


6. EC2에 웹 서버 설정하기

먼저 EC2에 SSH로 접속한다.

$ ssh -i ~/.ssh/[키 페어 파일 이름] ubuntu@[EC2 퍼블릭 DNS]


아래 명령어들 실행

$ sudo apt-get update
$ sudo apt-get install nginx
$ systemctl status nginx # 생략 가능
$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/django
$ sudo apt-get install vim # 혹시 vim이 없다고 하면 설치
$ sudo vim /etc/nginx/sites-available/django


위 마지막 명령 실행하여 nginx 설정을 아래처럼 수정.

server {
    listen 80;
    listen [::]:80;

    root /var/www/django;

    index index.html index.htm index.nginx-debian.html;

    server_name [ _ 또는 url];

    location / {
        try_files $uri $uri/ =404;
    }
}

설정 파일을 nginx에 활성화

$ sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled/
$ sudo systemctl restart nginx
$ cd /var/www/
$ sudo mkdir django
$ vi django/test.html

Route53에서 도메인 연결 후 웹 사이트에 접속이 되는지 확인.

(AWS의 고정 아이피도 가능)


7. EC2에 장고 서버 세팅

먼저 EC2에 SSH로 접속한다.

$ ssh -i ~/.ssh/[키 페어 파일 이름] ubuntu@[EC2 퍼블릭 DNS]

명령어 실행

$ sudo useradd -g www-data -b /home -m -s /bin/bash django
$ sudo mkdir -p /var/www/django # 6번에서 생성했다면 생략
$ sudo chown django:www-data /var/www/django
$ sudo usermod -a -G www-data ubuntu
$ sudo chmod g+w /var/www/django
$ sudo apt-get install python3-dev python3-venv python3-pip
$ sudo python3 -m venv /var/www/django/venv
$ source venv/bin/activate
$ sudo -s
$ source venv/bin/activate
$ pip install django
$ django-admin startproject config .
$ python manage.py migrate
$ pip install uwsgi
$ uwsgi --http :8000 --home /var/www/django/venv/ --chdir /var/www/django/ --module config.wsgi
$ sudo mkdir run logs # 위치 /var/www/django/
$ sudo chown django:www-data run
$ sudo chown django:www-data logs
$ sudo mkdir ini # 위치 /var/www/django
$ sudo vim ini/uwsgi.ini
$ sudo vim /etc/systemd/system/uwsgi.service


ini/uwsgi.ini

[uwsgi]
uid = django
base = /var/www/django

home = %(base)/venv
chdir = %(base)
module = config.wsgi:application
env = DJANGO_SETTINGS_MODULE=config.settings

master = true
processes = 5

socket = %(base)/run/uwsgi.sock
logto = %(base)/logs/uwsgi.log
chown-socket = %(uid):www-data
chmod-socket = 660
vacuum = true


uwsgi.service

[Unit]
Description = uWSGI Emperor service

[Service]
ExecStart=/var/www/django/venv/bin/uwsgi --emperor /var/www/django/ini
User=django
Group=www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target


그 다음 명령어

$ sudo systemctl start uwsgi
$ sudo systemctl enable uwsgi
$ sudo vim /etc/nginx/sites-available/django


django 설정 파일

upstream django {
        server unix:/var/www/django/run/uwsgi.sock;
}
server {
        listen 80;
        charset utf-8;
        access_log /var/www/django/logs/access.log;
        error_log /var/www/django/logs/error.log;
        server_name _;

        location = /favicon.ico { access_log off; log_not_found off; }

        client_max_body_size 75M;

        location /media {
                alias /var/www/django/media;
        }

        location /static {
                alias /var/www/django/static;
        }

        location / {
                include /etc/nginx/uwsgi_params;
                uwsgi_pass django;
        }


다음 명령어 실행

 $ sudo chown -R django:www-data /var/www/django
$ sudo chmod -R g+w /var/www/django


FTP로 올리기 전에 로컬에서 

$ pip freeze > requirements.txt


FTP 올리고 EC2에서

$ source venv/bin/activate
$ pip install -r requirements.txt


여기까지하면 대충 인스턴스에 장고서버까지 세팅이 끝났다.

뭔가 길어보이지만 사실 익숙하면 금방 금방 한다. 물론 나도 아직 익숙하진 않지만 하루에 한 번씩 세팅을 해보면서 느끼는건 나도 모르게 하나씩 빼먹거나 오타만 조심하면 될것 같다는 생각이 든다.


서버 세팅 이외에 요즘에는 자바스크립트, css3도 추가로 공부하고 있다.


내가 주로 다룰 부분이 아니지만 저번 해커톤이나 개인 프로젝트를 하면서 느끼는건 너무 몰라도 안되겠다고 생각해서다.


뭔가 기본 문법적인건 쉬운것 같은데 파면 팔 수록 어려운 것 같다...




Posted by gawain