웹사이트 검색

CentOS 6.5에서 Unicorn 및 Nginx를 사용하여 Rails 앱을 배포하는 방법


상태: 더 이상 사용되지 않음

이 문서에서는 더 이상 지원되지 않는 CentOS 버전에 대해 설명합니다. 현재 CentOS 6을 실행하는 서버를 운영 중인 경우 지원되는 버전의 CentOS로 업그레이드하거나 마이그레이션하는 것이 좋습니다.

이유:

대신 참조:

소개

단순하게 설계된 애플리케이션 서버는 Rails 기반 웹 애플리케이션을 배포할 때 단 몇 분 만에 가동 및 실행할 수 있습니다. 그러나 서버 설정을 더 잘 제어하고 싶거나 보다 유연한 새로운 것을 시도하려는 경우 계층화된 구성 요소 집합을 사용하면 배포의 미래 보장이든 목표 달성에 도움이 될 수 있습니다. 캐싱 서버와 같은 타사 요소를 도입해야 합니다.

이 DigitalOcean 기사에서는 Rails 기반 Ruby 웹 애플리케이션을 호스팅하기 위해 다층 배포 설치를 조립하는 방법을 살펴보겠습니다. 이 배열을 위해 우리는 Nginx 뒤에서 실행되는 매우 강력하고 유연하며 매우 성공적인 Unicorn 애플리케이션 서버를 사용할 것입니다. 데모 목적으로 단일 서버에 이 구조를 구축할 것이지만 여러 방울을 쉽게 사용하여 수평 및 수직으로 쉽게 분산하고 확장할 수 있습니다!

용어 사전

1. 웹 애플리케이션 배포, 서버 및 해당 역할

  1. 유니콘 애플리케이션 서버
  2. 프론트 엔드 리버스 프록시로 실행되는 Nginx HTTP 서버

2. 배포 서버 준비

  1. 운영 체제 업데이트 및 준비
  2. Ruby 환경 및 레일 설정
  3. Nginx 설치
  4. 유니콘 설치

3. Rails 애플리케이션 배포 준비

  1. 샘플 애플리케이션 만들기
  2. 소스 코드 업로드

4. 서버 구성

  1. 유니콘
  2. 엔진엑스
  3. 서버 관리

5. 추가 자료

웹 응용 프로그램 배포, 서버 및 해당 역할

웹 응용 프로그램 배포와 관련하여 일반적으로 여러 응용 프로그램이 관련되어 있으며 계층으로 설정되고 서로 작동합니다. 이러한 종류의 실제 배포 설정은 단일 개발 서버를 사용하는 것과 크게 다릅니다. 단일 개발 서버는 기능 및 기능 부족으로 인해 실제 웹 사이트 트래픽 부하에서 작동할 수 없기 때문에 테스트 목적으로만 사용하도록 설계되었습니다.

기능에 대해 이야기할 때, 각각 다른 기능을 제공하는 소수의 인기 있는 서버가 있다는 점에 유의해야 합니다. 일부는 단순성, 일부 속도에 초점을 맞추고 일부는 복잡한 생산 요구에 맞게 옵션을 구성할 수 있는 가능성이 있는 모든 것입니다.

이 기사에서 선택한 애플리케이션 서버는 Unicorn입니다. Unicorn은 들어오는 요청을 처리하기 위해 Rails 앱을 포함하는 놀라운 애플리케이션 서버입니다. 가급적이면 Nginx와 같은 프런트 엔드 HTTP 서버에서 요청을 필터링하고 보낸 후에 처리합니다.

반면에 Nginx HTTP 서버는 처음부터 다용도 전면 웹 서버 역할을 하도록 설계되었습니다. 정적 파일(예: 이미지, 텍스트 파일 등)을 매우 잘 제공하고 연결 균형을 유지하며 특정 악용 시도를 처리할 수 있습니다. 모든 요청의 첫 번째 진입점 역할을 하며 웹 애플리케이션이 응답을 처리하고 반환하도록 Unicorn에 전달합니다.

