RDSからEC2のmysqlに移す

RDSは便利ですが、高かったです。

EC2のMySQLのバックアップ

RDS運用の前はEC2のMySQLで運用していたので、古いですが現状のEC2のMySQLを一応バックアップしておきます。

$ sudo mysqldump --databases hogehoge --single-transaction --order-by-primary -r backup.sql -u root -p

EC2のMySQLのデータベースを空にする

$mysql -u root -p
mysql> use hogehoge;
mysql> show tables;
mysql> truncate table hoges;

RDSからEC2のMySQLにインポートする

$ sudo mysqldump -u <RDS_user_name> -p<RDS_password> --port=3306 --host=hostname --single-transaction --compress --order-by-primary -v --databases hogehoge  | mysql -u <local_user> -p<local_password>

Amazon Linux – PostgreSQL・Nginx・FuelPHP


インストール

参考:
Amazon Linux AMIにpostgresqlをインストールする
チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール

yumをアップデートして、phpとgitとvimとnginx入れた。アパッチとMySQLも入れた。

sudo yum update -y
$ sudo yum install -y httpd24 php56 mysql55-server php56-mysqlnd
$ sudo yum install -y git
$ sudo yum install -y vim
$ sudo yum install -y nginx

postgresql入れた。

$ sudo yum install -y postgresql
$ sudo yum install -y postgresql-server postgresql-libs php-pgsql

エラーでた

$ sudo yum install -y postgresql-server postgresql-libs php-pgsql                                                                   
読み込んだプラグイン:priorities, update-motd, upgrade-helper
パッケージ postgresql92-libs-9.2.15-1.57.amzn1.x86_64 はインストール済みか最新バージョンです
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php-pgsql.x86_64 0:5.3.29-1.8.amzn1 を インストール
--> 依存性の処理をしています: php-pdo(x86-64) = 5.3.29-1.8.amzn1 のパッケージ: php-pgsql-5.3.29-1.8.amzn1.x86_64
---> パッケージ postgresql92-server-compat.x86_64 0:9.2.15-1.57.amzn1 を インストール
--> 依存性の処理をしています: postgresql92-server(x86-64) = 9.2.15-1.57.amzn1 のパッケージ: postgresql92-server-compat-9.2.15-1.57.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ php-pdo.x86_64 0:5.3.29-1.8.amzn1 を インストール
--> 依存性の処理をしています: php-common(x86-64) = 5.3.29-1.8.amzn1 のパッケージ: php-pdo-5.3.29-1.8.amzn1.x86_64
---> パッケージ postgresql92-server.x86_64 0:9.2.15-1.57.amzn1 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ php-common.x86_64 0:5.3.29-1.8.amzn1 を インストール
--> 衝突を処理しています: php56-common-5.6.19-1.123.amzn1.x86_64 は php-common < 5.5.22-1.98 と衝突しています
--> 衝突を処理しています: php56-pdo-5.6.19-1.123.amzn1.x86_64 は php-pdo < 5.5.22-1.98 と衝突しています
--> 依存性解決を終了しました。
エラー: php56-pdo conflicts with php-pdo-5.3.29-1.8.amzn1.x86_64
エラー: php56-common conflicts with php-common-5.3.29-1.8.amzn1.x86_64
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

php56と指定しないといけないっぽい。

$ sudo yum install -y postgresql-server postgresql-libs php56-pgsql

これで必要なの入った。

postgreSQLの設定する

postgresユーザにパスワード設定

$ sudo passwd postgres

postgresユーザに切り替える

$ su - postgres

基本データベース生成とサービス開始

$ initdb --encoding=UTF8 --no-locale
$ pg_ctl start
$ exit
$ chkconfig postgresql on

データベース作成する

$ psql -U posgres
postgres=# create database hoge;

NginxでPHP使えるようにする

参考:nginxでphpを使う(CentOS6.5)

php-fpmをインストールする

$ sudo yum install -y php56-fpm

php-fpmの設定をする

下記のwww.confのuserとかgroupがapacheになっているので、nginxに変更します。

$ sudo vim /etc/php-fpm.d/www.conf

NginxでFuelphpが動くようにする

下記、nginx.confを修正していく。

$ sudo vim /etc/nginx/nginx.conf

下記箇所を、/usr/share/nginx/hoge/publicとかにする。

root         /usr/share/nginx/html

参考:http://fuelphp.jp/docs/1.8/installation/instructions.html
下記のように変更する。

