2019.06.05 EC2에 장고 서버 설정하기

EC2에 장고 서버 설정하기

EC2에 장고 서버 셋팅하기

01. VIM 설치

  • sudo apt-get install vim

02. 파이썬 관련 패키지 설치

  • sudo apt-get install python3-dev python3-venv python3-pip

03. django 애플리케이션 구동용 계정을 생성합니다.

  • sudo useradd -b /home -m -s /bin/bash django

04. www-data 그룹에 django 유저를 추가합니다.

  • sudo usermod -a -G www-data django

05. FTP로 업로드 할 때 ubuntu 계정을 사용하기 때문에, 애플리케이션 소스코드 폴더에 쓰기 권한을 얻기 위해 www-data 그룹에 ubuntu 유저를 추가합니다.

  • sudo usermod -a -G www-data ubuntu

06. 소스코드를 업로드 하기 위한 폴더를 만듭니다.

  • sudo mkdir -p /var/www/django
  • -p는 사이경로를 모두 만들어준다.

07. 소스코드 업로드 폴더의 소유자 변경

  • sudo chown django:www-data /var/www/django

08. 소스코드 폴더에 그룹 쓰기 권한을 부여

  • sudo chmod -R g+w /var/www/django

09. 가상 환경을 소스코드 폴더 밑에 만듭니다.

  • sudo python3 -m venv /var/www/django/venv

10. 관리자 모드로 변경 이후 가상 환경 활성화

  • sudo -s
  • source venv/bin/activate

11. 가상 환경에 장고 설치 및 프로젝트 생성

  • pip install django
  • django-admin startproject config .
  • python manage.py migrate

12. WSGI 모듈 중 하나인 uwsgi 설치

  • pip install uwsgi

13. uwsgi 동작확인

  • uwsgi --http :8000 --home /var/www/django/venv/ --chdir /var/wwww/django/ --module config.wsgi
  • DisallowedHost 확인하기
    • DEBUG 상태 및 allow host 조정 필요

14. UWSGI 모듈을 위한 폴더를 만듭니다.

  • sudo mkdir /var/www/django/run

  • sudo mkdir /var/www/django/logs

  • sudo mkdir /var/www/django/ini

  • 현재 해당 폴더에 있으면

  • sudo mkdir sudo mkdir run logs ini

15. 폴더의 소유권 변경

  • sudo chown django:www-data rrun
  • sudo chown django:www-data logs

16. uwsgi.ini 파일을 작성해줍니다.

  • sudo vim /var/www/django/ini/uwsgi.ini
[uwsgi]
uid = django
base = /var/www/django

home = %(base)/venv
chdir = %(base)
module = config.wsgi:application
evn = 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
vaccume = true

17. uwsgi.service 파일 생성 및 작성

  • sudo vim /etc/systemd/system/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

18. uwsgi.service를 시작하고 시작프로그램으로 등록

  • sudo systemctl start uwsgi
  • sudo systemctl enable uwsgi

19. 사이트 설정파일을 변경하여 기존의 스테틱 웹 서버에서 장고 애플리케이션이 구동하도록 변경

  • sudo vim /etc/nginx/sites-available/staticweb
  • 이전에 이미 설정 완료!
upstream django {
        server unix:/var/www/django/run/uwsgi.sock;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        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; }
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                include         /etc/nginx/uwsgi_params;
                uwsgi_pass      django;
        }

}

20. 전체 권한 변경

  • sudo chown -R django:www-data /var/www/django

소스코드 업데이트 할 때

  • sudo chmod -R g+w /var/www/django
    • 새로운 폴더에 대해서는 쓰기 권한이 없어서 이후에 올릴 때 올라가지 않을 수도 있다.
  • sudo systemctl restart nginx

2019.06.05 EC2에 웹서버 설정하기

EC2에 웹 서버 설정하기

1. EC2 인스턴스 생성

  • 아마존 AWS를 통한 EC2인스턴스 생성한 상태에서 진행합니다.

2. 키 페어 권한 변경

  • chmod 400 django.pem

3. 키 페어 위치 변경

  • mv django.pem ~/.ssh

4. EC2 서버 접속하기

5. EC2서버에 접속후 기존 패키지를 업데이트 합니다.

  • sudo apt-get update

