Hatena::ブログ(Diary)

てつじんにっき

2011-06-05

[][][] PHPer.jpでSymfony2のblogチュートリアルを動かすためにやったこと

phper.jp | 523: Origin is unreachablePage not found · GitHub Pagesを動してみたので、雑なまとめですが、やった設定の備忘録。

最終的に下記のような構成に。

/path/to/approot/
 -  .phper/        # phper.jp用設定ファイル群
 -  Symfony/       # blogチュートリアルアプリケーション
 -  phpMyAdmin/    # 管理用phpMyAdmin

1. phper.jpに登録

http://phper.jp/quickstartを見てユーザ登録〜デプロイまで進める。

ドキュメントルートは Symfony/web にしておく。


2. phperコマンドのインストール

Ruby製のphperというCLIツールが用意されているので、no titleを参考にRuby環境整えて

$ gem install phper

で、phperコマンドをインストール


3. blogチュートリアルの作成

ローカルでblogチュートリアルを読み進めながら、/path/to/approot/Symfony下に作成。


4. phper.jp用に設定の修正


Symfony/web/app_dev.phpSymfony/web/config.phpのアクセス制限変更

no titleの構成を見るとフロントにproxyが居るので、

$_SERVER['REMOTE_ADDR']だけじゃなくて、$_SERVER['HTTP_X_FORWARDED_FOR']も見てやるようにする。

