読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

Apacheが動いているのにWEBrickも動かしちゃった時のassetsの話2

もう、収集つかなかったし失踪したいな、と思っていました。
(あと、「サーバ構築の実際が分かるApache実践 運用/管理」にVirtualHostについてほとんど記述が無かったのでおこ。
キャッシュとかパフォーマンスのチューニングとかネットに載ってなさそうなことは載っているみたいだったのですが、
ネットに載っているようなことの分かっている人の比較的確かな言葉が欲しかったんです)
まあ、書きます。

とりあえず、前回ぎゃーぎゃー言ってたことを結論含めて、4行でまとめると、

  • WEBrickで動かしているRails中のjavascript_include_tagなどで出力されるassetsを取得するためのurlのドメイン部分にポート番号がついていたこと、
  • ドメインが間違っていようが、アドレスを生成するヘルパにおいてドメインより下のディレクトリ以下の部分は正しく生成されていること
  • ディレクトリ以下の部分を読んで、config/routes.rbに書いてある条件に一致したら、対応するコントローラのアクションを動作させること
  • よって、assetsは出ないけど、該当アクションで生成されるコード(app/views以下の対応するテンプレートのコード)の部分は出力されること

(それが余計に混乱を招くこと)

になります。
ドメインとかの用語は http://www.724685.com/weekly/type/table10.htmを見て書きました。かしこ。

で、Apacheの方ではassetsが取得できていたのに……という話です。

気になるのが、WEBrickで動かしているRails中のjavascript_include_tagなどで出力されるassetsのドメインに当たる箇所がずれていたこと
あるいは、
WEBrickで動かしているRails中のrootはなぜ:3000がついているのか、です。

結論としてはApacheはともかくWEBrickについては何となく察しはついたものの、よく分かりませんでした(おい)。
WEBrickに詳しくて暇な人がいたら教えてください。

urlの構造とurlの各部をどのプログラムが吐き出しているか

urlの各部分についてもう一度おさらいして、それぞれどこのプログラムが作っているか確認します。
資料は見すぎてどれがどこだが……。

urlの構造について、以下のようにわけると、

http://www.app.com/users/1
# http://www.app.com => ドメイン。どのサーバかを表す部分
# /users/1 => ディレクトリ以下のurl。

それぞれの部分を吐き出している関数というかプログラムは、

になります。

もう一度前記事の復習ですが、
routes.rbはディレクトリより下の部分を見て、
rotues.rbに書かれたパスに合っている場合は、関連するアクションを呼び出します。
このアクションによって、吐き出されるhtmlの部分は見えるのでした。

javascript_include_tagなどでディレクトリ以下が書いてあるjsやcssのurlを受け取ると、
webサーバソフトウェアがディレクトリ以前のドメインまでの部分を補って、
urlを作成します。(そして、そのurlにGETリクエストを出して、ファイルを呼び出そうとします)

では、webサーバソフトウェアが吐き出す、ディレクトリ以前のドメインまでの部分はどう決まるのでしょうか。

とりあえずApacheについて見てみましょう。

ApacheのリダイレクトURLの生成について

ServerName ディレクティブは、 サーバが自分自身を示すスキーム名、ホスト名とポート番号を設定します。 これは、リダイレクトする URL を生成する際に利用されます。

http://httpd.apache.org/docs/current/ja/mod/core.html#servername

ということでhttpd.confに書いてあるServerNameというディレクティブの値を参照して行われるそうです。
httpd.confのここですね。
まあ、この設定ファイルはVirtualHost用の設定ファイルなんで、大元のhttpd.confじゃないんですが。


実は、ServerNameがブラウザから呼び出された時のドメイン名と異なっていても、
他にマッチするVirtualHostがなければApacheの方で気を利かせて、1つしかマッチしていないVirtualHostをマッチさせるそうです。

http://httpd.apache.org/docs/current/ja/vhosts/details.html
http://www.atmarkit.co.jp/ait/articles/0106/01/news002_2.html

DNSをきちんと設定する前に元のさくらのVPSドメイン名で呼び出しても動作していたのは、
「とりあえずIPアドレスからこのサーバってのは分かるぜ〜動いてるホスト名違うけど、こいつでいいや」って感じですかね……


ServerNameの方にポート番号を含めることが出来ますが、
ポート番号がはいっていたとしても、
UseCanonicalName(自分のサーバを示すドメインまでのurlを作成する方法を指定)というディレクティブの値がOff(デフォルトはOff)ならば、
クライアントからのリクエストに含まれるホスト名とポート番号に従って自己参照URLを作成します。
http://httpd.apache.org/docs/current/ja/mod/core.html#usecanonicalname

Apacheへ動かしているRailsに対してはクライアントから
www.app.comでポート番号を含まない形でリクエストを送っていました。

そして、デフォルト設定のままUseCanonicalNameがOffだったので、
Apacheで生成されるリダイレクト用URLは:80などがつかない形になっていた、
そのため、404にならずに取得できた。

WEBrickのリダイレクトURLの生成について

主に、WEBrickについて資料が転がってなくてごろにゃんしていました。
ごろにゃん。
rails sと打ち込んだ時のログメッセージ等を読んで考えたところについて述べておきます。

Railsのルート直下で

これは、IPアドレスはともかく、このサーバにポート番号3000番で飛んできたなら、
このプロセスで受け付ける、とかそういう意味ですよね。

なので、Apacheで動かしているRailsと同じIPアドレスを書いて、:3000をつけて
ポート番号3000を指定したら、WEBrickRailsを呼び出してましたよ、と。

ローカルで申し訳ないんですが、
コントローラ内でbinding.pryを使ってrequest.env関数でSERVER_NAMEなどを出した結果がこれ。

どうもHTTP_HOSTをリダイレクト用URLの生成に使っているみたいです。
そういう設定もできるらしい(Apacheでは)と読んだのですが、WEBrickではこれ以上調べても出てこないし、
萎えたし、ここで疑問がまた生じたし……。

ということでお開きにさせてください。

もしかして、WEBrickのドキュメントルートをきちんと設定したら表示できたんじゃね……とか、
Apacheの方で、:80がつく設定でもファイルが取得できたのではないか?
development環境ではなんで表示されたっけ?
WEBRickの方が動作しなかったのは、DocumentRootの設定が誤っていたためではないか? 等等。

面倒くさくなったので。サーバの設定作業やらコード読みやらが終わって暇になったらまたやります。

 

関連があるんじゃないか

ruby on rails - Configure WEBrick to use automatically generated self-signed SSL/HTTPS certificate - Stack Overflow