さくらVPS CentOS6.5の設定

さくらVPSの標準のOSは、CentOS6.5です。これにPHP、MySQL、Apacheとかを入れて使えるようにします。

CentOS6.5
PHP5.3.3
Apache 2.2.15
MySQL 5.6.21

yum update -y
yum groupinstall -y “Web Server” “MySQL Database” “PHP Support”
service httpd start
sudo chkconfig httpd on
yum remove mysql*
yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum install mysql mysql-devel mysql-server mysql-utilities
yum install -y php-mysql
service mysqld start
mysql_secure_installation
sudo chkconfig mysqld on
yum –enablerepo=epel install -y phpMyAdmin php-mysql php-mcrypt

さくらVPSがssh接続できない

久しぶりにさくらVPSを借りて仮登録完了したからssh接続しようとしたらエラーになって接続できない。
Connection refusedになるので、サーバを再起動してみたけど、今度はOperation timed outになる。

まだ何の設定もしてないまっさらな状態のはずなんだけど、さくらの管理画面についているHTML5のターミナルのようなものを見てみると、下記のようにカーネルパニックとか書いてある。また再起動しても同じになる。

スクリーンショット 2014-10-20 4.12.07

さくらVPS SSH接続できないときにVNCコンソールで頑張って復帰するといった記事もあって、やってみたけどどうもダメなので、OS再インストールしてみた。時間かかる。。。AWSなら一瞬なのになー。。

20分くらいかかった気がするが再起動終わったら普通通りログインできた。

cakePHP SessionをDB+memcachedにしてみる

セッションをmemcached+DBというコンボセッションにしたいと思います。コンボセッションというのはここに書いてあるからそういう風にいうのかなと思いました。
http://book.cakephp.org/2.0/ja/development/sessions.html

上記ではAPCが使われていますが、APCの変わりにmemcachedを使ってみようと思います。APCはmemcachedより速いけどapache再起動したら消えてしまうとどこかに書いてありました。memcachedもmemcached再起動したら消えるし、速い方がいいのかなとも思いますが、まあどっちでもいいかと思いました。

今キャッシュのdefaultもmemcachedになっております。

まず、core.phpでセッションのdefaultをdatabaseにします。engineをComboSessionというのにしておいて、cacheはdefaultにします。

Configure::write('Session', array(
    'defaults' => 'database',
    'handler' => array(
        'engine' => 'ComboSession',
        'model' => 'Session',
        'cache' => 'default'
    )
));

次に、ComboSessionをつくります。上記のcakePHPのcookbookに書いてあるコードをコピペします。

次に、データベースにsession用のテーブルをつくります。app/Config/Schema/sessions.sqlを使って、sessionsテーブルをつくってSessionモデルをつくったらできました。

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変えてると消えない場合があるようです。

APC

APCはPHPアクセレーターというやつです。

PHPアクセレーターとは、PHPのスクリプトを最適化してコンパイルされた状態でデータをキャッシュし、以後同じデータにアクセスがあった際、そのキャッシュを利用することでスクリプトの実行速度を高速化させるためのものです。(APCでPHPの処理を高速化

APCをインストールします。
yum install php-pecl-apc

php-pecl-apc.x86_64 0:3.1.15-0.3.svn329913.10.amzn1がインストールされました。
/etc/php.d/apc.iniに設定ファイルがあります。(CentOSです。AmazonLinuxです。)
自動的に設定ファイルをつくってくれていますので、apacheを再起動したら反映されます。
APCコンソールは別にみなくてもいいので使いません。

apc.iniの設定項目の説明は、ここにあります。
http://php.net/manual/ja/apc.configuration.php

apc.ttl = 3600
apc.user_ttl = 3600
apc.max_file_size=5M

を設定してみた。

php -R ‘ phpinfo(); exit(); ‘ | grep “apc”

で反映されてるか確認できます。

PHPのセッションでエラーでた apache

cakePHPでFileBinderで画像アップできないと思ったら、capistranoのshared内にディレクトリ作ってなかったり、app/tmpのパーミッションがおかしかったり、セッション保存するディレクトリのパーミッションが変だったりしたから直した。

セッション関連でこんなエラーでた。

session_start(): open(/var/lib/php/session/sess_uub68oeicgasdfahogehoge, O_RDWR) failed: Permission denied (13) [CORE/Cake/Model/Datasource/CakeSession.php, line 612]

セッション書き込めないよということでありまして、/var/lib/php/session内に書き込もうとして権限がなかったということであります。httpd.confでapacheのグループを変えたらエラーになりました。

php.iniの1277行目くらいにある、session.save_path = “/var/lib/php/session”というのを変えれば、セッション保存ディレクトリを変えられるみたい。

PHPから自動でサブドメインつくる (cakePHP)

よくあるアカウント登録してサブドメイン名登録すると、ユーザ専用のサイトを作成できるようにしたいがやったことがない。

サーバはEC2のAmazonLinuxを使っています。ドメインはRoute53で管理してます。
Route 53のRecord Setsで、*.hoge.comとやれば、どんなサブドメインでもhoge.comと同じように扱うことができます。
後はcakePHPのルーティングでうまく処理できれば終了なんじゃないかと思います。

AppControllerとかでサブドメインの文字列を取得して、その文字列内容に応じて処理を切り替えれば、route.phpの設定なども必要ないんじゃないでしょうか。

private function get_subdomain(){
	$url = explode('.',env('HTTP_HOST'));
	$this->subdomain = $url[0];
}

最初のドットまでを取得しているので、サブドメインなしとか、IPアドレスでアクセスとか、wwwアクセスとかも、最初のドットまでを取得してしまう。それを省けば大丈夫っぽい。あとは$this->subdomainの内容に応じて表示内容を変えればoKじゃないでしょうか?

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

CentOS6.5 apache httpd: apr_sockaddr_info_get()というエラーが出る

apacheを起動するときにhttpd: apr_sockaddr_info_get()というエラーがでる。

Apache の httpd: apr_sockaddr_info_get() failed for エラー

これやったらエラーが出なくなった。まだ下記のエラーがでる。

httpd: Could not reliably determine the server’s fully qualified domain name, using vagrant-centos65.vagrantup.com for ServerName

Apache で apr_sockaddr_info_get() failed for が発生する

ここに書いてある原因だと、/etc/hosts/の設定と、/etc/sysconfig/networkの設定は一応見たから、service network restart の実行忘れというのを確認してみよう。
service network restartでエラーになった。でもよくわからん。
とりあえず、httpd.confにServerNameにvagrant-centos65.vagrantup.comを設定したらエラーは消えた。

cakePHP – httpsとhttpの接続強制処理

参考:CakePHP2.xでSSL接続(https://)を強制させる
参考:CakePHP 2.xのSecurityコンポーネントを使う際の注意点

Secutiryコンポーネントを使用すると、POST時に下記のような挙動をするため、Ajaxとか使ってるとエラーになるので注意が必要。

・Formヘルパーによって動的に生成されたTokenがhidden要素としてフォームに自動追加される。
・POSTされたフォームのTokenを確認して、問題があるとThe request has been black-holedとして処理され、$this->request->dataは空になる。

上記の動作を無効にするには、コントローラのbeforeFilter()に
$this->Security->validatePost = false;

Apache – apr_sockaddr_info_get() failedエラー

Starting httpd: httpd: apr_sockaddr_info_get() failedというエラーでapacheが起動しません。

参考;Apache で apr_sockaddr_info_get() failed for が発生する

/etc/httpd/conf/httpd.conf の ServerName の設定忘れ。これからやってみる。

と思ったらrootになったらできたからいいや。