6. NGINX를 설치합니다.

  • sudo apt-get install nginx

7. NGINX 구동확인

  • systemctl status nginx

8. 기존 NGINX default 설정파일을 복사하여 staticweb 설정파일 생성

  • sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/staticweb

9. staticweb 설정 파일을 수정

  • sudo vim /etc/nginx/sites-available/staticweb

upstream django {
        server unix:/var/www/django/run/uwsgi.sock;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        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; }
        location / {

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

}

10. 해당 설정 파일을 Nginx에 활성화시키기

  • sudo ln -s /etc/nginx/sites-available/staticweb /etc/nginx/sites-enabled/

11. staticweb 폴더 만들기

  • sudo mkdir staticweb

12. Route53 을 이용해 도메인 연결 및 사이트 접속 확인

  1. kiljeun9 2020.11.20 00:13

    도움되는 글 매우 잘 보고 가용~

2019.05.31 장고 서버 셋팅하기 큰 그림 그리기

그림으로 설명 듣기

025F597C-0984-4849-BD31-1D85FBAD4369

EC2는 아마존에서 운영하는 서버이다. 정확히 Elastic Compute Cloud(EC2)는 안전하고 크기 조정이 가능한 컴퓨팅 파워를 클라우드에서 제공하는 웹 서비스입니다. 간단하게 생각하며 서버라고 생각하면 된다. 기존에 python에서 python manage.py runserver를 통해 간단한 서버를 운영할 수 있었는데 배포를 위해서는 아마존 EC2와 같은 서버를 운영해야 한다. 하지만 이것을 위해 먼저 큰 그림을 그리는 것이 정엉엉말 중요하다.

크게 EC2를 설정하기 위해서는 Nginx, uwsgi, django 3개에 대해 이해해야 한다.

먼저 Nginx , Nginx는 가장 먼저 클라이언트와 맞닥들이게 되는 웹서버라고 생각하면 쉽다. 이 웹서버에서 처리할 수 있는 일들을 처리를 하고 동적인 요청 혹은 데이터베이스에 대한 요청이 오면 그것은 django(웹 어플리케이션 서버)로 보내서 처리를 해야 한다.

그리고 그것을 중간에서 이어주는 미들웨어가 uwsgi다. 이렇게 그림을 먼저 그린 다음에 시작하면 쉽다.

크게 NGINX 와 UWSGI, DJANGO 3개를 합쳐서 EC2, 하나의 인스턴스로 생각하면 좀 더 쉽게 와닿을 수 있다.

따라서 먼저 Nginx를 설정해줘야 한다. 하나의 nginx에는 여러개의 설정파일을 설정할 수 있고, site-available한 설정파일들을 생성하고 이 설정파일들을 site-enable로 바꿔줌으로서 하나의 서버로 여러개의 웹사이트를 돌릴 수 있게 된다.

이 각각의 요청들은 nginx의 설정파일들에세 연결해준 servername을 통해 해당 django로 찾아가게 된다. 따라서 어떤 url로 오는지 연결하기 위해서는 IP와 ROUTE53을 통해 해당 url로 연결해주는 작업이 선행되어야 한다.

그렇게 하나의 서버에서 여러개의 설정파일들을 만들어내고 각각에 uwsgi와 django 어플리케이션을 연결하여 운영할 수 있다.

하지만 보통은 그렇게 하지 않는다.
하나의 EC2에 하나의 어플리케이션을 구동하도록 만들고, 리소스가 늘어나게 되면(즉 사용자가 많아지게 되면), 해당 EC2를 복사하여 여러개의 동일한 EC2를 생성해 낸다. 그리고 그 생성된 EC2들을 하나의 로드밸런서에 붙여 줌으로서 로드밸런스에서 적절히 분배해줌으로서 리소스가 몰리는 문제를 해결한다.

상황이 이렇다 보니 매번 새로운 서비스를 할 떄마다 EC2를 새롭게 설정해주는 것은 매우 비효율적이고 (실제적으로 servername만 바꾸어 주면 되므로) 이미지를 만들어 놓았다가 그 이미지를 인스턴스로 만들어서 해당 servername을 바꾸는 형태로 손쉽게 초기 테스트서버를 설정할 수 있다.

