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 – ffmpegインストール

引用:amazon linuxにffmpegをyumでインストールする

$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
$ sudo rpm -ivh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
$sudo vim /etc/yum.repos.d/centos.repo

# そのまま書く
[base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
enabled=0
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
# 書く部分ここまで

sudo yum install -y --enablerepo=base ffmpeg-devel

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を変更してちょっとだけ使った。

ローカルのMySQLからAmazonRDSに移管する

EC2を使っていて、EC2のサーバに直接MySQLのDBを入れている状態から、AmazonRDSに移管します。自動でバックアップとかしてくれるので便利だからです。

Amazon RDSのインスタンスを作成する

まず、RDSのインスタンスを作成します。https://aws.amazon.com/jp/rds/getting-started/インスタンスを作る時に、データベースのID、パスワード、データベース名等を登録しました。エンジンはAurora 5.6.10aというやつです。

Amazon Aurora は、MySQL と互換性のあるリレーショナルデータベースエンジンで、高性能の商業用データベースの可用性およびスピードと、オープンソースデータベースのコスト効率性および簡素性を併せ持っています。Amazon Aurora は、MySQL の 5 倍の性能を持ち、同様の機能や可用性を提供している商用データベースの 10 分の 1 の価格です。

RDSにも、セキュリティグループがあります。このセキュリティグループの設定を変更して、EC2からアクセスできるようにします。

EC2のMySQLのデータを取り出す

sudo mysqldump --databases <database_name> --single-transaction 
--order-by-primary -r backup.sql -u <local_user> -p

RDSにデータをインポートする

参考:MySQL DB または MariaDB DB から Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート

上記によると、下記コマンドで、取り出してインポートするが一緒にできるらしい。

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

できた。便利だ。

あとは、アプリケーションのデータベースの設定を変更すれば完了します。

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の中にメッセージが保存されていた。

SSL証明書の設定(AWS)

何をやるかちょっと忘れた。

参考:
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/InstallCert.html#InstallSSL-managing-server-certs

sshでサーバに入ります。
opensslが入ってるか確認します。

sudo yum update openssl

プライベートキーを作成します。

openssl genrsa 2048 > private-key.pem

CSR(証明書署名要求)を作成する。

openssl req -new -key private-key.pem -out csr.pem
Country Nameは、日本の場合、JP
State or Province Nameは、都道府県なので、Tokyoとか。
Locality Name (eg, city)は、市区町村。Shibuya-kuとか。
Organization Nameは、会社名。Logicky Inc.など。
Organizational Unit Nameは、組織名(オプション)。
Common Nameは、ドメイン。logicky.comなど。(ワイルドカードを使ってサブドメインに対応させる場合は、*.logicky.comとする)
Email Addressは、メアド(オプション。空でいいらしい。)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: これは、空でいいらしい。
An optional company name []: これは、空でいいらしい。

これで完成。

netowl.jpというところでSSL証明書を買ったんだけど、CSR入力後にSSL証明書発行したら、承認メールが送られてくるようになっていて、SSL証明を使うドメインのメールアドレスに承認メールが送られてくるので、メール受信可能な状態にしないといけない。AWSでメール受信設定するのもめんどくさいので、google mailを使うことにした。

証明書を発行したら、AWSのiamというのにアップロードしたら便利らしい。iamとか使わなくてもこの前で来たけどやってみる。

aws iam upload-server-certificate --server-certificate-name certificate_object_name --certificate-body file://public_key_certificate_file --private-key file://privatekey.pem --certificate-chain file://certificate_chain_file

Unable to locate credentials. You can configure credentials by running “aws configure”.

おお、使えない。

sudo yum install python-pip
sudo pip install awscli

Unable to locate credentials. You can configure credentials by running “aws configure”.
まだ使えない。AccessKeyとSecretKeyが必要で、それを設定する必要があるらしい。このKeyはIAMから取得できるらしい。IAMってなんだ。まあ、今いらないからいいや。

単純にアップして、httpd.conf(ssl.conf)を設定したら反映された。
chromeは、キャッシュしているらしく、正常に反映した後でも、URLバーが赤い状態になっていたが、ブラウザを再起動したら緑になった。

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に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,
}