通信量削減で快適スマートフォン計画 このエントリをはてなブックマークに登録

2010年08月13日

ishizimaishizima / ,

iPhoneの3G通信が遅い、重い。

こんな事をボヤいている人をチラホラ見かけます。
電波の入らないシチュエーションはそんなにないんですけど、ページの読み込みが遅くてイライラする、なんてシチュエーションが最近多いような。そこで、アンテナ増強を待つのもいいけどまず自分でやれることをやってみよう!と思い立ち、狭い帯域を有効に使うべく通信量を減らす工夫をこらしてみる事にしました。

やりましょう。

やり方は、PHS時代に流行った昔懐かしい圧縮Proxy。当時と同様、テキストデータを圧縮するだけじゃなく画像データの画質を落とす処理も併用して通信するデータ量を減らします。

必要なもの (ハードウェア)

proxyサーバなので、何かしらサーバが必要になります。apacheとImageMagickが動けば何でも構いません。
僕は自宅のNASで試してみました。( http://www.qnap.com/jp/pro_detail_feature.asp?p_id=135 )
自分が外出中、自宅のNASは何もしていないないし、Proxyサーバは外出中しか使いません。なのでちょうどいいんじゃないかなーと。NASは当然LANの中にいるので、今回使うポートだけを外部に公開するようルータに設定を行っています。

必要なもの (ソフトウェア)

以下のものが必要になります。無い場合は適宜インストールしましょう。
  • ImageMagick
  • apache
    • mod_proxy
    • mod_deflate
    • mod_ext_filter

設定

最初に理屈を説明すると、mod_proxyでproxyを作り、mod_ext_filterで流れるデータのフィルタを作ります。フィルタの内容は、mod_deflateによるhtmlの圧縮及びImageMagickによる画像の再圧縮です。画像の再圧縮は、元画像より劣化と引き替えに大きく圧縮率を上げることで、ファイルサイズを削減します。
以下の内容のファイルをServerRoot/conf.d/あたりにでも適当なファイル名で置いておきましょう。
<IfModule mod_ext_filter.c>
  # 画像圧縮フィルタを定義
  ExtFilterDefine jpeg-filter mode=output intype=image/jpeg cmd="/opt/bin/convert -quality 15 +profile \"*\" jpeg:- jpeg:-"
  ExtFilterDefine png-filter mode=output intype=image/png cmd="/opt/bin/convert -colors 16 -colorspace Transparent -quality 90  +dither +profile \"*\" png:- png:-"
  ExtFilterDefine gif-filter mode=output intype=image/gif cmd="/opt/bin/convert +adjoin gif:- gif:- | /opt/bin/convert -colors 16 +dither -colorspace Transparent +profile \"*\" gif:- gif:-"
        <ProxyMatch \.(jpe?g|JPE?G)$>
          SetOutputFilter jpeg-filter
        </ProxyMatch>
        <ProxyMatch \.(gif|GIF)$>
          SetOutputFilter gif-filter
        </ProxyMatch>
        <ProxyMatch \.(png|PNG)$>
          SetOutputFilter png-filter
        </ProxyMatch>
        <ProxyMatch \.(html|htm|shtml|txt|TXT|cgi|jsp|pl|php|xml|rdf|rss|cfm|asp|css|js|json)>
          SetOutputFilter DEFLATE
        </ProxyMatch>
        #URLの最後が"/"の場合はDEFLATEフィルタを利用(圧縮転送)
        <ProxyMatch "\/$">
          SetOutputFilter DEFLATE
        </ProxyMatch>
</IfModule>

<IfModule mod_deflate.c>
  #圧縮率の設定(9:最高圧縮率)
  DeflateCompressionLevel 9
  #圧縮比をログに残すときの名前
  DeflateFilterNote Ratio ratio
  #圧縮率(ratio)を追加したカスタムログを定義
  LogFormat "%h %l %u %t \"%r\" %>s %b (%{ratio}n%%)" common_deflate
</IfModule>

<IfModule mod_proxy.c>
  # ポート3812で公開
  Listen 3812
  <VirtualHost _default_:3812>
    CustomLog /var/log/httpd/proxy.log common_deflate
    ErrorLog /var/log/httpd/proxy_error.log
    # プロキシ機能を有効にする
    ProxyRequests On
    # プロキシ特有のヘッダを付与しない
    ProxyVia Block

    <Proxy *>
      Order deny,allow
      Deny from all

      # 認証の設定
      AuthType Basic
      AuthName "ProxyAuth"
      AuthUserFile /opt/etc/apache2/.htpasswd
      Require valid-user
      Satisfy Any

      # 文字コード指定のヘッダを付与しない
      AddDefaultCharset Off

    </Proxy>
  </VirtualHost>
</IfModule>

ポート3812でProxyサーバとして公開し、勝手に使われないようBasic認証を設定します。冒頭のExtFilterDefineで定義している画像圧縮フィルタは、ImageMagickのconvertコマンドを使用しています。オプションの指定などはImageMagick関連のドキュメントをご参照ください。また、設定内のパスは各環境に合わせて適宜読み替えてください。

幾つかのサイトから設定値を拝借したものにアレンジして上記の内容にしてみたんですけど、もっとキレイに書けるよ!って人がいたら教えてください。ProxyMatchのところ、拡張子でしか指定できないあたりが気になってます。MIMEタイプでいければなぁ。

参考サイト

meta’s hiki – Apache2 + ImageMagick で圧縮プロキシ

http://w.vmeta.jp/hiki/?Apache2%20%2B%20ImageMagick%20%A4%C7%B0%B5%BD%CC%A5%D7%A5%ED%A5%AD%A5%B7

Linux/Apacheで圧縮・減色WebProxy構築

http://www.mattun.net/?page=Linux%2FApache%A4%C7%B0%B5%BD%CC%A1%A6%B8%BA%BF%A7WebProxy%B9%BD%C3%DB

iPhone側の設定

前項の内容でapacheが起動して外部ネットワークからの導通も確認したら、早速iPhoneから接続してみましょう。ってここまで書いて気付いたんですけど、

iPhoneって3G回線だとProxyの設定できないじゃん!!

うわ、すごい罠。この記事書く前に検証してたんですが、そん時はPocketWiFi使って無線LAN経由でEMobileの3G回線使ってたんですよね……。確かにこのケースなら福音になりうるといっても、PocketWiFi持ってる人もそんなに多くないだろうし……。

とりあえず、PixyというProxyを設定できるブラウザアプリを見つけました。

→ http://itunes.apple.com/jp/app/pixy/id348377321?mt=8

それから、一応WiFiの場合のProxy設定方法を書いておきます。PocketWiFiみたいなポータブルルータをお使いの方はこんな感じで設定しましょう。

「設定」 → 「Wi-Fi」 → 接続中のワイヤレスネットワーク右端の矢印

次に設定画面一番下の「HTTPプロキシ」に設定内容であるProxyサーバのIPとポート、それから設定したID/PWを入力します。

※ここでID/PWを入れても、SafariでWebアクセス開始した瞬間にID/PWを訊かれます。どうやら設定しても無駄な模様……。

効果測定

では、3GならPixy、WiFiならSafari等を起動して効果のほどを確認してみましょう。

僕の環境では見事に遅くなりました!!

体感速度半分以下です。なんだこれ。ARMの800MHzじゃだめなんか。

ちなみに、Penryn 2.4GHzのMacBook Proを同じように設定してProxyに仕立ててiPhoneから接続すると結構サクサクなので、やはりCPUパワーが足りないようです。

その他の問題

Proxyの認証周りに問題があるようです。多分クライアント側に原因があると思うのですが、アクセス先サイトが画像などを別ホストに置いていると、そこへのアクセスには認証情報が付いてこない、という症状です。

アクセス先がhttp://www.example.comで、その中のhtmlのimgタグなんかにhttp://image.example.com/hoge.jpgなんて書いてある場合、後者へのアクセスにBasic認証のヘッダが付かないため(正確には付いたり付かなかったり)、Proxyが407を返してしまって画像が取得できない、という状態になります。Digest認証にしてみても症状が変わらないため、認証方式の問題ではなさそうです。今のところ解決策が見つからず困っています。

最後に

色々頑張ったんですけど、iPhone側の設定は半端だし、そもそも速くならないし、さんざんな結果ですね。たぶん自分でやれることなんてないんです。アンテナ増強を待つ方が賢明なんです。そんなことを学んだ気がします。

関連記事

クレイについてもっと知りたい方は…

  1. クレイの3つの強みを見てみる。
  2. WEBシステムのことなら何でもご相談ください。

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント

  1. こんにちは。参考サイトに取り上げていただきましたmetaです。

    3Gでのプロキシの使用ですが、3G回線でVPNを使用すると
    プロキシサーバの設定が可能です。またプロキシサーバの
    アクセス制御ですが、3G回線でプロキシを使用するには
    VPNが必要ですのでこれを逆手にとって、VPNでユーザ認証を
    行い、VPN経由の場合はプロキシ側でのBasic/Digest認証は
    要求しないという運用にすればiPhoneがProxy-Authorization
    ヘッダを送信しないためにProxyが407を返してしまうという
    事態が回避できるようになります。

    お試しください。

    meta

    2010年08月14日, 7:01 AM

  2. なるほど、確かにVPN接続必須にしてproxyをプライベートネットワーク側に持ってきてしまえば特に認証は要らないですね。
    手持ちのルータがpptpに対応しているので今度試してみます。
    わざわざコメントいただきありがとうございます!

    ishizima

    2010年08月16日, 1:55 PM

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


トラックバック

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