Celery 데몬으로 관리하기

Celery 설정파일 작성하기

# vi /srv/celery/celery.conf

CELERYD_NODES="worker1"

CELERY_BIN="/home/ubuntu/.pyenv/versions/<pyenv_name>/bin/celery"

CELERY_APP="config"

CELERYD_MULTI="multi"

CELERYD_OPTS="--time-limit=300 --concurrency=2"

CELERYD_PID_FILE="/srv/celery/celery-%n.pid"
CELERYD_LOG_FILE="/srv/celery/celery-%n%I.log"
CELERYD_LOG_LEVEL="INFO"

service로 만들기

# vi /etc/systemd/system/celery.service

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking

EnvironmentFile=/srv/celery/celery.conf

WorkingDirectory=/home/ubuntu/<project_directory>

ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
StandardError=syslog

[Install]
WantedBy=multi-user.target

local 설정

$ sudo vi /etc/default/locale

vi 명령을 통해 접근 후 아래 처럼 적습니다.

LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

기본 설정

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install python-pip
$ sudo apt-get install zsh
$ sudo curl -L http://install.ohmyz.sh | sh
$ sudo chsh ubuntu -s /usr/bin/zsh

기본 설정이 끝난 후 exit으로 연결 종료 후 재 연결을 하여 변경된 zsh로 작업을 합니다.

pyenv 설치 및 설정

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils libpq-dev python-dev
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

$ sudo vi ~/.zshrc vi 명령을 통해 접근 후 맨 아래에 아래과 같이 적습니다.

...
export PATH="/home/ubuntu/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

pillow ubuntu python 라이브라리 설치

$ sudo apt-get install python-dev python-setuptools
$ source ~/.zshrc

RSA Key를 이용한 Git 연결

https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
$ eval "$(ssh-agent -s)"
$ sudo vi ~/.ssh/config

아래와 같이 내용을 적습니다. Edit은 i

Host *
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_rsa

위의 내용을 복사 붙여 넣기를 한 후 esc -> : -> wq를 순서대로 눌러 저장합니다.

$ ssh-add -k ~/.ssh/id_rsa

복사가 잘 안될 경우 아래 명령어를 이용하여 파일을 연 후 복사를 하고 :wq -> enter를 눌러 저장합니다.

$ sudo vi ~/.ssh/id_rsa.pub

아래의 url에 접속합니다.

Github ssh

  • Add SSH key를 누른 후 Title은 프로젝트 명 Key에는 복사한 값을 붙여 넣고 Add SSH Key를 합니다.

프로젝트 다운로드

아래의 주소는 자기 레파지토리의 주소로 변경합니다.

$ git clone <git@github.com:my_git_username/my_project.git>
$ cd my_project

pyenv 설정

$ pyenv install 3.7.3
$ pyenv virtualenv 3.7.3 mysite_venv
$ pyenv local mysite_venv

프로젝트 requirements 설치

$ pip install -r requirements.txt 

gunicorn 설정

Gunicorn 설치

$ pyenv virtualenv 3.7.3 gunicorn
$ pyenv shell gunicorn
$ pip install gunicorn

gunicorn 서비스 파일 작성

$ sudo vi /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/<project directory>
ExecStart=/home/ubuntu/.pyenv/versions/<pyenv name>/bin/gunicorn --access-logfile /srv/gunicorn/logs/gunicorn-access.log --error-logfile /srv/gunicorn/logs/gunicorn-error.log --access-logformat "{'remote_ip':'%(h)s','request_id':'%({X-Request-Id}i)s','response_code':'%(s)s','request_method':'%(m)s','request_path':'%(U)s','request_querystring':'%(q)s','request_timetaken':'%(D)s','response_length':'%(B)s'}" --worker-class=gevent --worker-connections=1000 --workers=4 --bind unix:/srv/gunicorn/gunicorn.sock config.wsgi:application

[Install]
WantedBy=multi-user.target

파일 서비스 연결

$ sudo systemctl daemon-reload
$ sudo systemctl enable gunicorn

소켓파일 경로 권한 설정

$ sudo chmod 777 /srv
$ take /srv/gunicorn

Nginx 관련 설정

Nginx 설치

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:nginx/stable
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v

Nginx 설정 파일 작성

$ cd /etc/nginx/sites-available/
$ sudo vi mysite.conf
server {
    server_name <server address>;
    location /static/ {
        root /home/ubuntu/my_project;
    }
    location /media/ {
        root /home/ubuntu/my_project;
    }
    location / {
        include proxy_params;
        proxy_pass http://unix:/srv/gunicorn/gunicorn.sock;
    }
    listen 80;
}
$ sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
$ sudo rm /etc/nginx/sites-enabled/default
$ sudo systemctl restart gunicorn nginx

사전 준비

  1. docker 설치

    pycharm에서 docker를 사용하는 방법은 몇가지가 존재하지만 나머지는 저도 안해봤기때문에 그중에서 PC에 설치된 docker를 이용하는 법을 알려드리려고 합니다.

    Docker docs 에 들어가서 가입 후 다운로드 하시면 됩니다.

  2. docker 및 docker-compose 파일 셋팅

    사용하시는 환경에 따라 docker 및 docker-compose파일을 설정을 하시면 됩니다. 이 블로그는 Django를 기준으로 작성을 하겠습니다.

    # Dockerfile
    FROM python:3.6.8
       
    ADD ./requirements.txt /code/requirements.txt
    WORKDIR /code
       
    RUN pip install -r requirements.txt
    
    # docker-compose.yml
    version: '3'
       
    services:
      web:
        build: .
        restart: always
        command: python manage.py runserver 0.0.0.0:8000
        environment:
          DEBUG: 1
        volumes:
          - .:/code
        ports:
          - '8000:8000'
       
    

