*

CentOS 7 で ruby on rails 環境構築

公開日: : 投稿者:raru apache, Linux, サーバ

気づいたらCentOS7が出てから時間が立っていました。
そろそろ新しく建てるサーバはCentOS7が基本となってくるのでしょうか。
systemtclコマンドやfirewalldとかが利用されていて、6から7への移行はやや慣れが必要そうです。

今回はAWS(amazon web services)にCentOS7のRuby on Rails環境をつくってみました。
ただし今回はrailsについてはアプリケーションのGemfileからbundle installしています。

firewalld設定

CentOS6以前はfirewallはiptablesで設定されていましたが、CentOS7からはfirewalldというiptablesのwrapperを利用して設定していくようです。
firewalldを殺してiptablesでの設定も可能ですが、今後firewalldが一般化することを考えるとこちらに慣れておいたほうが良さそうです。
ちなみにPidoraでもfirewalldが活用されています。
過去の記事で私はよくわかっておらずfirewalldを殺していました。

またAWSのCentOS7のパッケージではログインはcentosというユーザで可能です。

# 何故かfirewalldが見当たらなかったのでインストール
yum install firewalld

# CentOS6以前でいうところのservice firewalld start
systemctl start firewalld

# firewalldでは設定ファイルを活用して制限をかけるため、自分用のファイルを作成	
cp /etc/firewalld/zones/public.xml /usr/lib/firewalld/zones/mywall.xml
vi /usr/lib/firewalld/zones/mywall.xml
cat /usr/lib/firewalld/zones/mywall.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>MyWall</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 accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
</zone>

# リロードをしないと新たに追加した設定ファイルが読み込まれない
firewall-cmd --reload

# デフォルトのゾーンとして新規に作成したものを設定
firewall-cmd --set-default-zone=mywall

# firewalldはNICごとにfirewallの設定を行う為、今アクティブなNICを設定
# permanentを指定することで永続的に設定を有効にする
firewall-cmd --change-interface=enp0s3 --permanent

# 設定ができているのか確認
firewall-cmd --list-all

# CentOS6までの service firewalld restart
systemctl restart firewalld

# CentOS6までの chkconfing firewalld on
systemctl enable firewalld

上記のような感じで設定を行います。
confファイルに指定しているsshなどのserviceファイルは「/usr/lib/firewalld/services/」に置いてあるので、どのようになっているのか気になる場合にはファイルを見てみるとなんとなくわかります。

アップデート

firewallも設定したのでとりあえずupdateをかけます。
yumfastest-mirrorは最初から入ってました。

yum -y update

rbenv インストール (globalにインストール)

rubyの環境をインストールしていきます。
今回はこのサーバに複数のアプリを載せるつもりがないので、グローバルに設定していきます。

# rbenv等入れるのに必要なためgcc, gitをインストール
yum install gcc git

# /usr/localにいろいろと展開するため移動
cd /usr/local

# rbenvインストール
git clone https://github.com/sstephenson/rbenv.git ./rbenv

# 全ユーザ共通で利用できるように/etc/profile.d/に設定を行うファイルを配置
vi /etc/profile.d/env.sh
cat /etc/profile.d/env.sh

export RBENV_ROOT="/usr/local/rbenv"
PATH="$RBENV_ROOT/bin:$PATH"
export PATH
eval "$(rbenv init -)"

# ruby-buildをpluginsフォルダにインストール
cd rbenv
mkdir plugins
cd plugins
git clone https://github.com/sstephenson/ruby-build.git ./ruby-build
cd ruby-build/
./install.sh

# ログインしなおして初期ファイル等読み込ませる
exit
sudo su -

./install.shが反応がなく実行できているんだかいないんだかよくわからなかったので、一旦ログアウトしてから入りなおしています。
入りなおしたところ、pathが通ってコマンドが利用できたのでたぶん反応していたのでしょう。

ruby2.1.3インストール

今回はruby2.1.3を利用するので、決め打ちでrubyをインストールしていきます。

# rubyのインストールに必要だったためインストール
yum install openssl-devel
rbenv install 2.1.3
rbenv global 2.1.3

Apache2.4系インストール

CentOS7からyumでインストールされるapacheは2.4系になったようです。
微妙に設定方法などが変わっており、翻弄されてしまっています。
なので、あまり綺麗な設定にはなっていないように思いますので参考程度に。

