Apache

【apache】mod_rewrite再入門。

ということで下記のページが非常に参考になる。

http://tm.root-n.com/server:apache:module:rewrite

クリックカウントも取れたりするんだね。

 

【Node.js/Apache】一つのサーバーで双方を共存させる。

Node.jsとApacheを一つのサーバーで共存させるためには、apache側かNode側のいずれかでリバースプロキシを構築してやる必要がある。
今回はNode.jsのsocket.ioを用いたwebsocket通信を行いたかったので、評判の良いNodeのプラグイン「http-proxy」を導入してみた。

今回の想定はNodeのアプリケーションをポート3000番、
Apacheのアプリを9000番で動作させる想定。

まずはhttpd.confのリッスンポートとバーチャルホストのポートを80番以外に避難させる。

・/etc/httpd/conf/httpd.conf

NameVirtualHost *:9000
Listen 9000

そしてバーチャルホストの設定も変更。

<VirtualHost *:9000>
    ServerName example.local
    DocumentRoot /path/to/root/dir
    RewriteEngine On
    <Directory "/path/to/root/dir">
        Options Indexes FollowSymlinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

次にNodeのサーバースクリプトを書く。

var httpProxy = require('http-proxy');

var proxy = httpProxy.createProxy();

var options = {  
    'hoge.local.lcl': 'http://localhost:9000',
    'fuga.local.lcl': 'http://localhost:9000',
    'piyo.local.lcl': 'http://localhost:9000',

    'node.local.lcl': 'http://localhost:3000'
}

require('http').createServer(function(req, res) {
    
    if (req.headers.host == 'nodechat.local.lcl') {
        proxy.ws(req, socket, head, {
            target: options[req.headers.host]
        });
    } else {
        proxy.web(req, res, {
            target: options[req.headers.host]
        });
    }
    
}).listen(80);

console.log('Proxy works.');

あとはこのスクリプトをnodeコマンドで起動すればOK。

 

PHPにてgetaddrinfo failedにぶち当たった。

例えばfile_get_contentsでURLを指定した時。
sshからphpを叩くと正常に返ってくるのにapacheを通したブラウザから叩くと下記のようなエラーになる。

php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution

これが調べたけど全然解決しない。ただ分かったことはDNSの名前解決周りでこけているであろうという事。

視点を切り替えapache、DNSといったキーワードで調べていると、HostnameLookupsをどうのこうのという記事を発見。
そこでhttpd.conf内にあるHostnameLookupsの項目を調査してみたところOffになっているではありませんか。
とりあえず下記のように設定をOnに変更しhttpdを再起動。

HostnameLookups On

するとapacheを介してもfile_get_contentsが動いた!やった!!けどクッソ遅い!!!なんで!!!!
再度調査開始である。今回はapache、遅い、で検索すると意外とすんなりヒット。
しかし見つけた記事はといえば、HostnameLookupsをOffにしろと書いているではありませんか。
いやいや、それやるとネットワークが外でていってくれないんすよ、とか思いつつとりあえずやってみる。

変更後httpdを再起動してアクセスしてみると、あれ?ちゃんと動いてる。しかも早い!なんで!!
エラー吐いて終わるだろうと予想していたのに、じゃあ最初の状態はなにがよろしくなかったんすかね…。

これがまれによくある気にしちゃいけないヤーツーである。
※原因が判明し次第まとめよう。笑