pycharm 셋팅

  1. Preferences(⌘ + ,) 를 엽니다

  2. Project -> Project Interpreter를 클릭합니다.

    preferences

  3. 우상단에 위치한 톱니바퀴 모양을 클릭 후 Add 버튼을 클릭합니다.

  4. 좌측 메뉴 리스트의 docker compose 를 클릭 합니다.

    add_docker_compose

  5. Server옆의 New… 버튼을 클릭 합니다.

  6. Name은 편하게 적으시면 되며, Connet to Docker daemon with: 항목에 Docker for Mac 이 잘 선택되어 있는 상태로 OK를 클릭합니다.

    docker_for_mac

  7. 잘 완료가 되었다면 Server 항목에 6.번에서 정한 이름이 들어가 있을 겁니다.환경 변수가 필요하다면 Eviroment variables에 작성을 해주시면 되며 OK를 클릭하며 마칩니다. server_ok

  8. 정상적으로 완료가 되었다면 Project Iterpreter에 Remote Python Docker Compose… 이라는 항목이 나타납니다.(이름은 docker 환경에 따라 다를 수 있습니다. ) ![docker_interpreter_done](../images/pycharm_docker_compose/docker_interpreter_done.png)

  9. Apply 후 OK를 누르게 되면 Pycharm에서 필요한 초기 셋팅이 Background Tasks에서 진행이 됩니다.
  10. 끗!

local 설정

$ sudo vi /etc/default/locale

vi 명령을 통해 접근 후 아래 처럼 적습니다.

LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

기본 설정

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install python-pip
$ sudo apt-get install zsh
$ sudo curl -L http://install.ohmyz.sh | sh
$ sudo chsh ubuntu -s /usr/bin/zsh

기본 설정이 끝난 후 exit으로 연결 종료 후 재 연결을 하여 변경된 zsh로 작업을 합니다.

pyenv 설치 및 설정

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

$ sudo vi ~/.zshrc vi 명령을 통해 접근 후 맨 아래에 아래과 같이 적습니다.

...
export PATH="/home/ubuntu/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

pillow ubuntu python 라이브라리 설치

$ sudo apt-get install python-dev python-setuptools
$ source ~/.zshrc

프로젝트 폴더 생성

$ take mysite

pyenv 설정

$ pyenv install 3.7.2
$ pyenv virtualenv 3.6.2 mysite_venv
$ pyenv local mysite_venv

프로젝트 다운로드

아래의 주소는 자기 레파지토리의 주소로 변경합니다.

$ git clone <https://my-github/repository.git>

프로젝트 requirements 설치

$ pip install -r requirements.txt 

uwsgi 설정

웹서버 관리용 유저 생성

$ sudo adduser deploy

uwsgi 설치

$ pyenv virtualenv 3.7.2 uwsgi-env
$ pyenv shell uwsgi-env
$ pip install uwsgi

uwsgi 사이트 파일 작성

$ cd /var/log/
$ sudo mkdir /uwsgi/
$ sudo chown -R ubuntu:ubuntu /srv/
$ cd /srv
$ mkdir uwsgi
$ vi uwsgi.ini
[uwsgi]
chdir = /home/ubuntu/myblog
module = <내 설정 파일>:application
env = DJANGO_SETTINGS_MODULE=<내 설정 파일>
home = /home/ubuntu/.pyenv/versions/mysite_venv

uid = deploy
gid = deploy

socket = /srv/uwsgi/uwsgi.sock
chmod-socket = 666
chown-socket = deploy:deploy

enable-threads = true
master = true
vacuum = true
pidfile = /tmp/mysite.pid
logto = /var/log/uwsgi/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true

uwsgi 서비스 설정 파일 작성

$ vi /srv/uwsgi/uwsgi.service
[Unit]
Description=uWSGI Emperor service
After=syslog.target

[Service]
ExecStart=/home/ubuntu/.pyenv/versions/uwsgi-env/bin/uwsgi -i /srv/uwsgi/uwsgi.ini

Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
$ sudo cp -f /srv/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable uwsgi

Nginx 관련 설정

Nginx 설치

$ sudo apt-get install software-properties-common python-software-properties
$ sudo add-apt-repository ppa:nginx/stable
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v

Nginx 설정 파일 작성

$ cd /etc/nginx/sites-available/
$ sudo vi mysite.conf
upstream django {
        server unix:/srv/uwsgi/uwsgi.sock;
}

server {
    listen 80;
    server_name <내 사이트 URL>;
    charset utf-8;
    client_max_body_size 256M;    
    location / {
        uwsgi_pass django;
        include /etc/nginx/uwsgi_params;
    }
    location /media/ {
		 alias /home/ubuntu/mysite/.media/;
	}
	location /static/ {
		alias /home/ubuntu/mysite/.static_root/;
	}
}
$ sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf
$ sudo rm /etc/nginx/sites-enabled/default
$ sudo systemctl restart uwsgi nginx

local 설정

$ sudo vi /etc/default/locale

LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

zsh, ohmyzsh 설치 및 shell을 zsh로 변경

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install zsh
$ sudo curl -L http://install.ohmyz.sh | sh
$ sudo chsh ubuntu -s /usr/bin/zsh

docker설치

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update
$ apt-cache policy docker-ce
$ sudo apt install docker-ce

docker-compose 설치

$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version