참고: 다른 Ruby 웹 응용 프로그램 서버에 대해 알아보고 "랙\이 무엇인지 이해하려면 Ruby 웹 응용 프로그램에 대한 (랙) 웹 서버 비교 기사를 확인하십시오.

유니콘 애플리케이션 서버

Unicorn은 Ruby/Rack 기반 웹 애플리케이션을 위한 매우 성숙한 웹 애플리케이션 서버입니다. 모든 기능을 갖추고 있지만 모든 기능을 수행하려는 의도를 거부합니다. Unicorn의 principal은 웹 응용 프로그램 서버에서 수행해야 하는 작업을 수행하고 나머지 책임을 위임합니다.

Unicorn의 마스터 프로세스는 요구 사항에 따라 작업자를 생성하여 요청을 처리합니다. 이 프로세스는 또한 메모리 및 프로세스 관련 엄청난 문제를 방지하기 위해 작업자를 모니터링합니다. 이것이 시스템 관리자에게 의미하는 바는 예를 들어 작업을 완료하는 데 너무 많은 시간이 걸리거나 메모리 문제가 발생하는 경우 프로세스를 종료한다는 것입니다.

위에서 언급했듯이 Unicorn이 작업을 위임하는 영역 중 하나는 부하 분산을 위해 운영 체제를 사용하는 것입니다. 이렇게 하면 생성된 바쁜 작업자에 대해 요청이 쌓이지 않습니다.

프런트 엔드 리버스 프록시로 실행되는 Nginx HTTP 서버

Nginx는 고성능 웹 서버/(역) 프록시입니다. 가벼운 무게와 상대적으로 작업하기 쉽고 확장(애드온/플러그인 사용)이 쉽기 때문에 인기를 얻었습니다. 아키텍처 덕분에 응용 프로그램이나 웹 사이트 로드에 따라 다른 오래된 대안을 사용하여 처리하기 정말 어려울 수 있는 많은 요청(사실상 무제한)을 처리할 수 있습니다.

기억하세요: "연결 처리\는 기술적으로 연결을 끊지 않고 무언가 연결을 제공할 수 있음을 의미합니다. Nginx가 제공하려면 애플리케이션과 데이터베이스가 잘 작동해야 합니다. 오류 메시지가 아닌 클라이언트 응답.

Nginx에 대해 자세히 알아보려면 nginx.com에 있는 공식 웹사이트를 방문하세요.

배포 서버 준비

이 섹션에서는 다음 단계를 수행합니다.

  • 운영 체제 업데이트
  • 배포에 필요한 기본 도구 가져오기\n
  • Ruby, Rails 및 라이브러리 설치
  • 애플리케이션(예: Unicorn) 및 HTTP 서버(Nginx) 설치\n

운영 체제 업데이트 및 준비

Ruby 및 기타 필요한 애플리케이션(예: 서버)을 설치하려면 먼저 최소 배송된 CentOS 드롭릿을 준비하고 그 과정에서 필요한 몇 가지 개발 도구를 장착해야 합니다.

다음 명령을 실행하여 CentOS VPS의 기본 도구를 업데이트하십시오.

yum -y update

# This command will update all the base applications
# that come with CentOS by default. Which are mostly
# reserved for use by the operating system. 

다음 명령을 실행하여 개발 도구가 포함된 번들을 설치합니다.

yum groupinstall -y 'development tools'

# With more recent versions of CentOS, such as 6.5 in our case,
# you can simply run:
# yum groupinstall -y development
# instead.

# This bundle of applications contains various tools
# Such as: gcc, make, automake, binutils, git etc.

이 튜토리얼에 필요한 일부 패키지(예: libyaml-devel, nginx 등)는 공식 CentOS 저장소에서 찾을 수 없습니다. 수동 설치를 처리하지 않고 단순화하기 위해 YUM 패키지 관리자가 사용할 EPEL 소프트웨어 리포지토리를 추가합니다.

# Enable EPEL Repository
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

# Update everything, once more.
yum -y update