# /path/to/approot/Symfony/web/app_dev.php
# /path/to/approot/Symfony/web/config.php
<?php
...
$remoteIpAddresses = array_merge(
    (array)@$_SERVER['REMOTE_ADDR'],
    array_map('trim', explode(',', @$_SERVER['HTTP_X_FORWARDED_FOR']))
);
$allowIpAddresses  = array(
    '127.0.0.1',
    '::1',
    'your-global-ip-address', // 自分の接続元グローバルIP
);
if (count(array_intersect($remoteIpAddresses, $allowIpAddresses)) === 0) {
    header('HTTP/1.0 403 Forbidden');
    die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
...

■ .gitignore

下記をgitの管理対象外にする。

# /path/to/approot/Symfony/.gitignore
*/logs/*
*/cache/*
app/config/parameters.ini

parameters.iniはローカル、phper.jp上で異なるのでgit管理対象外として、下記のようにした。

# /path/to/approot/Symfony/app/config/parameters.phper.ini
[parameters]
    database_driver   = pdo_mysql
    database_host     = db.phper.jp
    database_name     = yourname_appname
    database_user     = yourname
    database_password = password

mysqlの接続情報などは、phper infoで確認できる。

$ phper info
yourname-appname
--> gitosis@git.phper.jp:yourname/appname.git
--> mysql://yourname:password@db.phper.jp/yourname_appname

5. phpMyAdminを用意する

MySQLコマンドラインクライアントが使えないのでphpMyAdminを入れる。

http://www.phpmyadmin.net/home_page/downloads.phpからDownloadして/path/to/approot/phpMyAdminに設置する。


また、できればphpMyAdminにはhttpsでアクセスしたい。

no titleを見ると、phper.jpではエッジレイヤのNginxがSSLアクセラレーションするようなので、

SSL-Proxy下でphpMyAdminSSLで動かす設定も入れておいた。


config.sample.inc.phpをコピーしてconfig.inc.phpを作成。下記を設定。

# /path/to/approot/phpMyAdmin/config.inc.php
<?php
..
// 書き換え
$cfg['Servers'][$i]['host'] = 'db.phper.jp';
// SSL-Proxy下でSSLで動かす設定。 http://wiki.phpmyadmin.net/pma/Config#PmaAbsoluteUri
$cfg['PmaAbsoluteUri'] = 'https://yourappname.phper.jp/pma/';

6. phper設定

プロジェクト直下の.phper/ディレクトリにいろいろとスクリプトや設定を記述できる。

詳しくはマニュアル参照。http://phper.jp/manual


■ deployの設定: /path/to/approot/.phper/deploy
#!/bin/sh
ROOT_DIR=$(cd $(dirname $0)/..; pwd)
# キャッシュの削除
rm -rf $ROOT_DIR/Symfony/app/cache/*
# parameters.iniのシンボリックリンク作成
ln -sf $ROOT_DIR/Symfony/app/config/parameters.phper.ini $ROOT_DIR/Symfony/app/config/parameters.ini

rsync除外設定: /path/to/approot/.phper/rsync_exclude.txt
Symfony/app/cache/*
Symfony/app/logs/*

アプリケーションサーバApacheの設定: /path/to/approot/.phper/httpd.conf

/pmaでphpMyAdminにアクセス。後、Digest認証も一応かけておく。

Alias /pma "/var/www/sites/yourname-appname/phpMyAdmin"
<Location pma>
    AuthType Digest
    AuthName "Secret Zone"
    AuthDigestDomain pma
    AuthDigestProvider file
    AuthUserFile  "/var/www/sites/yourname-appname/.phper/.htdigest"	
    Require valid-user
</Location>
$ htdigest -c /path/to/approot/.phper/.htdigest "Secret Zone" user
New password: ****
Re-type new password: ****

7. デプロイする

$ git push

8. phper.jp上のデータベースschema定義を流しこむ

blogチュートリアルschema定義をdumpして、phpMyAdminから流しこむ。

$ app/console doctrine:schema:create --dump-sql
ATTENTION: This operation should not be executed in an production enviroment.

CREATE TABLE Post (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) NOT NULL, body LONGTEXT NOT NULL, createdAt DATETIME NOT NULL, updatedAt DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB

後はブラウザから動作確認して動くか確認。


実際はこんなにすんなり行かずに、トライアンドエラーを繰り返しました。PaaS楽しい!!

*1gitに登録するのも嫌だが他の方法が思いつかなかったので

2010-08-04

[][] mod_rewriteリダイレクトあれこれ

ドメインの正規化

wwwあり・なしをどちらか片方に寄せたい場合。

今回はwww.example.comなど、example.com以外でアクセスされたらexample.comリダイレクトする設定。

<VirtualHost *:80>
    # (1)
    ServerName  example.com
    ServerAlias www.example.com

    RewriteEngine On
    # (2)
    RewriteCond %{HTTP_HOST} !^example\.com
    # (3)
    RewriteRule .* http://example.com$0 [QSA,NE,R=301,L]
</VirtualHost>

(1)で、どちらのホスト名でもVirtualHostが動くようにする。

(2)は正規表現の末尾に$を付けないようにする。Hostリクエストヘッダは

Host = "Host" ":" host [ ":" port ] ; Section 3.2.2

http://www.studyinghttp.net/header#Host

と定義されているように、host名の後に「:ポート番号」が付与される形式がある。

例えば http://www.example.com:80/ にアクセスした場合に

Host: www.example.com:80

と送ってくるクライアントに対応できないので、前方一致で比較する。

(3)で

にアクセスした場合

リダイレクトする。


リダイレクト時の各オプションは、

QSA

QueryString append。QSAを付与しないとQueryStringを上書いてします。詳しくは後述。

NE

No escape。URLエンコードを抑制する。NEを付与しないと、

にアクセスした場合に「%」が2重にエンコードされ

リダイレクトされてしまう。

R=301

Moved Permanently

L

ここでルールの適用を終了する。


QSAはこの場合不要だけど、定義変更時に忘れがちなので付けておく。

HTTPSを強制

HTTPでアクセスされたらHTTPSリダイレクトする。

RewriteEngine On
# (1)
RewriteCond %{HTTPS} !=on
RewriteRule .* https://example.com$0 [QSA,NE,R=301,L]

(1) SSL接続時にmod_sslが環境変数HTTPSにonをセットするのでそれで判断する。

DoCoMo機種の場合、強制的にguid=ONを付与

強制するのはどうなの?って感じですが。

RewriteEngine On
# (1)
RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [NC]
# (2)
RewriteCond %{QUERY_STRING} !^(.*&)?guid=ON(&.*)?$ [NC]
# (3)
RewriteCond %{HTTPS} !=on
# (4)
RewriteRule .* http://example.com$0?guid=ON [QSA,NE,R=302,L]

(1) UserAgentがDoCoMoから始まるもの かつ

(2) QueryStringにguid=ONが含まれていない場合 かつ

(3) HTTPS接続で無い場合

(4) guid=ONを付与してリダイレクトする

ただし、アクセスする度にguid=ON付きURLリダイレクトしたり、POSTのリクエストがリダイレクトされても困るので、

別途、アプリケーション側で内部リンクに自動的にguid=ONを付与するような仕組みを設けること。

(4)でR=302な理由は、DoCoMo端末のみのリダイレクト(!= Moved Permanently)であるのと、

301リダイレクトだと「サイトが移動しました(301)」のメッセージがでるので302を返すように。

(4)で「QSA」がついていないと、

にアクセスした場合に、Query Stringが書き換えられ

になってしまう。「QSA」が付与されていると

となる。

参考にさせていただいたリンク

2009-05-12

[][] Exuberant ctagsでphpのconstも拾うようにする

こちらのexuberant ctags 日本語対応版そのままではconstを拾ってくれなかったので、

見よう見まねでpatchを書いてみたのですが、その後に気がつきました。

実はこんな感じで--regex-PHPを引数で渡すだけでよかった。。

 $ ctags -R -e --langmap=PHP:.php --php-types=c+f+d \
 --regex-PHP='/^[ \t]*const[ \t]+([[:alnum:]_]+)/\1/d/'

ちなみにEmacsからの利用でしか試してません。

2008-04-30

[][][] リージョン内のコードを実行

(defun php-eval (beg end)
  "Run selected region as PHP code"
  (interactive "r")
  (let ((code (concat "<?php " (buffer-substring beg end))))
    (with-temp-buffer
      (insert code)
      (shell-command-on-region (point-min) (point-max) "php")
      )))

emacs lisp勉強ちゅう。

開始タグを付けて実行する方法に悩んだ。

2008-03-27

[][][] ファイル末尾の改行を削除

巷で話題の非常に便利なyasnippet。すばらしい。

で、仕事用のmysnippetをいろいろ書いてから気づいたのですが、

これって、ファイル末尾の改行も展開時に挿入するんですね。

yasnippetを使っていて、展開後末尾の改行は個人的に必要なかったので、全部除去することに。

取りあえず、指定したディレクトリ以下のファイルの末尾の改行を一括削除。

$ find ./mysnippet-dir -type f -print0 | xargs -0 perl -pi -e 's/\n$// if eof'

あ。でも、svnのファイルとか混じってたら危険なので、

$ find ./mysnippet-dir -type f | grep -v '/\.svn/' | xargs perl -pi -e 's/\n$// if eof'

それかやっぱり、ディレクトリ下って一つづつ、

$ perl -pi -e 's/\n$// if eof' *

でもいいかも。

末尾が改行じゃないファイルが欲しいことなんて殆ど無かったけど、こんなところに需要が。

追記 (02:05)

$ find ./mysnippet-dir -type f ! -path '*/.svn/*' -print0 | xargs -0 perl -pi -e 's/\n$// if eof'

2つ目のよりはこっち?findの勉強になってきた。