location / {
    index index.php;
    try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param FUEL_ENV "production";
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

nginxとphp-fpmを再起動する

$ sudo service php-fpm restart
$ sudo service nginx restart

FuelPHPをcloneする

FuelPHPはローカルで作ってるやつをcloneする。

$ cd /usr/share/nginx/
$ sudo git clone https://hogehoge.git

FuelPHPのcomposer installする

$ cd /usr/share/nginx/hoge
$ ./composer.phar install

phpPgAdminインストール

参考:phpPgAdminのインストール – CentOS6.5(Vagrant)

とりあえず、ローカルで上記サイトに記載のURLから、ダウンロードして、展開して、gitリポジトリに追加して、pullした。常時使える必要はなかったので、nginxのrootを変更してちょっとだけ使った。

AWS – Cron

CakePHPのShellをCronで自動実行したい。
OSは、AmazonLinuxです。

$ cd /etc/cron.d
$ touch hoge
$ sudo vim hoge

#!/bin/sh

*/1 * * * * root cd /var/www/html/app/; /usr/bin/php /var/www/html/app/Console/cake.php Hoge

・ 順番は、分 時 日 月 曜日。
・ */1で1分毎。ハイフンで期間指定もできる。

cronの動作チェック

cronが動いてるかチェックする。

$ service crond status

あと、cronの実行結果のログは、/var/log/cronにある。

参考:
cronで自動実行
【AWS】 Amazon Linuxでのcronジョブ設定
cakePHP2.3 cron (さくらサーバ)

AWS – EC2でメールを受信する(Postfix)

参考:Postfix+Dovecotによるメールサーバ構築

とりあえず上記参考サイトのとおりに設定したら届いた。dovecotの設定もしたら、macのメーラーからも受信できるようになった。

ちなみに、mailコマンドでメールの確認ができるらしい。([mailコマンド]Linuxからメールを送る

$ sudo yum install mail
$ echo ‘testmail!’ | mail -s ‘hello!’ -r admin@hogehoge.com hoge@hoge.com

実際に送ることができた。ec2-user宛に送ったら、~/Maildirの中にメッセージが保存されていた。

capistrano エラー currentディレクトリが削除できません

EC2のインスタンスをAMIから複製して、本番環境つくってcapistrano3で本番環境へのデプロイをつくっております。
でもエラーになりました。currentを削除できませんということです。

権限がおかしかった。
参考:http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html

sudo chown -R root:www /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} +
find /var/www -type f -exec sudo chmod 0664 {} +

EC2 – AMIをつくってサーバを複製する

AMIはAmazon Machine Imageです。インスタンスからAMIを作成して、そのAMIからインスタンスをつくることでサーバを複製できます。
AMIをつくるときにMySQLとかとまっちゃうと書いてあるので、サーバ停止せずに複製する場合は、インスタンスからSnapshotを作成して、SnapshotからAMIを作成するといいそうです。

参考:Amazon EC2(AWS) インスタンスをコピーしてサイトを複製

ちなみに今インスタンスからAMIつくったけど特になんにもとまってない気がする。

EC2 phpmyadminが動かない

APCとmemcachedを入れたことが原因だった。

当初でていたエラーはこれ。

Undefined property: PMA_Error::$hash in /usr/share/phpMyAdmin/libraries/Error.class.php on l     ine 169

Notice:  Undefined property: PMA_Error::$isDisplayed in /usr/share/phpMyAdmin/libraries/Message.class     .php on line 724

Notice:  Undefined property: PMA_Error::$params in /usr/share/phpMyAdmin/libraries/Message.class.php      on line 538

Fatal error:  Class 'PMA_Message' not found in /usr/share/phpMyAdmin/libraries/Message.class.php on l     ine 649

これはセッションが変なときに出るやつらしい。PHPMyAdmin Error: Class ‘PMA_Message’ not foundここにエラーのことが書いてある。セッション書き込み権限がない的なことが書いてある。

通常、php.iniのsession.save_pathに設定されているディレクトリにsessionが書き込まれるので、そこの権限がapacheになってないといけない。chown root:apache ディレクトリ、chmod 660 ディレクトリみたいになっているか確認する必要がある。自分の場合はそうなっていたが、APCをインストールしたらこのエラーがでるらしい。下記によって、phpmyadmin内ではapcを無効にするとエラーがでなくなった。

vim /etc/httpd/conf.d/phpMyAdmin.conf

<Directory /usr/share/phpMyAdmin/>
   php_admin_value apc.enabled 0
</Directory>

参考:Running phpMyAdmin with APC cache enabled, fatal PHP errors

これで当初のエラーがなくなったが、下記のようなセッション関連のエラーが出続けてなんでかなと思ったら、memcachedを入れたときに、/etc/php.d/memcache.iniに、session.save_path=”tcp://localhost:11211″と書いていた。だから、php.iniのsession.save_pathは無効になってる状態だった。。

Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

memcachedを使いつつ、phpmyadminを正常に動かす方法もあるのかもしれないけど、下記でmemcachedをphpmyadminだけで無効にする方法が書いてあった。

Phpmyadmin doesn’t work if session.save_handler set to memcache

You might have to change this lines in phpmyadmin folder ‘libraries/session.inc.php’:
Try include this line at the top of the file: ini_set(‘session.save_path’, “/tmp/”);
Uncomment this line (about 74): ini_set(‘session.save_handler’, ‘files’);

ソースコードいじるっていうのはかなり微妙だし、やってるのはini_setだけなので、/etc/httpd/conf.d/phpMyAdmin.confを下記のようにてみた。

<Directory /usr/share/phpMyAdmin/>
   php_admin_value apc.enabled 0
   php_value session.save_path /tmp/session
</Directory>

これでできた。長かった。。

ちなみに、config.inc.phpの場所は、色んなブログに、/usr/share/phpMyAdmin/config.inc.phpと書いてあったので、ないないと思ってたら、/etc/phpMyAdmin/config.inc.phpにあった。

AmazonLinuxで割と新しい版のphpmyadminをインストールするには、下記でやるとよかった。

yum install --enablerepo=remi,epel,ius phpMyAdmin

EC2 cakePHPでMemcachedつかう

AmazonLinuxにMemcachedを設定します。

インストールと設定

インストールします。
参考:さくらの VPS 設定覚書(4)PHP

yum --enablerepo=remi,epel,rpmforge install libevent libevent-devel memcached php-pecl-memcache php-pecl-memcached

設定します。

vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="4096"
CACHESIZE="2048"
OPTIONS=""

Memcached を起動します。

service memcached start

自動起動の設定をします。

chkconfig --add memcached
chkconfig memcached on
chkconfig --list memcached

“0:off 1:off 2:on 3:on 4:on 5:on 6:off”と出れば、設定成功です。

memcache.iniを設定します。
http://php.net/manual/ja/memcache.ini.php

vim /etc/php.d/memcache.ini
memcache.chunk_size=32768
memcache.default_port=11211
session.save_path="tcp://localhost:11211"

Apacheを再起動します。
service httpd restart

php -R ‘ phpinfo(); exit(); ‘ | grep “memcache”
で、反映してるか確認できます。

EC2でポートをあける

Custom TCP Rule, tcp, 11211, セキュリティグループ

cakePHPでつかえるようにする

core.phpで下記がコメントアウトされてるので、コメントを外します。

Cache::config('default', array(
	'engine' => 'Memcache', //[required]
	'duration' => 3600, //[optional]
	'probability' => 100, //[optional]
	'prefix' => Inflector::slug(APP_DIR) . '_', //[optional]  prefix every cache file with this string
	'servers' => array(
		'127.0.0.1:11211' // localhost, default port 11211
	), //[optional]
	'persistent' => true, // [optional] set this to false for non-persistent connections
	'compress' => false, // [optional] compress data in Memcache (slower, but uses less memory)
));

あとは、キャッシュを使いたいところで、App::uses(‘Cache’, ‘Cache’);を書いて、Cache::read(‘hoge’);とか、Cache::write(‘hoge’, 123);とかやります。

memcachedは、apacheを再起動しても消えないけど、memcachedを再起動したら消えます。あとcakePHPのCacheは、モデルが追加、編集、削除されたときにモデルに関するキャッシュを消すそうです。でもroutes.phpでURL変えてると消えない場合があるようです。

EC2にChefでwwwグループ作成する

%w{httpd php mysql vim git}.each do |pkg|
  package pkg do
    action :install
  end
end

%w{httpd mysqld}.each do |svc|
  service svc do
    supports :status => true, :restart => true, :reload => true
    action [ :enable , :start ]
  end
end

group 'www' do
  members ['ec2-user']
  action :create
end

directory '/var/www/' do
  owner 'root'
  group 'www'
  mode '0755'
  action :create
end

EC2にChefでPHP、MySQL、Apacheなどを入れてみる

chefでresourceというのはchefが用意している命令のことらしい。OSの種類に応じて処理を実行してくれたり、エラーの場合の処理も内部でやってくれるので、Recipeに数行のresourceを書くだけでOKになっている。

packageもResourceですよね??packageを使って、php、mysql、httpdがインストールできそうなコードを試してみる。

%w{httpd php mysql}.each do |pkg|
  package pkg do
    action :install
  end
end

%w{httpd mysqld}.each do |svc|
  service svc do
    supports :status => true, :restart => true, :reload => true
    action [ :enable , :start ]
  end
end

とりあえずこれで実行してみたらエラーでなくてインストールされたっぽい。

vimとかphpmyadminもインストールさせてみようと思ったらエラーになった。
phpmyadminのインストールは下記に書いてあった。
AWS EC2にPHPMyAdminをインストールする

%w{httpd php mysql vim git}.each do |pkg|
  package pkg do
    action :install
  end
end

%w{httpd mysqld}.each do |svc|
  service svc do
    supports :status => true, :restart => true, :reload => true
    action [ :enable , :start ]
  end
end

rpmforge_file = "rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm"

execute 'get rpmforge packege' do
    cwd '/tmp'
    command "wget http://pkgs.repoforge.org/rpmforge-release/#{ rpmforge_file }"
    not_if { ::File.exists?("/tmp/#{ rpmforge_file }") }
end

rpm_package "#{ rpmforge_file }" do
    action :install
    source "/tmp/#{ rpmforge_file }"
end

package 'phpmyadmin' do
    action :install
end

まあこれだけできても特段有り難いものではない。
かといって全てを可能にする為の勉強工数もあまり有り難いものではないなあ。

追記:
phpmyadminは、上記実行後に、sudo yum updateして、再度上記を実行したらエラーになった。残念だった。

EC2でChef使ってみる

OSはEC2のAmazonLinuxです。

Chefのインストール

curl -L https://www.opscode.com/chef/install.sh | sudo bash

・Chefでは、コード化された手順書あるいは、サーバの状態をレシピと呼びます。
・クックブックはレシピの入れ物です。
・クックブックを含む実行に必要な一連のファイルを入れる入れ物もあり、それはリポジトリとかキッチンと呼ばれます。
・Chefを始めるには、最初にリポジトリを作成します。リポジトリは特定のシステムに1個くらいつくるイメージだそうです。

リポジトリ(キッチン)の作成

git clone git://github.com/opscode/chef-repo.git

knifeの設定ファイルの作成

knife configure

これだけです。あとはデフォルトでEnterでOKということです。

knifeでクックブック作成

cd chef-repo
knife cookbook create hello -o cookbooks

これでhelloというクックブックをcookbooksディレクトリに作成します。

レシピの編集

package "httpd" do
  action :install
end
service "httpd" do
  supports :status => true, :restart => true, :reload => true
  action [ :enable , :start ]
end

jsonファイルと、solo.rbファイルを作る

localhost.json

{
        "run_list": [
                "recipe[hello]"
        ]
}

solo.rb

file_cache_path '/tmp/chef-solo'
cookbook_path ['/home/ec2-user/chef-repo/cookbooks']

lolcahost.jsonとsolo.rbはどこに置いてもいいみたいだけど、リポジトリ直下に入れておく。

chef soloの実行

sudo chef-solo -c solo.rb -j ./localhost.json

これで、アパッチがインストールされて起動した。

githubのアクセス可能なリポジトリを限定する

EC2サーバにデプロイしたい。Githubは沢山リポジトリがあるが、今回デプロイ対象になっているリポジトリのみEC2からアクセスできるようにしたい。

githubのdeploy keysに公開鍵を登録しておけば、リポジトリが限定できました。
capistranoでデプロイする為に、EC2で公開鍵を作成して、それをdeploy keysに登録しました。そして、~/.ssh/configで下記のように設定しました。これでデプロイができました。

Host github.com
    HostName        github.com
    IdentityFile    ~/.ssh/id_rsa_hogehoge
    User            ec2-user

EC2にcapistrano3でデプロイ

EC2はサクラレンタルサーバと違ってデフォルトですんなりいけた。

EC2の/var/wwwにデプロイする。
/var/www/htmlに/var/www/currentのシンボリックリンクをはっておく。

capistranoサーバで下記設定する。
任意のディレクトリhogeに移動する。

cd hoge
cap install .
vim config/deploy.rb

config/deploy.rb

lock '3.1.0'
set :application, 'hoge'
set :repo_url, 'git@github.com:hoge/hoge.git'
set :deploy_to, '/var/www/'
set :pty, true

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute "cp -f #{fetch :deploy_to}database.php #{fetch :deploy_to}html/app/Config/"
      execute "cp -f #{fetch :deploy_to}core.php #{fetch :deploy_to}html/app/Config/"
      execute "cp -f #{fetch :deploy_to}.htaccess #{fetch :deploy_to}html/"
      execute "cp -f #{fetch :deploy_to}.htpasswd #{fetch :deploy_to}html/"
      execute "sudo chmod -R 707 #{fetch :deploy_to}html/app/tmp"
    end
  end

  after :publishing, :restart

  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

config/deploy/staging.rb

role :app, %w{ec2-user@hoge.amazonaws.com}
role :web, %w{ec2-user@hoge.amazonaws.com}
role :db, %w{ec2-user@hoge.amazonaws.com}
server 'hoge.amazonaws.com', user: 'ec2-user', roles: %w{web app}, my_property: :my_value

set :ssh_options, {
  keys: %w(/root/.ssh/hoge.pem),
  forward_agent: true,
}