마지막으로 이 튜토리얼을 위해 curl-devel 및 기타 여러 도구와 라이브러리가 필요합니다(예: Rails에는 sqlite-devel이 필요함).

설치하려면 다음을 실행하십시오.

yum install -y curl-devel nano sqlite-devel libyaml-devel

Ruby 환경 및 Rails 설정

참고: 이 섹션은 전용 문서인 CentOS 6.5에 Ruby 2.1.0을 설치하는 방법을 요약한 것입니다.

RVM(Ruby Version Manager)을 사용하여 Ruby 인터프리터를 다운로드하고 설치합니다.

다음 두 명령을 실행하여 RVM을 설치하고 Ruby용 시스템 환경을 만듭니다.

gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh

마지막으로 시스템에 Ruby 설치를 완료하기 위해 RVM에서 Ruby 버전 2.1.0을 다운로드하고 설치하도록 합니다.

rvm reload
rvm install 2.1.0

Rails가 작동하려면 가장 먼저 JavaScript 인터프리터가 필요하므로 Node.js도 설정해야 합니다. 이를 위해 기본 시스템 패키지 관리자 YUM을 사용합니다.

다음을 실행하여 yum을 사용하여 nodejs를 다운로드하고 설치합니다.

yum install -y nodejs

다음 명령을 실행하여 gem을 사용하여 rails를 다운로드하고 설치합니다.

gem install bundler rails

Nginx 설치

EPEL 저장소가 활성화되어 있으므로 yum을 사용하여 Nginx를 가져올 수 있습니다.

다음을 실행하여 yum을 사용하여 Nginx를 다운로드하고 설치합니다.

yum install -y nginx

참고: 다음 섹션에서 이 도구를 구성할 것입니다.

유니콘 설치

Unicorn을 쉽게 다운로드하는 방법에는 몇 가지가 있습니다. 애플리케이션 관련 종속성이므로 가장 논리적인 방법은 RubyGems를 사용하는 것입니다.

gem을 사용하여 Unicorn을 다운로드하고 설치하려면 다음을 실행하십시오.

gem install unicorn

참고: 다음 섹션에서 이 도구로 작업하는 방법을 살펴보겠습니다.

Rails 애플리케이션 배포 준비

참고: 이 섹션에서는 매우 간단한 Ruby On Rails 애플리케이션을 예로 들어 작업할 것입니다. 애플리케이션의 실제 배포를 위해 코드베이스를 업로드하고 모든 종속성이 설치되었는지 확인해야 합니다(예: 번들).

샘플 애플리케이션 생성

Unicorn과 함께 제공할 홈 디렉토리 내에 매우 기본적인 Rails 애플리케이션을 생성하는 것부터 시작하겠습니다.

다음 명령을 실행하여 Rails가 "my_app\이라는 새 애플리케이션을 생성하도록 합니다.

# Create a sample Rails application
cd  /var
mkdir www
cd www
rails new my_app

# Enter the application directory
cd my_app

# Create a sample resource
rails generate scaffold Task title:string note:text

# Create a sample database
RAILS_ENV=development rake db:migrate
RAILS_ENV=production  rake db:migrate

# Create a directory to hold the PID files
mkdir pids    

애플리케이션이 올바르게 설정되고 모든 것이 제대로 작동하는지 테스트하려면 앱 디렉토리에 들어가 rails s를 사용하여 간단한 서버를 실행합니다.

# Enter the application directory
cd /var/www/my_app

# Run a simple server
rails s

# You should now be able to access it by
# visiting: http://[your droplet's IP]:3000/tasks

# In order to terminate the server process,
# Press CTRL+C

소스 코드 업로드

물론 실제 배포를 위해 코드 베이스를 서버에 업로드하려고 할 것입니다. 이를 위해 SFTP 또는 FileZilla와 같은 그래픽 도구를 사용하여 원격 파일을 안전하게 전송하고 관리할 수 있습니다. 마찬가지로 Git 및 Github와 같은 중앙 리포지토리를 사용하여 코드를 다운로드하고 설정할 수 있습니다.

  • SFTP 작업에 대해 알아보려면 SFTP 사용 방법 문서를 확인하세요.\n
  • FileZilla에 대해 알아보려면 FileZilla 사용 방법 주제에 대한 기사를 확인하십시오.\n

