Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-01-30

Capistranoのタスク

23:29 |  Capistranoのタスク - dann@catalyst を含むブックマーク はてなブックマーク -  Capistranoのタスク - dann@catalyst  Capistranoのタスク - dann@catalyst のブックマークコメント

deploy.rbの生成

% capify MyApp

[add] writing `MyApp/Capfile'

[add] writing `MyApp/config/deploy.rb'

[done] capified!

生成されたのは、こんなファイル。

set :application, "set your application name here"
set :repository,  "set your repository location here"

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true

タスク一覧

% cap -T

cap deploy # Deploys your project.

cap deploy:check # Test deployment dependencies.

cap deploy:cleanup # Clean up old releases.

cap deploy:cold # Deploys and starts a `cold' application.

cap deploy:migrate # Run the migrate rake task.

cap deploy:migrations # Deploy and run pending migrations.

cap deploy:pending # Displays the commits since your last deploy.

cap deploy:pending:diff # Displays the `diff' since your last deploy.

cap deploy:restart # Restarts your application.

cap deploy:rollback # Rolls back to a previous version and restarts.

cap deploy:rollback_code # Rolls back to the previously deployed version.

cap deploy:setup # Prepares one or more servers for deployment.

cap deploy:start # Start the application servers.

cap deploy:stop # Stop the application servers.

cap deploy:symlink # Updates the symlink to the most recently deployed ...

cap deploy:update # Copies your project and updates the symlink.

cap deploy:update_code # Copies your project to the remote servers.

cap deploy:upload # Copy files to the currently deployed version.

cap deploy:web:disable # Present a maintenance page to visitors.

cap deploy:web:enable # Makes the application web-accessible again.

cap invoke # Invoke a single command on the remote servers.

cap shell # Begin an interactive Capistrano session.

タスク名みた感じだと、symlink, restart, start, stopあたりは上書きしないとダメだろうな。

ディレクトリ構造もタスクも大体わかったから、後はcapistranoのコードを見て、上書きすればいいかな。

以下のファイルを読んでいけばよい。

/var/lib/gems/1.8/gems/capistrano-2.1.0/lib/capistrano/recipes/deploy.rb

Rails2.0とCatalystのディレクトリの対応

23:29 |  Rails2.0とCatalystのディレクトリの対応 - dann@catalyst を含むブックマーク はてなブックマーク -  Rails2.0とCatalystのディレクトリの対応 - dann@catalyst  Rails2.0とCatalystのディレクトリの対応 - dann@catalyst のブックマークコメント

  • libがapp
  • root/staticがpublic

に対応。

Rails2.0のディレクトリ構造

23:29 |  Rails2.0のディレクトリ構造 - dann@catalyst を含むブックマーク はてなブックマーク -  Rails2.0のディレクトリ構造 - dann@catalyst  Rails2.0のディレクトリ構造 - dann@catalyst のブックマークコメント

% rails MyApp

% tree -d MyApp

