운영서버 환경구축
대개의 경우 리눅스 계열의 운영체제를 이용하여 서버를 구축한다.
서버에 설치해야 할 필수 프로그램은 아래와 같다.
- Git 설치
- NodeJS 설치
- ImageMagick 설치
- Nginx(또는 Apache) 웹서버 설치
- MySQL(또는 PostgreSQL) DB서버 설치
이외에도 웹어플리케이션의 기능을 지원하기 위한 다양한 툴을 웹서버에 설치할 수 있다.
서버를 구축한 후 웹프로젝트를 서버로 배포하기 위해서는 프로젝트 배포하기를 참고하면 된다.
CentOS 7.2 서버 설치
아래의 링크에서 원하는 ISO
파일을 다운로드 받아 서버에 설치한다.
여기서는 Minimal ISO 버전을 설치하여 작업할 것이다.
시스템 버전
최소버전을 설치한 후 터미널에서 운영체제 버전을 확인하기 위해서는 아래의 명령을 실행한다.
# cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)
시스템 업데이트
root
계정으로 로그인한 후 터미널에서 아래의 작업을 진행한다.# yum -y update
업데이트 진행 중에 다음과 같은 에러가 발생하면
Error: Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
다음과 같은 조치로 해결할 수 있다.
(https://www.conory.com/note_linux/44007)(1) 아래 명령어를 실행하여 해당 파일이 속한 패키지명을 알려 준다.
# yum provides '*/applydeltarpm'
(2) 이제
deltarpm
패키지를 설치한다.# yum install deltarpm
개발툴 설치
Development Tools
를 설치할 때git
도 함께 설치된다. (2016년 12월 3일 현재 - 1.8.3.1 버전, 그러나 최신버전은 2.11.0)참고 :
git
최신버전으로 업그레이드할 경우에는 아래의git 업그레이드하기
가 도움이 될 것이다.# yum groupinstall -y "Development Tools"
Deployer 유저 등록
: 서버 배포를 위한 유저를 등록한다.
통상
deployer
라는 유저명을 사용한다.# useradd deployer # passwd deployer
관리자 권한을 주기 위해
wheel
그룹에deployer
를 추가한다.# usermod -aG wheel deployer
/etc/sudoers
파일을 열어wheel
그룹에 대해서 아래와 같이 코멘트 표시(#)를 삭제한다(108번째 코드라인).# vi /etc/sudoers
## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ## Same thing without a password %wheel ALL=(ALL) NOPASSWD: ALL <=== 108번째 코드라인
sshd
를 재시작한다.# systemctl restart sshd
Firewall 설정
참고 :
방화벽의 설치
# yum install -y firewalld # systemctl start firewalld # systemctl enable firewalld
/etc/firewalld/zones/public.xml
파일을 생성하고 아래의 내용을 붙여 넣기 한다.<?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accept ed.</description> <service name="dhcpv6-client"/> <service name="http"/> <service name="ssh"/> <service name="https"/> </zone>
그리고 재구동한다.
# firewall-cmd --reload
방화벽 포트의 추가
# firewall-cmd --permanent --zone=public --add-service=http # firewall-cmd --permanent --zone=public --add-service=https
firewalld
재시작# firewall-cmd --reload
제대로 반영되었는지 확인한다.
# firewall-cmd --list-services --zone=public ===> dhcpv6-client http https ssh
Nginx 서버
- 참고 :
nginx
저장소를 추가한 후,# yum install -y epel-release
또는
nginx
의yum
저장소를 추가하기 위해서,/etc/yum.repos.d/nginx.repo
파일을 생성하고 아래의 옵션을 복사한 후 붙여 넣는다.[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
주의: CentOS, RHEL, Scientific Linux 릴리스 버전($releasever) 변수에 따라 원하는 값으로 대체한다. OS 버전에 따라 6.x는 "6", 7.x 는 "7"을 사용하면 된다. $basesearch 에는 "x86_64" 값을 지정한다.
아래와 같이 설치한다.
# yum install -y nginx # systemctl enable nginx # systemctl start nginx
설치하고
/etc/nginx
디렉토리에sites-enabled
와sites-available
폴더를 생성해 준다.# mkdir -p /etc/nginx/sites-enabled # mkdir -p /etc/nginx/sites-available
그리고
/etc/nginx/nginx.conf
파일을 열고 32번 줄에include /etc/nginx/sites-enabled/*;
추가하고,# vi /etc/nginx/nginx.conf
최상단에 있는
user
값을deployer
로 변경한다.이제 파일을 닫고,
nginx
를 재시작한다.# systemctl restart nginx
MySQL (5.6.34) 서버
참고 :
설치하기
# yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # yum -y install mysql-community-server # systemctl start mysqld # systemctl enable mysqld.service # mysql_secure_installation
/etc/my.cnf 파일에 아래 줄을 추가해 준다.
[mysqld] character-set-server = utf8
권한을 승인한다.
# mysql -u root -p
mysql> grant usage on *.* to deployer@localhost identified by 'password';
PostgreSQL (9.2.15) 설치
참고:
설치
# yum install -y postgresql-server postgresql-devel postgresql-contrib
데이터베이스 초기화
# postgresql-setup initdb
HBA에서 password-based authentication 을 가능하도록 해준다.
# vi /var/lib/pgsql/data/pg_hba.conf
82, 84번째
ident
를md5
로 변경함.... 82 | host all all 127.0.0.1/32 md5 ... 84 | host all all ::1/128 md5 ...
PostgreSQL 서버를 시작하여 사용가능하도록 해준다.
# systemctl enable postgresql # systemctl start postgresql
postgres
계정(PostgreSQL 관리자 계정)으로 변경한 후,# sudo -i -u postgres
deployer
계정(PostgreSQL용)을 생성한 후 데이터베이스까지 생성한다. (이 때deployer
계정에는 데이터베이스 생성 권한을 부여한다.)# createuser --interactive # createdb [데이터베이스명]
NodeJs 설치
설치
# cd /usr/src # yum install -y wget # wget http://nodejs.org/dist/v0.10.30/node-v0.10.30.tar.gz # tar xzvf node-v* && cd node-v* # ./configure # make # make install
ImageMagick 설치 (시간 많이 걸리네~)
설치
# yum install -y tcl-devel libpng-devel libjpeg-devel ghostscript-devel bzip2-devel freetype-devel libtiff-devel # cd /usr/src # wget https://www.imagemagick.org/download/releases/ImageMagick-6.9.9-15.tar.gz # tar -xzvf ImageMagick-6.9.9-15.tar.gz # cd ImageMagick-6.9.9-15 # ./configure --prefix=/usr/local --with-bzlib=yes --with-fontconfig=yes --with-freetype=yes --with-gslib=yes --with-gvc=yes --with-jpeg=yes --with-jp2=yes --with-png=yes --with-tiff=yes # make # make install # convert --version # yum install -y ImageMagick-devel
deployer
계정 홈페이지의.bashrc
파일에 아래를 추가한다.# sudo -i -u deployer # vi ~/.bashrc export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig"
이제 다시,
root
계정으로 빠져나와# exit # ln -s /usr/local/include/ImageMagick/wand /usr/local/include/wand # ln -s /usr/local/include/ImageMagick/magick /usr/local/include/magick # ldconfig /usr/local/lib
서버에서 루비를 설치할 때 필요한 모듈을 추가로 설치한다.
# yum install -y readline-devel openssl-devel
배포
: 이후부터는 로컬에서 capistrano
로 배포작업을 수행한다.
프로젝트
Gemfile
파일에 추가해야할 최소한의 젬.gem 'capistrano-rbenv', '~> 2.0' gem 'capistrano-rbenv-install', '~> 1.2.0' gem 'capistrano-rails', group: :development gem 'capistrano3-puma' , group: :development gem 'capistrano-figaro-yml', '~> 1.0.2' gem 'capistrano-upload-config' gem 'capistrano3-nginx', '~> 2.0'
bundle install
명령을 실행한 후 프로젝트 배포 준비를 위해capify
명령을 실행한다.$ cap install ├── Capfile ├── config │ ├── deploy │ │ ├── production.rb │ │ └── staging.rb │ └── deploy.rb └── lib └── capistrano └── tasks
Capfile
은 다음과 같이 작성한다.# Load DSL and set up stages require 'capistrano/setup' # Include default deployment tasks require 'capistrano/deploy' # Include tasks from other gems included in your Gemfile require 'capistrano/rbenv' require 'capistrano/rbenv_install' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' require 'capistrano/nginx' require 'capistrano/puma' require 'capistrano/puma/nginx' require 'capistrano/figaro_yml' require 'capistrano/upload-config' # Load custom tasks from 'lib/capistrano/tasks' if you have any defined Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
정식 배포 전에
"staging 서버"
로의 배포환경 설정을 위해config/deploy/staging.rb
파일은 다음과 같이 작성한다.server '[server-ip]', user: 'deployer', roles: %w{app db web} set :nginx_server_name, '[domain-name]'
"staging 서버"
에서 사용할 환경변수와 값을 설정한다. 여기서는capistrano-figaro-yml
젬을 사용하였다. 우선config/application.yml
파일을 생성한 후 아래와 같이 작성한다.staging: DATABASE_USERNAME: [username] DATABASE_PASSWORD: [password] SECRET_KEY_BASE: 9cf54********ee00f66162b7f0ce12********789b5ce782a8b1fb95d********06d78608eb9bc*********2abb
주의 : 이 파일(
config/appliation.yml
)은 소스관리에 포함해서는 안된다. 따라서.gitignore
파일에 추가한다. 또한Capfile
에 이미 아래와 같이 추가한 바 있다.require 'capistrano/figaro_yml'
staging
서버로config/application.yml
파일을 업로드하기 위해서 다음과 같이 명령을 실행한다.$ cap staging setup
database.yml
과secrets.yml
파일에는 보안상 공개해서는 안되는 정보가 들어 있기 때문에 직접 서버로 업로드하지 않고 로컬에 있는 파일을 서버로 직접 업로드하기 위한 젬을 사용한다. 따라서 아래와 같이 명령을 실행하여database.staging.yml
,secrets.staging.yml
파일을 생성하고 각각 아래와 같이 작성한다.$ cap staging config:init
config/database.staging.yml
파일은 다음과 같이 작성한다.default: &default adapter: postgresql encoding: unicode pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> staging: <<: *default database: [database-name] username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>
config/secrets.staging.yml
파일은 다음과 같이 작성한다.staging: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
이제 이 두 파일은 아래의 명령을 통해서 직접 서버로 업로드되면
linked_files
로 등록된다.$ cap staging config:push
config/deploy.rb
파일은 다음과 같이 작성한다. (디폴트 설정은 생략하였다)lock '3.6.1' set :application, '[project-name]' set :repo_url, 'git@bitbucket.org:[git-account]/[project-name].git' set :migration_role, :app set :rbenv_type, :user set :rbenv_ruby, File.read('.ruby-version').strip set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec" set :rbenv_map_bins, %w{rake gem bundle ruby rails} set :rbenv_roles, :all # default value set :deploy_to, '/home/[deploy-account]/apps/[project-name]' set :pty, true set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/secrets.yml') set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'public/system') before 'deploy:check:linked_files', 'config:push' before 'deploy:starting', 'figaro_yml:setup' after 'figaro_yml:setup', 'puma:nginx_config' namespace :deploy do after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end end
위의 코드 중의
[...]
부분은 각자의 상황에 맞는 값으로 변경한다.(5군데)실제
staging
서버로 배포 명령은 실행하는 순서는 다음과 같다.$ cap staging doctor $ cap staging deploy:check $ cap staging deploy
이후 코드 수정후 반복해서 배포할 때는 마지막에 실행한 명령을 반복해서 실행하면 된다.
가끔 nginx 설정 파일에 대한 퍼미션 오류가 나는 경우가 있는데, 이 때는 서버로 접근하여 아래의 명령을 실행하면 해결된다.
# setenforce permissive
부록
: 아래의 설치는 옵션이다.
Sendmail 설치
참고
설치
# yum install sendmail sendmail-cf m4
Git 업그레이드하기
참고
설치 및 업그레이드하기
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils # cd /usr/src # wget https://www.kernel.org/pub/software/scm/git/git-2.11.0.tar.gz # tar xzf git-2.11.0.tar.gz # cd git-2.11.0 # make prefix=/usr/local/git all # make prefix=/usr/local/git install # echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc # source /etc/bashrc
설치 시점에서의 최신 버전으로 파일명을 변경하면 된다.
기존의
git
은 삭제한다.# yum remove git # yum clean all
git version
명령을 실행하여 최신 버전을 확인한다. 이전 버전으로 표시될 경우에는 다시 로그인하면 제대로 반영된다.git 설정
: 최초 설치시 다음과 같이 사용자 정보를 설정한다.# git config --global user.name "Your Name" # git config --global user.email "you@example.com" # git config -l
CentOS 7 시스템 시간의 동기화
서버시간과 실제시간을 동기화 해 주어야 시간이 제대로 표시된다.
참고
우선 ntp를 설치한다..
# yum install ntp
방화벽을 설치한다.
# firewall-cmd --add-service=ntp --permanent
방화벽을 다시 로드한다.
# firewall-cmd --reload
ntp 서비스 시작
# systemctl start ntpd
시스템 재부팅 후에도 자동으로 시작할 수 있도록 한다.
# systemctl enable ntpd
이제 터미널 에서
date
명령을 실행하여 로컬 시간이 제대로 설정되었는지 확인한다.# date