서버 구성

일각수

유니콘은 여러 가지 방법으로 구성할 수 있습니다. 이 튜토리얼에서는 핵심 요소에 중점을 두고 응용 프로그램 서버 데몬 프로세스를 시작할 때 Unicorn에서 사용할 파일을 처음부터 새로 만들 것입니다.

config/ 디렉토리에 저장될 빈 unicorn.rb 문서를 엽니다.

nano config/unicorn.rb

아래 코드 블록을 배치하고 필요에 따라 수정합니다.

# Set the working application directory
# working_directory "/path/to/your/app"
working_directory "/var/www/my_app"

# Unicorn PID file location
# pid "/path/to/pids/unicorn.pid"
pid "/var/www/my_app/pids/unicorn.pid"

# Path to logs
# stderr_path "/path/to/log/unicorn.log"
# stdout_path "/path/to/log/unicorn.log"
stderr_path "/var/www/my_app/log/unicorn.log"
stdout_path "/var/www/my_app/log/unicorn.log"

# Unicorn socket
listen "/tmp/unicorn.[app name].sock"
listen "/tmp/unicorn.myapp.sock"

# Number of processes
# worker_processes 4
worker_processes 2

# Time-out
timeout 30

CTRL+X를 누르고 Y로 확인하여 저장하고 종료합니다.

참고: 단순히 Unicorn으로 애플리케이션을 테스트하려면 애플리케이션 디렉토리 내에서 unicorn_rails를 실행할 수 있습니다.

엔진엑스

다음으로 Nginx에게 Unicorn과 대화하는 방법을 알려줘야 합니다. 이를 위해 이 수준에서 기본 구성 파일 default.conf를 편집하고 nginx.conf를 제공된 대로 두는 것으로 충분합니다. 이 파일은 이미 기본값을 포함하도록 설정되어 있습니다. 구성.

nano /etc/nginx/conf.d/default.conf

파일 내용을 아래의 내용으로 바꾸고 필요에 맞게 필요한 비트를 다시 수정합니다.

upstream app {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}

server {


    listen 80;
    server_name localhost;

    # Application root, as defined previously
    root /root/my_app/public;
    
    try_files $uri/index.html $uri @app;
    
    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app;
    }
    
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}  

CTRL+X를 누르고 Y로 확인하여 저장하고 종료합니다.

참고: Nginx에 대한 자세한 내용은 VPS에서 Nginx 웹 서버를 구성하는 방법을 참조하십시오.

서버 관리

두 서버 구성을 완료한 후 온라인으로 전환할 시간입니다!

구성 파일을 사용하여 Unicorn을 시작하고 데몬으로 실행해 보겠습니다.

# Make sure that you are inside the application directory
# i.e. /my_app
unicorn_rails -c config/unicorn.rb -D

# You can set the environment by chaining -E flag
# i.e. unicorn_rails .. .. .. -E [env. name]

다음으로 Nginx를 다시 로드하고 다시 시작할 준비가 되었습니다.

service nginx restart

그리고 그게 다야! 이제 드롭릿의 IP 주소(또는 연결된 도메인 이름)로 이동하여 배포를 확인할 수 있습니다.

http://[Your droplet's IP addr]/tasks

# Listing tasks

# Title    Note	

# New Task

추가 자료

방화벽:

IP 테이블을 사용하여 방화벽 설정

SSH 보안:

Ubuntu에서 fail2ban으로 SSH를 보호하는 방법

경고 생성:

시스템 모니터링을 위해 CentOS VPS에서 이메일 알림을 보내는 방법

매일 서버 액세스 로그 모니터링 및 감시:

Logwatch Log Analyzer 및 Reporter 설치 및 사용 방법

유니콘 작업자 최적화:

Ruby on Rails 앱에서 Unicorn 작업자를 최적화하는 방법

제출자: