iPhoneの3G通信が遅い、重い。
やりましょう。
必要なもの (ハードウェア)
必要なもの (ソフトウェア)
- ImageMagick
- apache
- mod_proxy
- mod_deflate
- mod_ext_filter
設定
<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側の設定は半端だし、そもそも速くならないし、さんざんな結果ですね。たぶん自分でやれることなんてないんです。アンテナ増強を待つ方が賢明なんです。そんなことを学んだ気がします。
このエントリーに対するコメント
-
こんにちは。参考サイトに取り上げていただきましたmetaです。
3Gでのプロキシの使用ですが、3G回線でVPNを使用すると
プロキシサーバの設定が可能です。またプロキシサーバの
アクセス制御ですが、3G回線でプロキシを使用するには
VPNが必要ですのでこれを逆手にとって、VPNでユーザ認証を
行い、VPN経由の場合はプロキシ側でのBasic/Digest認証は
要求しないという運用にすればiPhoneがProxy-Authorization
ヘッダを送信しないためにProxyが407を返してしまうという
事態が回避できるようになります。お試しください。
2010年08月14日, 7:01 AM
-
なるほど、確かにVPN接続必須にしてproxyをプライベートネットワーク側に持ってきてしまえば特に認証は要らないですね。
手持ちのルータがpptpに対応しているので今度試してみます。
わざわざコメントいただきありがとうございます!2010年08月16日, 1:55 PM
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
「いいね!」で応援よろしくお願いします!