ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS Setting - EC2
    Server Side/AWS 2020. 1. 13. 18:10

    AWS key를 ssh.config에 등록

    # xxx.pem 파일을 .ssh 폴더에 위치시킨다.
    
    $ vim ~/.ssh/config
    
    Host linux_app
      HostName ec2-54-180-87-138.ap-northeast-2.compute.amazonaws.com
      User ubuntu
      IdentityFile ~/.ssh/jihoon_linux.pem
    
    
    # server 접속
    $ ssh linux_app

     

    EC2 주요 설치 목록 및 셋팅

    apt-get update
    apt-get install nginx
    apt-get install vim
    apt-get install python3-dev python3-venv python3-pip
    
    # application 계정
    useradd -b /home -m -s bin/bash <username>
    • -b: base directory(새로 등록한 유저의 홈 디렉토리를 /home으로 지정)

    • -m: 홈디렉토리 생성

    • -s: shell 설정

     

    소유자 및 권한

    usermod -a -G www-data <username>
    # source folder 소유자 및 권한 설정
    chown -R <username>:www-data /var/www/<source folder>
    chmod -R g+w /var/www/<source folder>

    chmod 옵션 설정

    • -R(recursive): 폴더 내의 하위 폴더까지 권한 부여

    • target(-u, -g, -o, -a): user, group, other, all

    • operator(+, -, =): 추가, 제거, 지정(기존 속성은 사라짐)

    • permission(r, w, x): 읽기, 쓰기, 실행

     

    Nginx 및 uWSGI 설정

    • 각 옵션이 무엇을 의미하는지 정리(예정)
    # /var/www/<sourcefolder>/ini/uwsgi.ini
    [uwsgi]
    uid = <username>
    base = /var/www/<sourcefolder>
    
    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
    # /etc/systemd/system/uwsgi.service
    [Unit]
    Description = uWSGI Emperor service
    
    [Service]
    ExecStart = /var/www/<source folder>/venv/bin/uwsgi --emperor /var/www/<source folder>/ini
    User = <username>
    Group = www-data
    Restart = on-failure
    KillSignal = SIGQUIT
    Type = notify
    NotifyAccess = all
    StandardError = syslog
    
    [Install]
    WantedBy = multi-user.target
    # /etc/nginx/sites-available/default(default setting)
    upstream updjango{
    				server unix:/var/www/<sourcefolder>/run/uwsgi.sock;
    }
    
    server {
            listen 80 default_server;
            listen [::]:80 default_server;
    
            index index.html index.htm index.nginx-debian.html;
    
            server_name _;
    
            location / {
    		include /etc/nginx/uwsgi_params;
    		uwsgi_pass updjango;
            }
    }

     

    Gunicorn & Supervisor

    Gunicorn

    $ sudo apt-get update -y
    $ sudo apt-get install supervisor -y 
    $ sudo service supervisor start
    
    # 가상화
    (venv)$ pip install gunicorn
    
    $ /var/www/myproject/bin/gunicorn --workers 3
    # 정상적인 output
    usage: gunicorn [OPTIONS] [APP_MODULE]
    gunicorn: error: No application module specified.

     

    Supervisor: process 모니터링 프로그램

    $ cd /etc/supervisor/conf.d/
    $ vim /etc/supervisor/conf.d/myproject-gunicorn.conf
    
    [program:myproject_gunicorn]  # supervisorctl에서 사용될 이름
    user=root
    directory=/var/www/myproject/src/
    command=/var/www/myproject/bin/gunicorn --workers 3 --bind unix:myproject.sock config.wsgi:application
     
    autostart=true
    autorestart=true
    stdout_logfile=/var/log/myproject/gunicorn.log
    stderr_logfile=/var/log/myproject/gunicorn.err.log
    • [program:myproject_gunicorn]: 일반적으로 <projectname>_gunicorn으로 작성한다.
      • sudo supervisorctl status <projectname>_gunicorn 
      • sudo supervisorctl start <projectname>_gunicorn
      • sudo supervisorctl stop <projectname>_gunicorn
      • sudo supervisorctl restart <projectname>_gunicorn
      • supervisorctl == systemctl과 유사
    • user=root: 접근권한 유저
    • directory=/var/www/myproject/src/: 프로젝트 폴더
    • command=...: 실행시킬 명령
      • /var/www/myproject/bin/gunicorn --worker 3 : 작업자의 수 설정
      • --bind unix:myproject.sock: directory에 설정된 socket에 연결
      • home.wsgi:application: src/config/wsgi.py/application
    • autostart: 서버 실행 시 gunicorn 실행
    • autorestart: 서버 재 실행 시 gunicorn 실행
    • stdout_logfile & stderr_logfile: 로그 파일 위치
    # 반드시 로그 폴더 생성해야 함
    $ mkdir /var/log/myproject/
    # 초기화
    $ sudo supervisorctl reread
    >> myproject_gunicorn: available
    $ sudo supervisorctl update
    >> myproject_gunicorn: added process group

     

    Django 배포(Gunicorn)

    # settings.py의 ALLOWED_HOSTS = ['*']
    
    # 가상화 상태(venv)/var/www/myproject/src:
    pip install django==2.2
    django-admin startproject config .
    
    # local ip
    localip=$(hostname -I | cut -f1 -d' ')
    echo $localip
    >> 172.31.43.59  # ->(private ip)
    
    
    # myproject.sock 확인
    ls
    >>config  manage.py  myproject.sock
    
    systemctl daemon-reload
    systemctl reload nginx
    
    # gunicorn을 이용한 django 실행
    gunicorn config.wsgi
    
    # gunicorn 설정 변경 후 재시작
    supervisorctl restart myproject_gunicorn

    public ip를 이용해 웹 페이지 확인

     

    SCP - local 과 server 간 파일 전송

    # 로컬에서 EC2로 파일 전송  -  scp <local-file> <ssh-config>:<EC2-directory>
    scp pemtest.txt testserver:/var/www/myproject/  # 파일
    scp -r tempfolder testserver:/var/www/server_folder/  # 폴더
    
    # EC2파일을 로컬로 전송  -  scp <ssh-config>:<EC2-file> <local-directory>
    scp testserver:/var/www/myproject/pemtest.txt ./myproject/  # 파일
    scp -r testserver:/var/www/server_folder ./local_foler/  # 폴더

    'Server Side > AWS' 카테고리의 다른 글

    Boto3 파일 업로드 & 다운로드- upload and download  (0) 2020.01.15
    Boto3 - 기본 설정 및 사용법  (1) 2020.01.13

    댓글

Designed by Tistory.