# apacheインストール
yum install httpd

# 設定ファイルのバックアップを作成
# linuxでは.orgとかをよく見るが、たぶんoriginalの略なんだろうと思ってる
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org

# /etc/httpd/conf.dに不要そうなファイルがたくさんあったのでバックアップ
mkdir -p /var/backup/httpd
mv /etc/httpd/conf.d/welcome.conf /var/backup/httpd/
mv /etc/httpd/conf.d/autoindex.conf /var/backup/httpd/
mv /etc/httpd/conf.d/userdir.conf /var/backup/httpd/

# 設定ファイルの修正
vi /etc/httpd/conf/httpd.conf
diff /etc/httpd/conf/httpd.conf.org /etc/httpd/conf/httpd.conf

86c86
< ServerAdmin root@localhost
---
> ServerAdmin admin@localhost
95a96
> 

124,128c125,129
< <Directory "/var/www">
<     AllowOverride None
<     # Allow open access:
<     Require all granted
< </Directory>
---
> #<Directory "/var/www">
> #    AllowOverride None
> #    # Allow open access:
> #    Require all granted
> #</Directory>
144c145
<     Options Indexes FollowSymLinks
---
>     Options FollowSymLinks
255,259c256,261
< <Directory "/var/www/cgi-bin">
<     AllowOverride None
<     Options None
<     Require all granted
< </Directory>
---
> ##### this project do not use cgi ####
> #<Directory "/var/www/cgi-bin">
> #    AllowOverride None
> #    Options None
> #    Require all granted
> #</Directory>
316c318,319
< AddDefaultCharset UTF-8
---
> #### when this setting is on, kill html meta charset ####
> # AddDefaultCharset UTF-8
353a357,358
> 
> ServerTokens ProductOnly

# 設定ファイルのチェック syntax okならok
apachectl configtest

# サーバ起動時に起動するように設定
systemctl enable httpd

# apacheを起動
systemctl start httpd

# 動作確認用にhtmlファイルを作成 
vi /var/www/html/index.html
cat /var/www/html/index.html

<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <h1>this is test</h1>
  </body>
</html>

# curlコマンドで問い合わせて返事を確認
curl http://localhost
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <h1>this is test</h1>
  </body>
</html>

ServerTokensのあたりが初期の設定ファイルの中になくなっていたり、細かいところが変わっています。
今回は必要なさそうな設定をコメントアウトしており、conf.dにいろいろと設定がありましたがそれも特に追加して設定すべきときにすればいいかなと考えて移動してあります。

Passengerのインストール

apacheを入れたので、次にpassegerをインストールします。
apacheのpassengerプラグインという方が正しいのかもしれません。
リクエストをapacheが裁いて、passengerがRoRを実行しているものだと勝手に思っています。

# なんとなくホームへ移動
cd

# ドキュメント等は不要なので省いてインストール
gem install --no-ri --no-rdoc passenger

# 一旦rehash
rbenv rehash

# oassengerをインストールするために必要なパッケージを入れる
yum install gcc-c++ curl-devel httpd-devel apr-devel apr-util-devel


# 以下3行は基本不要
# AWSのmicroインスタンスではメモリがなさすぎてインストールできないので領域を確保
dd if=/dev/zero of=/swap bs=1M count=1024
mkswap /swap
swapon /swap

# apacheのpassenger-moduleをインストール
passenger-install-apache2-module

Use <space> to select.
If the menu doesn't display correctly, press '!'
# 初期設定ではPythonも入っていたが不要なので解除
 ‣ ⬢  Ruby
   ⬡  Python
   ⬡  Node.js
   ⬡  Meteor

Please edit your Apache configuration file, and add these lines:

# 以下が設定なのでコピーを忘れずに
   LoadModule passenger_module /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53
     PassengerDefaultRuby /usr/local/rbenv/versions/2.1.3/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!



--------------------------------------------

Deploying a web application: an example

Suppose you have a web application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

# 以下がバーチャルホスト設定。控えるのを忘れずに
   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public    
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
         # Uncomment this if you're on Apache >= 2.4:
         #Require all granted
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/doc/Users guide Apache.html
  https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
https://www.phusionpassenger.com

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.


# passengerのインストールが完了したので、インストーラで出ていた設定を施していく	
vi /etc/httpd/conf.d/passenger.conf
cat 