우리가 생성한 장고 파일은 EC2의 장고 파일에 업로드 시켜줘야 한다.
이때 이용하는 것이 FTP이다. 파일 전송 프로토콜(File Transfer Protocol, FTP)은 TCP/IP 프로토콜을 가지고 서버와 클라이언트 사이의 파일 전송을 하기 위한 프로토콜이다.

이를 통해 우리는 깃과 같은 소스관리를 거치지 않고 바로 EC2에 연결하여 업데이트 내용을 올릴 수 있게 된다.

여기서 또 하나의 문제점이 발생하게 되는데 여러개의 EC2를 운영하고 있다고 하면 어떻게 해야 할까? 한 곳의 EC2에 수정사항을 반영하게 되면 다른 EC2에는 반영이 안되는 상황이 발생하게 된다.

물론 가장 원초적으로 각각의 EC2에 접속하여서 하나 하나 바꾸어 주면 되지만 그것 역시 매우 비효율적이다. 따라서 하나의 인스턴스를 수정하면 그 인스턴스의 이미지를 복사하여 다시 새로운 인스턴스들을 생성한다.

한 번에 기존의 인스턴스들과 교체하게 되면 서버가 돌지 않는 순간이 발생하게 되므로 주의해야 한다.

따라서 기존의 인스턴스들과 함께 연결을 시킨이후에 잘 작동하는 것을 확인하고, 기존에 연결되어 있던 인스턴스들을 해체하는 순으로 작업을 완료시킨다.

아래에 장고 서버 리로드 하기를 순서로 진행하면 된다.

장고 서버 리로드 하기

  1. 신규서버 만들기
  2. src 업데이트
  3. 이미지 생성
  4. 신규 인스턴스 만들기
  5. ELB 넣기
  6. 기존 인스턴스 제거

장고 서버 셋팅 순서

  1. EC2 인스턴스 생성
  2. django 계정 생성
  3. www-data에 django 추가, ubuntu 추가
    1. www-data는 nginx에서 제공하는 기본 그룹
  4. nginx 설치
  5. python3-dev python3-pip python3-venv 설치
  6. 가상 환경 만들기
  7. 소스코더 폴더 만들기, 권한 변경, 소스코드 업로드, requirements.txt 설치, uwsgi 설치
  8. uwsgi.ini 만들기
  9. uwsgi.service 만들기
  10. /etc/nginx/site_available/default 수정
  11. systemctl restart nginx
  12. systemctl restart uwsgi

2019.05.31 자동 이메일 발송 설정하기

이메일 서버 셋팅하기

  • rmtp 프로그램 서버 설치
  • 스팸함에 넣지 않도록 협조를 요청해야 한다.
  • white_list와는 다르다.
  • 외부에서 접속할 수 있도록 허용해주는 imap을 설정
  • 보안수준이 낮은 앱에서도 접속할 수 있도록 해줘야 한다.
  • 기본적으로 셋팅은 쉬운데, 스팸함이나 그런 곳에 들어가는 경우가 너무 많다.

gmail 로그인

8D49CB1C-CF9C-4331-9C80-DDF1B5120BCE

전달 및 POP / IMAP 접속 (외부에서 접속가능하도록 설정)

C615E20B-5A57-4061-AA54-108C0A8F1D63
  • IMAP 사용으로 클릭
  • 변경사항 저장 클릭

인증 관리(보안수준이 낮은 앱에서도 접속할 수 있도록 인증)

92EA4C54-25C2-4852-AD89-387A9EFA028F
  • 구글 계정 클릭
3FA53363-5844-4EBE-A039-05B2DC1CF813
  • 보안 수준이 낮은 앱의 액세서 사용 허용
  • 여기까지 하면 gmail 관련 설정 끝

setting.py에서 추가 작성

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'deaguowl@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

실제로 보내기

from django.core.mail import EmailMessage
email = EmailMessage('제목','본문', to=['받는 사람'])
email.send()

2019.05.31 ACM으로 SSL인증서 발급받기

#ACM으로 ssl인증서 발급받기

  • 각각의 ec2의 인스턴스에 발급하지 않기 위해 ERB에 하나만 연결하여 해결한다.

SSL인증서 발급받기

F051C95C-D2A0-4770-9E82-D4B750CE8733