MyApp
|-- app
|   |-- controllers
|   |-- helpers
|   |-- models
|   `-- views
|       `-- layouts
|-- config
|   |-- environments
|   `-- initializers
|-- db
|-- doc
|-- lib
|   `-- tasks
|-- log
|-- public
|   |-- images
|   |-- javascripts
|   `-- stylesheets
|-- script
|   |-- performance
|   `-- process
|-- test
|   |-- fixtures
|   |-- functional
|   |-- integration
|   |-- mocks
|   |   |-- development
|   |   `-- test
|   `-- unit
|-- tmp
|   |-- cache
|   |-- pids
|   |-- sessions
|   `-- sockets
`-- vendor
    `-- plugins

Railsは、以下の方法でインストール。

% sudo gem install rails -y

Capistranoのインストール

23:05 |  Capistranoのインストール - dann@catalyst を含むブックマーク はてなブックマーク -  Capistranoのインストール - dann@catalyst  Capistranoのインストール - dann@catalyst のブックマークコメント

% sudo aptitude install ruby

% sudo aptitude install ruby1.8-dev

% sudo aptitude install rubygems

% sudo gem install capistrano -y

% sudo gem install fastthread

なんか2系になってから変わったみたいだなぁ。

CatalystConference

21:13 |  CatalystConference - dann@catalyst を含むブックマーク はてなブックマーク -  CatalystConference - dann@catalyst  CatalystConference - dann@catalyst のブックマークコメント

http://coderepos.org/share/wiki/CatalystCon1

ちょっ... 聞きたいことは山のようにあるんだけれど...

  • Catalystでのオレオレ規約
    • ディレクトリ構成やURI設計とか含めて、こんなんやってるよ!ってのを聞いてみたい!
  • REST時代でのCatalystでのURI設計
  • CatalystアプリのDeploy自動化
  • Catalystアプリのテストサーバー環境
    • mod_perl再起動とか開発遅すぎなので、catalyst付属のテストサーバーで開発やってるんですが、いざmod_perl上にDeployしたら動かない... orzなんてことになりがちなので、なんか上手い方法ないのかなっていう。
  • DBICとMemcachedの組み合わせ方(Catalystじゃないって?...)
    • Memcached使ってDBICのオブジェクトキャッシュしようとすると、DBを"R"DBっぽくは使えなくなるような気がするのだけれど、これはそういう使い方であってるのかなぁという...

いやぁ、リストアップしてみると、聞いてみたいことはたくさんあるなぁ。

mod_proxy_balancer + mod_perlでCatalyst@Ubuntu7.10

20:32 |  mod_proxy_balancer + mod_perlでCatalyst@Ubuntu7.10 - dann@catalyst を含むブックマーク はてなブックマーク -  mod_proxy_balancer + mod_perlでCatalyst@Ubuntu7.10 - dann@catalyst  mod_proxy_balancer + mod_perlでCatalyst@Ubuntu7.10 - dann@catalyst のブックマークコメント

SC440を購入したので、Catalystの環境を作ってみることにしました。


自宅にそんなにたくさんサーバー置けるスペースないよ!って話なんですが、無駄にスケールできるようにしてみました。具体的には、アプリケーションサーバーをスケールアウトできるように、フロントエンドとバックエンドを分ける構成にしてみました。

さて、以下がフロントエンドとバックエンドの設定の説明です。Catalystのディレクトリ構成にあうように設定しています。

フロントエンド

 フロントエンドのApacheは、Apache2.2を使って「ロードバランサ + 静的コンテンツのサーブ」という構成にすることにしました。

  • mod_proxy_balancerでアプリケーションサーバーにリクエストをディスパッチ
  • CSSJavaScriptなどのstaticなコンテンツは、このフロントエンドのサーバーでサーブ。Catalystではroot/staticに静的コンテンツが格納されているので、これらをサーブしています。

以下が設定したApacheのファイルです。

NameVirtualHost *:80
<VirtualHost *:80>

        <IfModule proxy_module>
            # フロントのproxyが詰まらないようにする
            # ために、timeout時間を短くする
            ProxyTimeout 3
        </IfModule>


        Include /etc/apache2/conf.d/rewrite.vhost_common
        ServerName SUBDOMAIN
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/SUBDOMAIN/root
        Alias /static /var/www/SUBDOMAIN/root/static

        ProxyRequests Off
        <Proxy *>
            Order deny,allow
            allow from all
        </Proxy>

        # App server
        <Proxy balancer://SUBDOMAINCLUSTER/>
            BalancerMember http://192.168.0.30:8080 loadfactor=10 keepalive=On
        </Proxy>

        ProxyPass /static/images !
        ProxyPass /static/js !
        ProxyPass /static/css !
        ProxyPass /favicon.ico !
        ProxyPass / balancer://SUBDOMAIN_CLUSTER/
        ProxyPassReverse / balancer://SUBDOMAIN_CLUSTER/
        # バックエンドでVirtualHostの場合に
        ProxyPreserveHost On

       <Location /static>
            SetHandler  default-handler

            # mod_filterでdeflate
            <IfModule filter_module>
                FilterDeclare deflate CONTENT_SET
                FilterProvider deflate DEFLATE Content-Type /text\x2F\w+|application\x2Fx-javascript/
                FilterChain deflate
            </IfModule>
            # mod_expiresでexpire
            <IfModule mod_expires.c>
                ExpiresActive On
                ExpiresDefault "access plus 1 year"
                ExpiresByType image/gif "access plus 1 week"
                ExpiresByType image/jpeg "access plus 1 week"
                ExpiresByType image/png "access plus 1 week"
                ExpiresByType application/x-shockwave-flash "access plus 1 week"
                ExpiresByType text/html "access plus 1 week"
                ExpiresByType text/css "access plus 1 week"
                ExpiresByType application/x-javascript "access plus 1 week"
            </IfModule>
       </Location>

        ErrorLog /var/log/apache2/SUBDOMAIN/error.log
        LogLevel warn
        CustomLog /var/log/apache2/SUBDOMAIN/access.log combined
        ServerSignature On

</VirtualHost>

幾つか設定のポイントがありました。

  • Staticなコンテンツをサーブするだけなので、KeepAliveはOnに設定しておきます。
  • フロントエンドではStaticなコンテンツは、deflateで圧縮、expiresでヘッダの設定。
    • deflateで圧縮はCPU負荷を考えるとやめるべきなのかもしれません。gzip圧縮されたものを直に配信というほうがBetterなのかもしれません。
  • フロントエンドがつまらない様に、ProxyTimeoutの時間を短く

今後のTODOとしては、キャッシュなんじゃないかと思います。mod_mem_cacheでキャッシュすることになるのかなぁと思っています。まともに使ったことがないので、Catalystのキャッシュ機構とあわせて、後々検証してみることにします。

これで、balancerのメンバにアプリケーションサーバーを追加してやれば、スケールするようになるんじゃないかと思います。一応、アプリケーションサーバーを2台にしてみた感じでは振り分けられていたので、一応は動いているんじゃないかと。

YSlowの評価もA評価になったので、まぁこれ位でいいんじゃないかと思います。

バックエンド

 バックエンドはmod_perl2で構築することにします。プロセスサイズが大きくなるので、KeepAliveはOffにします。

NameVirtualHost 192.168.0.30:8080
<VirtualHost 192.168.0.30:8080>
        ServerName SUBDOMAIN
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/SUBDOMAIN/root

        PerlModule MyApp
        PerlOptions +Parent
        PerlSwitches -I/var/www/SUBDOMAIN/lib
        <Location />
            SetHandler modperl
            PerlResponseHandler MyApp
        </Location>

        ErrorLog /var/log/apache-perl/SUBDOMAIN/error.log
        LogLevel warn
        CustomLog /var/log/apache-perl/SUBDOMAIN/access.log combined
        ServerSignature On
</VirtualHost>

バックエンドのサーバーの設定のポイントとしては、

  • KeepAliveはOff

でしょうか。

バックエンドのサーバーのログに、フロントエンドのサーバーのIPが記録されてしまうので、mod_rpafを使って、以下のように設定して、クライアントのIPアドレスをバックエンドのサーバーのログに記録するようにします。

具体的には、mod_rpafをインストールして、RPAFproxy_ipsに「ReverseProxyのローカルアドレス」を設定するだけです。バックエンドのサーバーで設定するということがポイントです。

<IfModule mod_rpaf.c>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 192.168.0.30        #Reverse Proxy のローカルアドレス
</IfModule>

MaxClientsなどの設定は、1台構成なので、DBサーバーとの絡みもあるので、また後ほど検討してみます。本業はWebアプリ屋さんではないので、おかしなところもあるかもしれませんが、逆に捨てるものは何もないので全部公開していこうかと思っています。

Catalystの自動Deployment

20:32 |  Catalystの自動Deployment - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystの自動Deployment - dann@catalyst  Catalystの自動Deployment - dann@catalyst のブックマークコメント

上記構成にしてみたのですが、今は手動でDeployしているので、面倒すぎです... catastarterを使って、立ち上がりはかなり早くなったものの、Deployする段階でやる気がなくなってしまいます。

ということで、Deploymentの自動化の仕組みも考えたいなと思っています。CapistranoかArcherを使うことになるのかなぁと思ってます。Perlで統一したほうが気持ちいいよねということで、Archerのほうでチャレンジしてみようかと思っていたり。

Catalystでの再利用 その2

20:32 |  Catalystでの再利用 その2 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystでの再利用 その2 - dann@catalyst  Catalystでの再利用 その2 - dann@catalyst のブックマークコメント

typesterさんの記事を見て、再利用にも幾つか種類があるなと思った。

  • catastarterでの再利用
    • ディレクトリ構成
    • テンプレート
    • プラグインとその設定
  • Catalyst::Model::Adaptorでのモデルの再利用
  • Baser ControllerでのControllerの再利用
    • これは上手くいった試しがない...
  • ヘルパでの再利用

ヘルパでの再利用は、殆どやっていなかったのでなるほどなぁと思いました。ちょっと取り込んでみたいと思います。

Catalystでの再利用 その3

20:43 |  Catalystでの再利用 その3 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalystでの再利用 その3 - dann@catalyst  Catalystでの再利用 その3 - dann@catalyst のブックマークコメント

Java界隈で、こういう責務に関するデザインの話は、割とよく出る話で実際にやるとなると、

  • MyApp::Logic::HogeLogicみたいなのを使って、Logic切り出し。LogicはStateless
  • DAOは直接触らないでDTOにして、LogicではDTOを触る。ViewでもDTOを触る。

なんて話になりがちなのだけれど、こういうのはCatalystには合わないなぁって思う。

なんか、綺麗な落としどころがあるんじゃないかと思っているけれど、まだすっきりしていない。多分、Webアプリ作っている量が足りないんだとは思う。実際に作っているWebアプリもそんなにロジックが複雑なわけでもないから、モデルにロジック押し込むだけで事足りてしまっているというのがある。

さて、何がいいんだろうなぁ。

JamoscingeJamoscinge2017/05/11 02:08Amoxicillin Blood Pressure Dangers Priligy Se Vende Sin Receta Amoxicillin Over The Counter Lavitra <a href=http://byuvaigranonile.com>viagra</a> Super Kamagra Ajanta Pharma

CarcownCarcown2018/02/10 11:14Cialis Sotto La Lingua Cout Levitra 20mg <a href=http://tadalafbuy.com>cialis</a> Purchase Prescription Antibiotic Amoxicillin 875

DenthesDenthes2018/04/23 12:08Suprax No Prescription Cialis Generika Kaufen Deutschland Stress Tea <a href=http://brandciali.com>online pharmacy</a> buy accutane ireland Comprar Propecia En Espana

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080130