LoadModule passenger_module /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53
  PassengerDefaultRuby /usr/local/rbenv/versions/2.1.3/bin/ruby
</IfModule>

# Virtualhost設定を行う。
# apache2.2と2.4では設定の仕方が微妙に違うらしく、警告が出るが一旦このまま書く
vi /etc/httpd/conf.d/passenger-virtualhost.conf
cat /etc/httpd/conf.d/passenger-virtualhost.conf

<VirtualHost *:80>
   ServerName yourapp.com
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /var/www/public    
   <Directory /var/www/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
      # Uncomment this if you're on Apache >= 2.4:
      #Require all granted
   </Directory>
</VirtualHost>

# apacheの設定ファイルを確認
apachectl configtest

この段階ではまだしっかりとした設定がされていない状態ですが、一旦設定ファイルを作っています。

MySQL(MariaDB)のインストール

CentOS7からは通常ではMySQLがインストールできません。
MariaDBというのが新しいものになるのですは、これはMySQLが元になっていてほぼほぼ同じものと思っても良いもののようです。
作っているのもMySQLの中の人らしいです。

ですので、込み入った設定をしない限りはMySQLと思って利用しても特に問題なさそうです。

# mysqlインストール
yum install mysql-server mysql-devel

# mysqlをインストールしてもmysqlのデーモンが見当たらなかったので名指しでmariadbをインストール
yum install mariadb mariadb-server
systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation

mysqlの細かい設定はここでは一旦省きます。

プロジェクトの取得

今回はリポジトリでプロジェクトを管理していたので、そこから取得を行い設定します。

# Bundlerのインストール
rbenv exec gem install bundler
rbenv rehash

# gitからプロジェクトとってきます
cd /var/www/
mkdir -p public/projects
cd public/projects
git clone your_repository.git
cd /var/www/public/projects/your_project

# ここでrails含めパッケージインストール
bundle install --path vendor/bundle
git config --global user.name "[admin]"
git config --global user.email "[admin@yourdomain.com]"
	
apachectl configtest

アプリケーション用 apache設定

プロジェクトを取得したので、改めてapacheを設定します。

# virtual-hostの設定を修正
vi /etc/httpd/conf.d/passenger-virtualhost.conf
cat /etc/httpd/conf.d/passenger-virtualhost.conf

# apache2.4ではNameVirtualHostは非推奨
NameVirtualHost ***.***.***.***

<VirtualHost ***.***.***.***:80>
   ServerName yourapp.com
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /var/www/public/projects/your_project/public    
   <Directory /var/www/public/projects/your_project/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
      # Uncomment this if you're on Apache >= 2.4:
      Require all granted
   </Directory>
</VirtualHost>

# passengerの設定を修正
vi /etc/httpd/conf.d/passenger.conf
cat /etc/httpd/conf.d/passenger.conf

#LoadModule passenger_module /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so
LoadModule passenger_module modules/mod_passenger.so

<IfModule mod_passenger.c>
  PassengerRoot /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53
  PassengerDefaultRuby /usr/local/rbenv/versions/2.1.3/bin/ruby
</IfModule>

RailsEnv development

# apacheを再起動
systemctl restart httpd

# firewallにhttpでの通信を許可する設定serviceを追加
firewall-cmd --add-service=http

# apacheをプロジェクトフォルダのオーナーに設定
chown apache:apache -R /var/www/public

# このあたりでアプリが動かず試行錯誤をして結果以下のようになる	
# therubyracerだけではCentOS7とversion指定の関係かうまく動かないので
# 本家が推奨しているnodeを突っ込む。
# nvmなど入れてもいいが、面倒だったのでyum
yum install epel-release
yum install nodejs npm

# 以下の設定はnode入れても動かないので他サイトを参考に設定
# 本来は不要。しかし以下の設定を行わない場合はpassenger.confが少し変わる
cp /usr/local/rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so /usr/lib64/httpd/modules
restorecon -RFv /usr/lib64/httpd/modules/mod_passenger.so 

# どうやらpassenger関係はSELinuxが悪さをするらしく、自分で設定を頑張ったほうがいいが
# 閉じたテスト機だったため妥協
setenforce 0