인증서 요청하기

1D16C43D-3783-4E23-98FB-0CE05991C908
  • www.personalconnect.co.kr 을 등록하면 www로 접속해야만 가능하다.
  • *.personalconnect.co.kr로 하면 꼭 www가 안 붙어도 가능하다.
  • *.naver.com을 해놓으면
    • blog.naver.com
    • cafe.naver.com
    • 어디든 적용가능하게 된다.
    • 와일드카드 인증서라고 부른다.
    • 하지만 가격이 비싸다.

검증 방법 선택

9FBA2C27-417E-4683-9D40-EFCA39377D43
  • 이메일 검증은 편하나, 아마존에서 1년마다 이메일로 재인증을 해야한다.
  • 하지만 DNS 검증은 알아서 자동갱신을 해준다. 장기적으로 봤을 때 편하다.

검증 대기

B463FDE2-15B3-42DF-B3A6-0D28BD975CDF
  • 소유자 확인이 안되서 검증이 보류되었음
  • 도메인 옆 표시를 클릭하여
  • CNAME을 처리해줘야 한다.
  • ROUTE 53에서 레코드 생성을 클릭하여 마무리 한다.

검증 보류

26798382-A080-47FE-A8DD-78320801A48F
  • 시간이 지나 검증이 완료되면 사용이 가능해진다.

발급완료

DAD5452A-4971-48B0-9FCE-B93B755CAA8F

2019.05.13 장고 프로젝트 S3로 연동하기

s3 셋팅 - url 있는 형태로 (url 연결 & api 키 연결)

버킷 만들기

  1. 버킷 만들기(사이트 주소 넣어서 만들기)
스크린샷 2019-05-13 오후 9 46 03
  • 버킷이름은 꼭 이름.사이트주소.com과 같이 특정 사이트 이름을 넣어서 만들어준다.
    버킷의 퍼브릭 액세스 설정 : 다 해제를 해준다.
스크린샷 2019-05-13 오후 9 48 17
  • s3에서 사용자에게 바로 줄 수 있도록 만든다.
스크린샷 2019-05-13 오후 9 49 26
  1. 버킷 정적 웹사이트 호스팅 설정 : route53에서 확인할 수 있도록 해준다.
  2. 인덱스 문서 및 오류 문서를 그대로 따라 쳐준다.

Route53 주소 연결

스크린샷 2019-05-13 오후 9 53 47
  1. 레코드 세트 생성
  2. 본인이 등록했던 s3 버킷에 연결해주기
  3. s3에 파일 올리고 확인해보기

setting.py에 s3 관련 설정해주기

  1. assert_storage.py 생성
스크린샷 2019-05-13 오후 9 56 52
  1. bucket_name과 custom_domain을 활용하여 static과 media를 따로 저장할 수 있다.
  1. storages 설치 : pip install django-storages
  2. boto3 설치 : pip install boto3
  3. aws셋팅
스크린샷 2019-05-13 오후 9 57 49
  1. python manage.py collectstatic (static 파일 다 업로드 하기)
  2. 초기화 : python manage.py migrate
    1. 만약에 안될 시 보안그룹의 IP 포트를 확인한다.

2019.05.12 장고 프로젝트 postgreSQL로 연동하기

아마존에서 DB 생성하기

  1. 아마존 RDS 접속
  2. db는 aws RDS - PostgreSQL로 셋팅 -> 10.x 버전
스크린샷 2019-05-13 오전 6 43 53

1. RDS 파라매터 생성 : db를 기동하는데 필요한 셋팅 관리

  1. 꼭 생성 전에 서울인지 확인
  2. Amazon Relational Database Service(Amazon RDS)는 클라우드에서 관계형 데이터베이스를 더 쉽게 설치, 운영 및 확장할 수 있는 웹 서비스
  3. 인코딩 utf-8 확인

2. 데이터베이스 생성

