Ruby2.0.0 を CentOS6.4, OS X に 入れてみる
仕事ではここ数年ずっとPHPなので, プライベートではRubyにしようと.
PHPは別に嫌いじゃないですが, Rubyは書いてて気持ちがいいですね.
ということで, そろそろ2.0に移行しようと思って, 久々に環境構築をしたのでその備忘録です.
1. 前提条件
2. rbenv + ruby-build + ruby のインストール
OS X (Mountain Lion) の場合
(1) rbenv + ruby-build
$ brew update $ brew upgrade $ brew install rbenv ruby-build $ cat << EOF >> ~/.zshrc export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)" EOF $ source ~/.zshrc
(2) ruby を入れるのに必要なパッケージをインストール
$ brew install openssl $ brew link openssl --force $ brew install readline $ brew link readline --force $ brew install libyaml $ brew link libyaml --force
- --force を付けないと warning が出たのでつけています
(3) ruby 2.0 を インストール
$ ruby-build --definitions : : 1.9.3-rc1 2.0.0-p195 2.1.0-dev : : $ CONFIGURE_OPTS="--with-opt-dir=/usr/local/" rbenv install 2.0.0-p195 $ rbenv rehash $ rbenv versions * system (set by /Users/kopug/.rbenv/version) 2.0.0-p195 $ rbenv global 2.0.0-p195 $ ruby -v ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]
CentOS 6.4 の場合
(1) yum で 依存パッケージをインストール
$ sudo yum -y install git zlib zlib-devel readline readline-devel openssl openssl-devel curl curl-devel
(2) rbenv + ruby-build
# cd /usr/local # git clone git://github.com/sstephenson/rbenv.git rbenv # git clone https://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
# cat << EOF >> /etc/profile.d/rbenv.sh export RBENV_ROOT="/usr/local/rbenv" export PATH="/usr/local/rbenv/bin:$PATH" eval "$(rbenv init -)" EOF
# source /etc/profile.d/rbenv.sh
(3) ruby 2.0 を インストール
# rbenv install --list : : 1.9.3-rc1 2.0.0-p353 2.1.0-dev : : # rbenv install 2.0.0-p353 # rbenv rehash # rbenv versions * 2.0.0-p353 (set by /usr/local/rbenv/version) $ rbenv global 2.0.0-p353 $ ruby -v ruby 2.0.0-p353 (2013-05-14 revision 40734) [x86_64-linux]
3. Bundler の インストール
※ ~/.gemrc にある "custom_shebang directive" を削除してから以下を実行すること(途中でエラーになるため)
$ rbenv exec gem update --system $ rbenv exec gem install bundler $ rbenv exec gem install rbenv-rehash $ rbenv exec gem list *** LOCAL GEMS *** bigdecimal (1.2.0) bundler (1.3.5) io-console (0.4.2) json (1.7.7) minitest (4.3.2) psych (2.0.0) rake (0.9.6) rdoc (4.0.0) test-unit (2.0.0.0) $ rbenv exec gem which bundler /Users/kopug/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/bundler-1.3.5/lib/bundler.rb
4. Railsのローカルインストール及びプロジェクト作成
$ cd ~/Work/projects $ cat << EOF > Gemfile source "http://rubygems.org" gem "rails", "バージョン(省略可能. その場合は最新版)" EOF
一時的にrailsプロジェクトを作成するために --path で指定した箇所に railsで必要なgemをインストール
$ bundle install --path vendor/bundle $ bundle list
プロジェクト名は example(適当), --skip-bundle を指定しておかないと, project作成時に勝手に bundle install が走って, global 環境にgemがインストールされてしまう
$ bundle exec rails new example --skip-bundle
プロジェクトが作成できたら, 以下は不要なので削除
$ rm -rf Gemfile Gemfile.lock .bundle vendor
ここでプロジェクトに必要なgem をプロジェクト配下にインストールをする
$ cd example/ $ bundle install --path vendor/bundle
git の管理からgemを外す
$ echo '/vendor/bundle' >> .gitignore
Rails Server 起動
$ bundle exec rails server
Ruby on Rails(RoR) 開発環境を構築する
久々の更新です。(毎回言っているが…^_^;)
Railsの開発環境を急遽構築したという事もあり, 備忘録がてらに残します.
1. 最新のパッケージに更新をする
$ sudo yum -y update
2. 必要なパッケージをインストールしておきます
$ sudo yum -y install gcc kernel-devel zlib-devel openssl-devel readline-devel curl-devel libyaml-devel sqlite-devel
3. Rubyのインストールをする
普段ならrpmでインストールをしようとするのですが, ebenvを使ってrubyのバージョン(環境)管理をします.
$ sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/share/rbenv $ vi /etc/profile.d/rbenv.sh
export PATH="/usr/local/share/rbenv/bin:$PATH" export RBENV_VERSION="1.9.3-p327" export RBENV_DIR=/usr/local/share/rbenv export RBENV_ROOT=/usr/local/share/rbenv eval "$(rbenv init -)"
$ source /etc/profile.d/rbenv.sh
zsh を使っていると /etc/profile.d 配下を読み込まないので,以下を /etc/zprofileに追加
for i in /etc/profile.d/*.sh ; do [ -r $i ] && source $i done
ruby-build をインストールして, rubyをいれる
$ sudo git clone git://github.com/sstephenson/ruby-build.git /usr/local/src/ruby-build $ cd /usr/local/src/ruby-build $ sudo ./install.sh
rubyをインストール
$ sudo rbenv install 1.9.3-p327 $ sudo rbenv rehash $ sudo rbenv global 1.9.3-p327 $ sudo gem install bundler
$ sudo gem install rails unicorn
1. さくらVPS CentOS6.2で基本設定をする
久々の更新です。
最近サーバ構築するのもスクリプトを流して終了…というのが多かったですが、久々に手動で構築したので備忘録として残します。
2. etckeeper を入れて /etc配下をgitで管理
epel リポジトリが初めから入っていたのですんなり入った。
# yum -y install etckeeper # etckeeper init
3. 作業用ユーザの作成
rootで毎回作業するのは怖いので、作業用のユーザを作成して sudo権限を付けておく
# adduser kopug # passwd kopug # usermod -G wheel kopug
# visudo
# 以下のコメントを外す ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
作業用ユーザのSSH公開鍵を置いておく
※ ここからは作業用ユーザで繋ぎ直してから作業を行う
4. SSHの設定
4-1) デフォルトのポート番号を変更
$ sudo sed -i 's/^#Port 22/Port 10022/' /etc/ssh/sshd_config
4-2) rootでの接続をNG
$ sudo sh -c 'echo "PermitRootLogin no" >> /etc/ssh/sshd_config'
4-3) パスワードなしでのログインNG
$ sudo sh -c 'echo "PermitEmptyPasswords no" >> /etc/ssh/sshd_config'
4-4) 鍵認証必須
$ sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
4-5) 設定反映
$ sudo /sbin/service sshd restart
※ ~/.ssh/authorized_keys に公開鍵を設定しておくこと
5. iptablesの設定
管理用のポートと, sshとweb以外は閉じておく
# /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH, HTTP -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
あとはiptablesを再起動させ、デフォルト起動するようにしておく。
$ sudo /sbin/service iptables restart $ sudo /sbin/chkconfig iptables on
6. root宛のメールを受け取るようにする
メールアドレスの部分は置き換えてください(^_^;
$ sudo sudo sed -i '/^root:/d' /etc/aliases $ sudo sh -c "echo 'root: user@example.com' >> /etc/aliases" $ sudo newaliases
6. パッケージを最新版にする
$ sudo yum upgrade -y
7. etckeeper でcommitをしてサーバを再起動
$ sudo etckeeper commit $ sudo reboot
さくらVPSのカスタムOSインストールでUbuntuを入れてみる #1
今までCentOSを使っていたけど、2011年からはUbuntuを使うことにする。
※ Mac OS X(10.6.6)のChrome(8.0.552.237)を使ってインストールをしようとしたところ、
VNCコンソールが正常に起動しなかったため、Firefox(3.6.13)を使用しました。(´・ω・`)
さくらインターネットVPSのコントロールパネルより、
OS再インストール > カスタムOSインストールへ のリンクを押下する。
1. この画面でOSの選択が可能になるので、ここでは"Ubuntu 10.04 amd64"を選択し、確認ボタンを押下
2. IPアドレス等の情報がでてくるので閉じないようにし、VNCコンソールを起動する
3. 以下のマニュアルを参考にしながらインストールを行う
カスタムOSインストールガイド : Ubuntu 10.04
4. インストールが完了したら、コントロールパネルよりサーバを起動させ、Ubuntuのバージョンを10.10にアップグレードする
$ sudo sed -i 's/^Prompt=lts/Prompt=normal/g' /etc/update-manager/release-upgrades $ sudo do-release-upgrade $ sudo reboot
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 10.10 Release: 10.10 Codename: maverick
5. バージョンが10.10 になっているのを確認したら、パッケージのフルアップデートをします。
$ sudo aptitude full-upgrade $ sudo aptitude install build-essential
$ sudo locale-gen ja_JP.UTF-8 $ sudo /usr/sbin/update-locale LANG=ja_JP.UTF-8
7. sshの設定
$ mkdir ~/.ssh $ vi ~/.ssh/authorized_keys "自分の公開鍵を貼り付ける" $ chmod 600 ~/.ssh/authorized_keys $ chmod 700 ~/.ssh
$ sudo vi /etc/ssh/sshd_config
Port 22** PermitRootLogin no PasswordAuthentication no
$ sudo /etc/init.d/ssh restart
8. 適当に見繕ってパッケージをインストールする
$ sudo aptitude install zsh git-core git-svn subversion vim screen
9. iptables の設定
$ sudo ufw allow 22** <- ssh port $ sudo ufw allow 80 $ sudo ufw default deny $ sudo ufw enable $ sudo iptables -L <- ポリシーの確認
10. shellの変更
$ chsh -s /usr/bin/zsh
後は自分の好みで、.screenrc .vimrc .zshrc を配備する感じ。
参考
symfony で普段使っているpluginをまとめてみた
この記事はSymfonyアドベントカレンダー2010の19日目です
1. sfWebBrowserPlugin - RESTful APIを利用するならお手の物。HTTP通信なら完全お任せ!
READMEを見ると利用方法が事細かに書かれているので非常に分かりやすいですね。
このpluginでは 3種類のインターフェイスをアダプターという形で用意しています。
- sfCurlAdapter
- sfFopenAdapter
- sfSocketsAdapter
どれを利用しても良いのですが、Forward Proxy経由でHTTPリクエストを送りたい事があるため、sfCurlAdapterを利用しています。
(例)
<?php $b = new sfWebBrowser(array(), 'sfCurlAdapter', array('httpproxytunnel' => 1, 'proxy' => 'http://proxy.example.com:8080', 'proxyport' => '8080', ) );
クラウド環境を利用していて、webサーバがオートスケールで増えてくれるのはいいけれども、振られるグローバルIPが何になるのか分からない場合などに使えますね!
※1. IPアドレスでの通信制限が無い場合は、気にする必要はないです。
※2. ロードバランサーがNATしてくれている場合は、気にしなくてもOK
2. sfDoctrineMasterSlavePlugin - DBのReplicationをするならまずこれでしょう!
Symfonyアドベントカレンダー2010の12日目にvectorxenonさんがsfDoctrineMasterSlavePluginの事を書かれております。
このpluginで何が1番嬉しかったかというと、マスターの分散が出来ることです。
# databases.yml all: # db1 connections db1_master: class: sfDoctrineDatabase param: dsn: mysql:dbname=db1;host:db1-master.example.com username: root password: ~ group: db1 db1_slave: class: sfDoctrineDatabase param: dsn: mysql:dbname=db1;host:db1-slave.example.com username: root password: ~ group: db1 # db2 connections db2_master: class: sfDoctrineDatabase param: dsn: mysql:dbname=db2;host:db2-master.example.com username: root password: ~ group: db2 db2_slave: class: sfDoctrineDatabase param: dsn: mysql:dbname=db2;host:db2-slave.example.com username: root password: ~ group: db2
selectの負荷はSlaveサーバを増やすことによって解決できますが、
更新系処理が多くなってくる場合、それでは対応できません。
上記のようにMaster and Slaveサーバのグループを用意し、schema.ymlで対応するconnectionを指定すればOKです。
# schema.yml User: connection:db1 columns: name: { type: string(255), notnull: true } LegacyUser: connection:db2 columns: name: { type: string(255), notnull: true }
3. sfAdminDashPlugin - 手軽にシャレオツ管理画面を提供したい場合に!
README に設定方法が書かれていますが、id:ken39argさんがsfAdminDashPluginがかなりいい件についてという記事で、ハマりどころも合わせて書かれています。
WEBサービスを作る上で管理画面って結構後回しにされがちですが、このpluginで手軽にシャレオツな管理画面が作れるので重宝しています。
4. sfTaskExtraPlugin - pluginを簡単に作るためのplugin
symfonyで幾つかProjectの開発をしていくと、必ずProject間で共通で利用したいコードが出てくると思います。
その時にplugin化をしたくなるのですが、pluginを開発する上で簡単で手軽にテストコードも準備できる枠組みを提供してくれるのがsfTaskExtraPluginです!
まずインストール
$ symfony plugin:install sfTaskExtraPlugin
これでREADMEに書かれているタスクを利用する事ができるようになりますが、特によく使うのは以下です。
- generate:plugin: pluginのスケルトンを吐き出す
- generate:plugin-module: モジュールを含むpluginのスケルトンを吐き出す
- plugin:package: 作成したpluginをPEARパッケージにしてくれます
symfony の pluginはPEARパッケージで管理しているので、これを使うといちいちpaclage.xmlを作成する必要がなくなります。
まぁそれも便利なのですが、一番素晴らしいのがTDDでの開発がすごくしやすくなることです。
実際にmyPluginを作成してみます。
$ symfony generate:plugin myPlugin
これだけで以下のスケルトンができます。
plugins/myPlugin |-- LICENSE |-- README |-- config | `-- myPluginConfiguration.class.php |-- lib |-- package.xml.tmpl `-- test |-- bin | `-- prove.php |-- bootstrap | |-- functional.php | `-- unit.php |-- fixtures | `-- project | |-- apps | | `-- frontend | | |-- config | | | |-- app.yml | | | |-- cache.yml | | | |-- factories.yml | | | |-- filters.yml | | | |-- frontendConfiguration.class.php | | | |-- routing.yml | | | |-- security.yml | | | |-- settings.yml | | | `-- view.yml | | |-- i18n | | |-- lib | | | `-- myUser.class.php | | |-- modules | | `-- templates | | `-- layout.php | |-- cache | |-- config | | |-- ProjectConfiguration.class.php | | |-- properties.ini | | `-- rsync_exclude.txt | |-- data | | `-- fixtures | | `-- fixtures.yml | |-- lib | | `-- form | | `-- BaseForm.class.php | |-- log | |-- plugins | |-- symfony | |-- test | | |-- bootstrap | | | |-- functional.php | | | `-- unit.php | | |-- functional | | `-- unit | `-- web | |-- css | | `-- main.css | |-- images | |-- js | |-- robots.txt | `-- uploads | `-- assets |-- functional `-- unit
上記を見てわかるとおり、殆どがテストのためのディレクトリ、ファイルになります。
※ plugin:packageをすると上記のテストディレクトリは除外されてパッケージされます。
テストコードの書き方は以下のドキュメントに詳しく書かれていますので、これでいつでもplugin開発ができますね!
5. sfMobileJPlugin - ガラケー対応サイトを作るのなら・・
手前味噌で恐縮ですが、仕事柄ガラケーのサイトを開発することがあるので、ガラケーに特化したpluginを公開しております。
使い方はREADMEにも書いていますが、簡単にご紹介すると、現在公開しているバージョンで出来ることは以下の2つです。
- 通常のテンプレートとガラケー共通テンプレートを分けることが可能
- 個体識別番(imodeID, UID and EZ番号)の制御
- ページ全体、個別でUIDの通知条件の必須を選択することが可能
はい。それだけです。(ぉぃ)
一応それ以外にも細かなUtil classもあったりしますが、backendではNet_UserAgent_Mobileを使用しているので、端末の情報取得系はそちらが使えます。
現在公開準備中ではありますが、絵文字処理、携帯メール処理も上記pluginに含めれるようにコツコツと開発をしております。(^_^;
CentOS5.5 x86_64 で 最新のnginx を rpmbuildする
EPELで実はnginxのrpmがあるんだけども、versionが0.6で止まっている。
なので、EPELからsrc.rpmを落としてきてそいつに最新のnginxをつっこんでbuildした。
EPELからnginxのsrc.rpmをダウンロードし、インストールする
# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/SRPMS/nginx-0.6.39-5.el5.src.rpm # rpm -i nginx-0.6.39-5.el5.src.rpm
最新のnginxをDLし、SPECファイルを編集する
# cd /usr/src/redhat/SOURCES # wget http://nginx.org/download/nginx-0.8.50.tar.gz # cd ../SPECS/ # vi nginx.spec
versionを変更する
Version: 0.8.50
patchを当てないようにする
#Patch0: nginx-auto-cc-gcc.patch #Patch1: nginx-cve-2009-3555.patch #%patch0 -p0 #%patch1 -p0
LANG=C だとmakeでこけてしまうので、LANGを上書きする
%build # nginx does not utilize a standard configure script. It has its own # and the standard configure options cause the nginx configure script # to error out. This is is also the reason for the DESTDIR environment # variable. The configure script(s) have been patched (Patch1 and # Patch2) in order to support installing into a build environment. export LANG='ja_JP.UTF-8' <- 追加 export DESTDIR=%{buildroot}
TODO: rpmの仕様なのか、configureする前にLANG=Cにするみたいなので、上書きしているけど対応方法が強引すぎるため要調査
エラー内容は以下
make -f objs/Makefile make[1]: Entering directory `/usr/src/redhat/BUILD/nginx-0.8.50' gcc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ src/core/nginx.c cc1: warnings being treated as errors src/core/nginx.c: In function 'ngx_set_user': src/core/nginx.c:1101: warning: unused parameter 'cmd' src/core/nginx.c: In function 'ngx_set_env': src/core/nginx.c:1164: warning: unused parameter 'cmd' src/core/nginx.c: In function 'ngx_set_priority': src/core/nginx.c:1194: warning: unused parameter 'cmd' src/core/nginx.c: In function 'ngx_set_cpu_affinity': src/core/nginx.c:1234: warning: unused parameter 'cmd' make[1]: *** [objs/src/core/nginx.o] Error 1 make[1]: Leaving directory `/usr/src/redhat/BUILD/nginx-0.8.50' make: *** [build] Error 2 + mv nginx-upstream-fair/README nginx-upstream-fair/README.nginx-upstream-fair mv: cannot stat `nginx-upstream-fair/README': No such file or directory + exit 0
パッケージにファイルが含まれてないといわれるので、無視するようにする
%define _unpackaged_files_terminate_build 0
※ %filesに含めたほうがいいかも。