このあたりで少しバタバタしてしまったので、煩雑になっているがpassengerのラスボスはどうやらSELinuxらしい。
本番環境であればSELinuxを無効にするのは好ましくないため、がんばって設定したほうがいいと思う。

わりと世のサーバ設定系の参考サイトでは真っ先にSELinuxを殺していますが、SELinuxのおかげで侵入されたけど悪さされずに済んだ、みたいなこともあるのでSELinuxをとりあえず殺す運用はやめたほうがいいと思う。
今回は殺しましたが……

ベーシック認証設定

一応awsは外に公開されているサーバなので、ベーシック認証をかけます。

# ベーシック認証のID/PWを作成します
htpasswd -c -b /etc/httpd/conf/.htpasswd login_id password

# ベーシック認証用に設定を行う。
vi /etc/httpd/conf.d/passenger-virtualhost.conf
cat /etc/httpd/conf.d/passenger-virtualhost.conf

NameVirtualHost ***.***.***.***

<VirtualHost ***.***.***.***:80>
   ServerName yourapp.com
   # !!! Be sure to point DocumentRoot to 'public'!
   DocumentRoot /var/www/public/projects/your_project/public    
   <Directory /var/www/public/projects/your_project/public>
      # This relaxes Apache security settings.
      AllowOverride all
      # MultiViews must be turned off.
      Options -MultiViews
      # Uncomment this if you're on Apache >= 2.4:
      Require all granted
   </Directory>

   <Location />
     AuthType Basic
     require valid-user
     AuthName "besic auth"
     AuthUserFile /etc/httpd/conf/.htpasswd
  </Location>
</VirtualHost>

# apache再起動
systemctl restart httpd

こんな感じでできます。

結構雑でしたが、このようにすると一通り動きますたぶん。
やはりOSのメジャーバージョンが上がると結構変わりますね。
特に6から7へはいろいろと細かいところで変更が入っているので、時間がかかります。

あとapacheとphpでwordpress動かしてますが、メモリをもりもり食べていくため次回はその対処用設定を調べて設定した手順でも載せようと思います。

VPSなりサーバ借りるなりするときはメモリ2GB以上の借りた方が良さそうです。

関連記事

no image

個人でのProxyサーバ利用用途

Proxyサーバを建てたいということで、利用用途を考えていました。 まずサイト高速化であったり冗長

記事を読む

no image

RaspbianのZabbix ServerにZabbix Agentをインストール

前回の記事でRaspbianにZabbixサーバをインストールしてみました。 今回はzabbi

記事を読む

no image

Raspbianをwheezyからjessieにアップグレード

2015/04頃にdebianのバージョン8 jessieがリリースされたようです。 それに伴い、

記事を読む

no image

RaspberryPi2のFedora22にOpenVPN構築

コツコツと以前購入してoverclockしたraspberry pi2にOpenVPNを構築していま

記事を読む

no image

RedmineからsSMTPでメールを送信

Redmineの管理画面にアクセスしたところメール通知設定は所定のファイルを編集しないとできないよう

記事を読む

no image

Raspberry Pi/ラズベリーパイ を注文しました

Linuxの学習用途にお勧めされているRaspberry Piを注文しました。 ラズベリーパイ

記事を読む

no image

RaspbianにRedmine3を導入

普段Zabbixを入れて運用しいてるRaspbianにRedmineも入れてみました。 ややスペッ

記事を読む

no image

Raspbianでメール送信 ssmtp編

Raspbianで監視などをおこなっているとメールが送信したくなります。 とりあえず何かと管理用に

記事を読む

no image

apache2.4でBOTからのアクセスを排除

私は何か数字が動くものを見るのが好きでgoogle analyticsのリアルタイム情報をよく見てい

記事を読む

no image

CentOSにSSH鍵認証で接続するGitリポジトリを作成

今回友人と共同開発を行なうと思い、ざっくりとGitサーバを建ててみました。 私はSVNの方が好きな

記事を読む

Comment

  1. パイセン より:

    エンタープライズ向けのインフラは、通信のセキュリティ周りは大抵ネットワーク機器で担保するので、大概SELinuxやiptablesは使いません。
    ご参考までに。

    • raru より:

      なるほど、ネットワーク機器で対応しているものなのですね。
      お恥ずかしながら知らなかったです!

      ご指摘くださりありがとうございます。
      後日記事のupdateを行います!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

PAGE TOP ↑