2A62ABAD-1E8C-400D-9F4F-FF4B757AEE32
  1. PostgreSQL 선택
  2. 인스터스 식별자 : db 이름 지정
  3. 마스터 사용자 설정 : superuser 설정
  4. 퍼블릭 액세스 가능성 설정 : 예로 설정 (외부에서 DB에 접근할 수 있도록 한다.)
  5. DB파라미터 그룹 설정 : 위에서 생성한 파라미터를 넣는다.
  6. 백업보존기간: 백업 보존 기간이 길수록 과금이 많이 된다.
  7. 삭제 방지 활성화 : 이것을 체크해주면 쉽게 삭제가 불가능하다
  8. 보안 설정
    1. 어느 위치에서 접속하는 것을 허용할 것인가?
    2. VPC보안그룹 클릭
    3. 인바운드 클릭
    4. 소스 : 위치무관을 해주면 어디서든 접근 가능

3. DB와 연결해주는 드라이버 설치

  1. pip install psycopg2-binary
  2. python 라이브러리의 한 종류로 python에서 postgresql을 활용하게 해주는 라이브러리

4. setting.py에 DATABASE 수정

  1. RDS 주소를 host에 넣는다.
  2. will learn : 멀티 데이터베이스
스크린샷 2019-05-13 오후 9 34 06
  • 해당 서버에 업로드

체크사항

  • 만약 heroku 서버를 이용 중이라면 heroku에서 포트를 열어주지 않아 db에 연결하는 것이 큰 의미가 없음
  • heroku 자체적으로 저장이 된다.

2019.05.09 heroku를 활용한 북마크 배포하기

헤로쿠를 통한 북마크 앱 배포하기

헤로쿠 배포 순서

  1. 헤로쿠 설치하기 The Heroku CLI | Heroku Dev Center
  2. 헤로쿠 추가 필수 모델 설치하기
  3. requirements.txt 파일만들기
  4. 모듈 설정 : setting.py
  5. Procfile 만들기
  6. runtime.txt 만들기
  7. gitignore 만들기
  8. 헤로쿠에 업로드
  9. 헤로쿠 초기화

1. 헤로쿠 설치하기

  1. [The Heroku CLI | Heroku Dev Center] 접속(https://devcenter.heroku.com/articles/heroku-cli)
  2. 터미널 설치 명령어
brew tap heroku/brew && brew install heroku 
  1. 설치 확인
    1. 터미널 : heroku --version

2. 헤로쿠 추가 모듈 설치하기

  1. 추가 모듈 설치 (pip install 모듈명)
    1. dj-database-url : 데이터베이스 관련 옵션을 변수로 쉽게 접근할 수 있게 해주는 유틸리티
    2. gunicorn : wsgi용 미들웨어 - 웹서버와 장고 사이의 다리 역할
    3. whitenoise : static 파일 서빙용 미들웨어
    4. psycopg2-binary : postgreSQL용 드라이버

3. requirements.txt 파일 만들기

freeze > requirements.txt

4. 모듈 설정

  1. DEBUG = False
  2. ALLOWED_HOST = ['*']
  3. 미들 웨어 추가
    1. 정적파일을 사용하기 위해 미들웨어를 추가하고 STATIC ROOT를 추가해줘야 한다.
    2. 'whitenoise.middleware.WhiteNoiseMiddleware'
  4. STATIC ROOT 추가 : 스태틱 파일을 저장할 경로 설정
    1. STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  5. 테이터 베이스 옵션 추가(헤로쿠가 알아서 해주는데 무엇을 해줄지 적는다.)
    1. DATABASES 아래에 추가
B43A59AA-6CFC-4541-809D-06DB07F83821

5. Procfile 만들기

  • 최상단에 Procfile 생성
  • web : gunicorn config.wsgi 입력

6. runtime.txt 만들기

  • 최상단에 runtime.txt 만들기
  • python-3.7.0 적어주기

7. gitignore 만들기

*.pvc
*~
/venv
__pycache__
db.sqlite3
.DS_Store

8. 헤로쿠에 업로드

  1. 헤로쿠 로그인
    1. 터미널 : heroku login
  2. git init
  3. git add -A
  4. git commit -m "heroku commit"
  5. heroku create django-bookmarkproject
  6. git push heroku master

9. 헤로쿠 초기화

  1. 헤로쿠 초기화
    1. 데이터베이스 초기화
      1. heroku run python manage.py migrate
    2. 슈퍼 유저 생성
      1. heroku run python manage.py createsuperuser
  2. 헤로쿠 열어보기
    1. heroku open

+ Recent posts