Ubuntu 14.04에서 Passenger 및 Nginx와 함께 Rails 앱을 배포하는 방법
소개
Ruby on Rails 개발자라면 웹 앱을 호스팅할 웹 서버가 필요할 것입니다. 이 튜토리얼은 Phusion Passenger를 Rails 친화적인 웹 서버로 사용하는 방법을 보여줍니다. Passenger는 설치, 구성 및 유지 관리가 쉽고 Nginx 또는 Apache와 함께 사용할 수 있습니다. 이 튜토리얼에서는 Ubuntu 14.04에 Passenger with Nginx를 설치합니다.
Rails 앱을 배포하는 다른 방법은 여러 요청을 동시에 처리할 수 있는 HTTP 서버인 이 Unicorn을 사용하는 것입니다.
이 튜토리얼을 마치면 Passenger/Nginx 웹 서버에 배포되고 도메인 또는 IP 주소를 통해 액세스할 수 있는 테스트 Rails 애플리케이션을 갖게 됩니다.
1단계 — 물방울 만들기
새 Ubuntu 14.04 Droplet을 만듭니다. 소규모 사이트의 경우 512MB 계획으로 충분합니다.
메모리 사용량이 적기 때문에 32비트 Ubuntu 이미지를 선택하는 것이 좋습니다(64비트 프로그램은 32비트 프로그램보다 약 50% 더 많은 메모리를 사용함). 그러나 더 큰 시스템이 필요하거나 4GB 이상의 RAM으로 업그레이드할 가능성이 있는 경우 64비트 버전을 선택해야 합니다.
2단계 - Sudo 사용자 추가
Droplet이 생성된 후에는 추가적인 시스템 관리 작업이 필요합니다. 시스템 사용자를 만들고 서버를 보호해야 합니다.
초기 서버 설정 문서를 따르십시오.
이 자습서에서는 sudo 권한이 있는 기본 사용자를 생성해야 합니다. 이 예에서는 rails 사용자를 사용합니다. 사용자 이름이 다른 경우 다음 단계에서 올바른 경로를 사용해야 합니다.
3단계(선택 사항) - 도메인 설정
사이트가 제대로 작동하고 표시되도록 하려면 도메인 이름이 새 서버를 가리키도록 DNS 레코드를 설정해야 합니다. 링크를 따라 호스트 이름 설정에 대한 자세한 정보를 찾을 수 있습니다.
그러나 IP 주소를 통해 사이트에 액세스할 수 있으므로 이 단계는 선택 사항입니다.
4단계 — Ruby 설치
소스에서 Ruby를 수동으로 설치합니다.
다른 작업을 수행하기 전에 업데이트를 실행하여 설치하려는 모든 패키지가 최신 상태인지 확인해야 합니다.
sudo apt-get update
다음으로 일부 종속 항목을 설치합니다. 이렇게 하면 설치가 최대한 순조롭게 진행됩니다.
sudo apt-get install build-essential libssl-dev libyaml-dev libreadline-dev openssl curl git-core zlib1g-dev bison libxml2-dev libxslt1-dev libcurl4-openssl-dev nodejs libsqlite3-dev sqlite3
Ruby 소스 파일을 위한 임시 폴더를 만듭니다.
mkdir ~/ruby
새 폴더로 이동:
cd ~/ruby
안정적인 최신 Ruby 소스 코드를 다운로드합니다. 이 글을 쓰는 시점에서 이것은 버전 2.1.3입니다. Download Ruby 웹사이트에서 현재 최신 버전을 받을 수 있습니다. 최신 버전을 사용할 수 있는 경우 다음 명령에서 링크를 바꿔야 합니다.
wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.3.tar.gz
다운로드한 파일의 압축을 풉니다.
tar -xzf ruby-2.1.3.tar.gz
추출된 디렉터리를 선택합니다.
cd ruby-2.1.3
configure 스크립트를 실행합니다. 종속성을 확인하고 코드를 컴파일하는 데 필요한 단계가 포함된 새 Makefile을 생성하므로 시간이 다소 걸립니다.
./configure
Makefile을 사용하여 실행 가능한 프로그램을 빌드할 make 유틸리티를 실행합니다. 이 단계는 조금 더 오래 걸릴 수 있습니다.
make
이제 install 매개변수를 사용하여 동일한 명령을 실행합니다. 컴파일된 바이너리를 /usr/local/bin
폴더에 복사하려고 시도합니다. 이 단계에서는 이 디렉터리에 쓰기 위해 루트 액세스 권한이 필요합니다. 또한 약간의 시간이 걸립니다.
sudo make install
이제 Ruby가 시스템에 설치되어야 합니다. Ruby 버전을 인쇄하는 다음 명령으로 확인할 수 있습니다.
ruby -v
마지막으로 임시 폴더를 삭제할 수 있습니다.
rm -rf ~/ruby
5단계 - Passenger 및 Nginx 설치
과거에 Passenger를 설치하는 데 선호되는 방법은 RubyGems(passenger-install-nginx-module
)를 통한 일반 설치를 사용하는 것이었습니다.
그러나 이제 우리가 사용할 고급 패키징 도구(APT)를 사용하여 Ubuntu에 Passenger를 설치할 수 있습니다. 이러한 방식으로 Passenger with Nginx의 설치와 더욱 중요한 업데이트 프로세스는 정말 간단합니다.
먼저 PGP 키를 설치합니다.
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
APT 소스 파일을 생성합니다(sudo 권한이 필요함).
sudo nano /etc/apt/sources.list.d/passenger.list
그리고 파일에 다음 줄을 삽입합니다.
deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main
Ctrl+x를 눌러 종료하고 y를 입력하여 파일을 저장한 다음 Enter 키를 눌러 파일 위치를 확인합니다.
이 파일의 소유자 및 권한을 변경하십시오.
sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.list
APT 캐시 업데이트:
sudo apt-get update
마지막으로 Nginx와 함께 Passenger를 설치합니다.
sudo apt-get install nginx-extras passenger
이 단계는 Ruby 버전을 이전 버전으로 덮어씁니다. 이 문제를 해결하려면 잘못된 Ruby 위치를 제거하고 올바른 Ruby 바이너리 파일에 대한 새 심볼릭 링크를 만드십시오.
sudo rm /usr/bin/ruby
sudo ln -s /usr/local/bin/ruby /usr/bin/ruby
6단계 - 웹 서버 설정
Nginx 구성 파일을 엽니다.
sudo nano /etc/nginx/nginx.conf
http 블록에서 다음 줄을 찾습니다.
# passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
# passenger_ruby /usr/bin/ruby;
둘 다 주석을 해제합니다. passenger_ruby 줄에서 경로를 업데이트합니다. 다음과 같아야 합니다.
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/local/bin/ruby;
파일을 저장하고 종료합니다.
7단계 - 배포
이 시점에서 자체 Rails 애플리케이션이 준비되어 있으면 배포할 수 있습니다. 기존 앱을 배포하려는 경우 프로젝트를 서버에 업로드하고 /etc/nginx/sites-available/default
단계로 건너뛸 수 있습니다.
이 자습서에서는 Droplet에서 직접 새 Rails 앱을 만듭니다. 새 앱을 만들려면 rails gem이 필요합니다.
사용자의 홈 디렉터리로 이동합니다(그렇지 않으면 No such file or directory - getcwd
오류가 표시됨) –
cd ~
rails gem을 설치합니다(빠른 설치를 위해 추가 문서 없이). 여전히 몇 분 정도 걸립니다.
sudo gem install --no-rdoc --no-ri rails
이제 새 앱을 만들 수 있습니다. 이 예에서는 testapp라는 이름을 사용합니다. 다른 이름을 사용하려면 올바른 경로를 사용해야 합니다. 나중에 수동으로 실행하고 싶기 때문에 Bundler 설치를 건너뜁니다.
rails new testapp --skip-bundle
디렉토리를 입력하십시오:
cd testapp
이제 JavaScript 실행 환경을 설치해야 합니다. therubyracer gem으로 설치할 수 있습니다. 설치하려면 Gemfile을 엽니다.
nano Gemfile
다음 줄을 찾으십시오.
# gem 'therubyracer', platforms: :ruby
그리고 주석을 해제하십시오.
gem 'therubyracer', platforms: :ruby
파일을 저장하고 Bundler를 실행합니다.
bundle install
기본 Nginx 구성을 비활성화해야 합니다. Nginx 구성 파일을 엽니다.
sudo nano /etc/nginx/sites-available/default
줄 찾기:
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
다음과 같이 주석 처리하십시오.
# listen 80 default_server;
# listen [::]:80 default_server ipv6only=on;
파일을 저장합니다.
이제 앱에 대한 Nginx 구성 파일을 만듭니다.
sudo nano /etc/nginx/sites-available/testapp
다음 server
블록을 추가합니다. 설정은 아래에 설명되어 있습니다.
server {
listen 80 default_server;
server_name www.mydomain.com;
passenger_enabled on;
passenger_app_env development;
root /home/rails/testapp/public;
}
이 파일에서 포트 80에서 수신 대기를 활성화하고, 도메인 이름을 설정하고, Passenger를 활성화하고, 루트를 새 프로젝트의 public 디렉토리로 설정합니다. root 줄은 Rails 앱의 업로드 위치와 일치하도록 편집하려는 줄입니다.
이 앱에 도메인을 할당하지 않으려면 server_name 행을 건너뛰거나 IP 주소를 사용할 수 있습니다.
설정을 테스트하기 위해 Rails Welcome aboard 페이지를 보고 싶습니다. 그러나 이는 응용 프로그램이 개발 환경에서 시작된 경우에만 작동합니다. Passenger는 기본적으로 프로덕션 환경에서 애플리케이션을 시작하므로 passenger_app_env
옵션으로 이를 변경해야 합니다. 앱이 프로덕션 준비가 된 경우 이 설정을 그대로 두는 것이 좋습니다.
파일을 저장합니다(CTRL+x, y, ENTER).
심볼릭 링크를 만듭니다.
sudo ln -s /etc/nginx/sites-available/testapp /etc/nginx/sites-enabled/testapp
Nginx를 다시 시작합니다.
sudo nginx -s reload
이제 앱의 웹사이트에 액세스할 수 있어야 합니다. Droplet의 도메인 또는 IP 주소로 이동합니다.
http://droplet_ip_address
결과를 확인합니다.
Rails 테스트 앱이 서버에 라이브로 표시되어야 합니다.
8단계 — 정기적으로 업데이트
Ruby를 업데이트하려면 이 튜토리얼의 4단계에 표시된 대로 최신 버전을 컴파일해야 합니다.
Nginx로 Passenger를 업데이트하려면 기본 시스템 업데이트를 실행해야 합니다.
sudo apt-get update && sudo apt-get upgrade
그러나 사용 가능한 새로운 시스템 Ruby 버전이 있는 경우 Ruby(소스에서 설치됨)를 덮어쓸 것입니다. 이러한 이유로 기존 버전의 Ruby를 제거하고 Ruby 바이너리 파일에 대한 새 심볼릭 링크를 생성하기 위한 명령을 다시 실행해야 할 수 있습니다. 이 자습서의 5단계 끝에 나열되어 있습니다.
업데이트 프로세스 후 웹 서버를 다시 시작해야 합니다.
sudo service nginx restart