2015年4月11日土曜日

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)

■Squid3のインストール


 現在のバージョンは3.1.20。
$ sudo apt-get install squid3

 初期設定を確認するなら
$ cat /etc/privoxy/config | grep -v ^#

 そして設定。
$ sudo nano /etc/squid3/squid.conf

 設定ファイルが超長い!!ので、公式のminimum settingを手直しして、ファイルを1から作ったほうがいいかも。
 ウチの設定はこんな感じ。
http_port [port of Squid3]
htcp_port 0
icp_port 0
cache_peer localhost parent [port of Ziproxy] 0 no-query no-digest no-netdb-exchange
cache_mem 64 MB
cache_dir ufs /var/spool/squid3 1024 16 256
maximum_object_size 32 MB
maximum_object_size_in_memory 64 KB
refresh_pattern ftp: 1440 20% 10080
refresh_pattern gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
hierarchy_stoplist cgi-bin ?
half_closed_clients off
negative_ttl 1 minutes
pipeline_prefetch on
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 192.168.x.0/24 # RFC 1918 possible internal network
acl to_ipv6 dst ipv6
acl winupdate dstdomain .microsoft.com .windowsupdate.com
acl manager url_regex -i ^cache_object:// +i ^https?://[^/]+/squid-internal-mgr/
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access deny to_ipv6 !all
http_access allow manager localhost
http_access deny manager
http_access allow winupdate
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow localnet
http_access deny all
tcp_outgoing_address [RPi2-IPAddr.] !to_ipv6
tcp_outgoing_address [RPi2-IPv6-Addr.] to_ipv6

 IPv6化のための設定をして、他に少し盛り込んである感じ。
 詳しいことは公式faqを参照。
 設定したら再起動。
$ sudo /etc/init.d/squid3 restart

■Privoxyのインストール


 現在のバージョンは3.0.19。
$ sudo apt-get install privoxy

 そして設定。
$ sudo nano /etc/privoxy/config
user-manual /usr/share/doc/privoxy/user-manual
confdir /etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
actionsfile user.action
filterfile default.filter
filterfile user.filter
logfile logfile
listen-address  :[port of Privoxy]
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 1
enable-edit-actions 1
enforce-blocks 0
permit-access 192.168.x.0/24
buffer-limit 8192
forward / localhost:[port of Squid3]
forwarded-connect-retries  0
accept-intercepted-requests 0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
socket-timeout 300

 フィルタ内容は割と頻繁に変えると思うので、WebGUIは殺さずに残しておいた。
 フィルタ内容は「/etc/privoxy/user.action」を直接書いてもいいし、プロキシを通す設定をしたブラウザから「http://p.p/」で現れるPrivoxyのWebUIから設定しても良い。
$ sudo /etc/init.d/privoxy restart

 ウチの場合はWebGUIからmatch-all.actionを編集し、「Set to Cautious」で設定しておいた。
 GIF de-animation?NO!NO!NOooo!
 match-all.actionの設定についてはマニュアルを参照

 user.actionのフィルタは各自で適宜設定する。
 自分の場合は、Android上でFilterProxyを使っていたので、その設定を流用した。

■Muninのインストール


 RPi2を監視できるよう、ついにで入れておく。バージョンは2.0.6。
 以下のページを参考に、OwncloudPieでインストールされたnginxでMuninが参照できるように設定した。

- mk-mode BLOG
Debian 7 Wheezy - サーバ監視ツール munin 導入!

 ウチでは一週間使用して、500MB~700MBで安定して推移している。

■それ以外の設定


 カーネルパラメータの設定とかしてみるといいかもしれない。
 ネットワーク環境がジャンボフレームに対応してるなら、MTUを変えてみてもいいんじゃないだろうか。
(ウチはルータにヤマハのRTX810を使っているため、ジャンボフレーム化はしていない)

 せっかくdnsmasqで宅内DNSキャッシュサーバを立てたのに、IPv6優先設定をしたWindows機だと、先にIPv6を使って、IPv6のDHCP元のISPのDNSに問い合わせてしまって、宅内DNSを使ってくれないのが残念。
 まぁサーバ内部で使う機会が一番多いからいいんですけどね…。

■結果


 Squidのログを確認したところ、SquidからZiproxyに接続できない場合があるため、原因を調査したところ、ZiproxyはIPv6に対応していないことが判明。
 どうやらIPv6アドレスをリクエストした時にZiproxyに接続できず、Squidが直接リクエストを処理していたため気づかなかった模様。
 解決法は以下の2通り。

  1. Squid→Polipoにプロキシをバイパスする(Ziproxyを諦め、IPv6に対応する)
  2. 「/etc/modules」のIPv6モジュールを削除して、PolipoをIPv4対応に戻して不貞寝(IPv6を諦める)

さあ!不貞寝の時間だ!
(2.を選んだ模様)

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)

■Polipoのインストール


 現在のバージョンは1.0.4.1。
$ sudo apt-get install polipo

 そして設定。
$ sudo nano /etc/polipo/config

 のち再起動。
$ sudo /etc/init.d/polipo restart

 ウチの設定内容を晒しておくと…
proxyAddress = "::0"
proxyPort = [port of Polipo]
allowedClients = 127.0.0.1, 192.168.x.0/24
diskCacheRoot = ""
dnsQueryIPv6 = happily
dnsUseGethostbyname = true
pmmFirstSize = 65536
pmmSize = 32768
disableLocalInterface = true
relaxTransparency = maybe

 「relaxTransparency = maybe」は、パイプライン取得に対応していないサイトを表示した場合に502(実際には206)エラーとなるのを回避する。
 具体的にはZiproxyの公式ページから「Download」や「faq」に遷移した場合にエラーとなるのを回避している。

■Ziproxyのインストール


 現在のバージョンは3.2.0。
$ sudo apt-get install ziproxy

 そして設定。
$ sudo nano /etc/ziproxy/ziproxy.conf
Port = [port of Ziproxy]
OnlyFrom = "192.168.x.1-192.168.x.254"
NextProxy="[RPi2-IPAddr.]"
NextPort=[port of Polipo]
UseContentLength = false
ProcessGIF = false
ProcessHTML = false
ProcessCSS = false
ProcessJS = false
ImageQuality = {50,50,80,0}

 また、ownCloudでやりとりする画像まで圧縮しないように、「noprocess.list」に以下を追加。
$ sudo nano /etc/ziproxy/noprocess.list
http://192.168.x.*/*

 のち再起動
$ sudo /etc/init.d/ziproxy restart

 設定については、Ziproxyのソースを落としてREADMEに書いてあることを読んでおくことを推奨。
 元のziproxy.confには「Image quality is specified in integers between 100 (best) and 0 (worst).」と書いてあるけど、0を指定した場合、実際にはZiproxyは処理を行わずに画像をバイパスする。
 また、HTMLを圧縮する設定にしても、子プロキシがSquidの場合は圧縮したHTMLを渡さない、とも書いてある。
 実際に、IE11でF11キーを押して出てくるデバッグモードから確認すると、確かにSquidを通す場合と通さない場合でHTMLの受信サイズ(展開後のサイズではない)が違うので、ZiproxyをSquidの親として設定する場合は、不要な処理をしないように「ProcessHTML」等をfalseにしておくと良い。
 ProcessGIFは…GIFアニメーションが静止画になってしまうのでfalseに。

 自分の場合は、ある程度大きい画像はコンテンツの一部としてみなして圧縮せず、小さい画像はページの装飾物とみなし、画質をある程度落とす程度とした。
 サムネが多い画像掲示板やTumblr、また装飾物が多い楽天のショップ等は、これで結構軽くなった。


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(3)

■Dnsmasqのインストール

現在の(Raspbian-wheezyでの)バージョンは2.62。

$ sudo apt-get install dnsmasq
$ sudo nano /etc/resolv.conf
nameserver 127.0.0.1
nameserver [ISPのDNSサーバ]
 あとは「/etc/hosts」に好きに書いて、再起動すればいいじゃない。
$ sudo /etc/init.d/dnsmasq restart

■ownCloudのインストール


 面倒なのでOwncloudPieを使用。

- GitHub - petrockblog
OwncloudPie

 wheezyのphpバージョンは5.4だけど、php-apcまで導入済み。
 その上、nginxとvarnishまで入るので、既に最適化はされている模様。
 OwncloudPieでは、ownCloudのバージョンは最新版(latest)が入る。
$ sudo apt-get install -y git dialog
$ cd
$ git clone git://github.com/petrockblog/OwncloudPie.git
$ cd OwncloudPie
$ chmod +x owncloudpie_setup.sh
$ sudo ./owncloudpie_setup.sh

 オレオレ証明書の作成は適当に。入力しない項目は“.”を入力すること。

 ちなみに、Apache2版を入れた場合、現在のバージョンのownCloud8では「.htaccessに書かれてるバージョンが違う」と言われてハマる。特別な事情がない限り、素直にnginx版を入れたほうが無難。

 このままでもownCloudは使えるけども、DBにsqliteを使ってしまう。
 sqliteでは管理するファイルが増えてきた場合に遅くなってきてしまう。また、そうなってから別DBに移行しようとすると超絶面倒&失敗すると全てがパァなので、最初からMySQLを使うように設定しておく。
$ sudo apt-get install mysql-server

 インストール時にMySQLのパスワードを設定しておく。
$ sudo apt-get install php5-mysql
$ sudo mysql -u root -p

 ここでMySQLのパスワードを聞かれるため、インストール時に設定したパスワードを入力する。
mysql> create database owncloud default character set utf8;
mysql> show databases;
mysql> grant all on owncloud.* to owncloud@localhost identified by '[owncloud@localhostのパスワード]';
mysql> \q

 あとは「http://[RPi2-IPAddr.]/owncloud」で現れるowncloudの初期設定画面から、DBにMySQLを使うよう設定すればOK。

 TS-121のownCloud6より、ずっと早い!!
 Android機での同期速度は2MB/sくらい(FolderSyncを使用)ですが、実際にUp/Downを頻繁にするわけでもないので、まぁこれはこれで。

 2GB程度の同期チェックで1分程度なので、遅いと見るか早いと見るか…。
 物足りない人はBittorent Syncなんかを使うといいかも。


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)

■RaspbianをUSB-SSDから起動させる


 USBメディアから起動させる方法は、調べればチラチラ出てきます。
 無駄なくキチンとやりたい場合は、以下のようなページを参考にどうぞ。

- 屋根裏Linux
05 Raspberry PiファイルシステムHDD化 その1/3 (HDD接続~データ移行)

- 月と杜
Raspberry Pi USB HDD起動

 自分の場合は…面倒なので、以下の方法を取りました。
 富豪的アプローチで良ければこちらをどうそ。

  1. 4GB以上のmiscroSDカードにRaspbianを焼く
  2. そのままUSB-SSDにもRaspbianを焼く
  3. 1.で焼いたmicroSDカードのconfig.txtとcmdline.txtを書き換える
  4. GParted等のパーティション操作ツールでSSD上のext領域を拡張する

…というもの。SSDの先頭60MBくらいは無駄に空くけど、FATフォーマットして設定ファイルのバックアップ先として使ってもいいんじゃないの?(適当)

 1.と2.は…特に特殊なことはせず、3.ではUSBの電力アップと、起動先の変更のために以下を変更。

【config.txtに追記】

safe_mode_gpio=4
max_usb_current=1
gpu_mem=16

【cmdline.txtを変更】

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline rootwait

 microSDはFAT領域に書かれた内容(/boot)しか使わないので、容量が少ない別のmicroSDをFATフォーマットして、そっちに内容を移してもいい。自分は1GBのmicroSDに内容を移して使っている。

 4.も各自好きな方法で…LiveCDとかUSBからUbuntuとかのLinuxを立ち上げてGPartedを使ったり、PartitionMagicを使ったりとかで。
 自分の場合はEeePC901X上のLinuxBeanでGPartedを使って拡張した。
 ちなみに、raspi-configで4.をやろうとしても、「SDカードじゃないからできないよ」的なメッセージが出るので注意。

 sda2を最大拡張してもいいけど、inodeが気になる人は別パーティションを作って、SquidのキャッシュとかownCloudのデータをそっちに退避させると良いかも。

 ここまでで準備したmicroSDとUSB-SSDとUSB-GbEアダプタと、ひとまずHDMIとUSBキーボードもRPi2に繋いで、電源オン。

 raspi-configとかrpi-updateとかする前に、まずはUSB-GbEアダプタを使えるように設定。
$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1
iface eth1 inet static
address [RPi2 IPAddress]
netmask 255.255.255.0
gateway [Gateway IPAddress]
broadcast [Broadcast IPAddress]
 broadcastは無くても良いが…。

■IPv6対応&ポート閉塞


 次に、IPv6対応させるための設定。(IPv6対応させない場合は飛ばして良い)
 ついでに、音なんて鳴らさないのでサウンドモジュールはコメントアウト。
$ sudo nano /etc/modules
#snd-bcm2835
ipv6
 後はraspi-configでお好きな初期設定を。
$ sudo raspi-config
一応、raspi-config自体をupdateして、

  • Xを起動しない
  • サーバ名変更
  • timezone変更
  • ja-JP.UTF-8とja-JP.EUCの追加(LANGはen-GB.UTF-8のまま)
  • enable SSH

をするくらいか。RPi2の場合はoverclockしなくてもよいかと。
 さらに、サーバとして使用するのに不要なパッケージを削除。
$ sudo aptitude

 出てくるメニューから、以下の項目を探して“_”→“g”→“g”でパッケージ削除。

  • X11
  • gnome

 さらにdbus関連と、何やら残るゴミも削除。
$ sudo apt-get remove dbus
$ sudo apt-get autoremove
$ sudo apt-get autoclean
$ rm -rf /home/pi/python_games/
$ sudo rmdir /usr/local/games/
$ sudo rmdir /usr/games/

 ここまでできたらようやく最新化。

$ sudo rpi-update
$ sudo apt-get update
$ sudo apt-get dist-upgrade
 IPv6の場合は、ルータのファイアウォールでは外部パケットが弾かれないため、外部から直接アクセスできてしまう。
そのため、iptablesを変更してRPi2へIPv6でアクセスすることを禁止する。
 自分の場合はufwで全ポートを閉じ、IPv4のみポートを開く設定とした。
$ sudo apt-get install ufw
$ sudo ufw enable
$ sudo ufw default DENY
$ sudo ufw allow from 192.168.x.0/24

 セグメントは適宜変えておくこと。
 ufwについてはUbuntu Weekly Recepi76回77回を参考にした。慣れてて良かったUbuntu。ありがとう技術評論社。

 ここまでしたら電源を落として、USB-GbEにLANケーブルを繋げて再起動。
 HDMIとUSBキーボードも不要の場合はここで外してしまって良い。
$ sudo halt

 続けて「shutdown -h now」しなくて良いなんて、いい時代になったなぁ…。
 もう本体自体は弄らないので、RPi2を設置場所へ持って行ったら電源投入して、あとはSSH接続で以下続行。

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する(3)に続く...

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(1)

※このページは能書きのため、実際の設定は以下のページを参照。
※「IPv6対応」と謳いながら、ZiproxyはIPv6に対応できていない。詳細は「■結果」を参照。

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)
 ■RaspbianをUSB-SSDから起動させる
 ■IPv6対応&ポート閉塞

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(3)
 ■ownCloudのインストール
 ■Dnsmasqのインストール

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(4)
 ■Polipoのインストール
 ■Ziproxyのインストール

キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(5)
 ■Squid3のインストール
 ■Privoxyのインストール
 ■Muninのインストール
 ■それ以外の設定
 ■結果

 2012~2013年は、新居の設計、引っ越し、転職…といろいろあったけど、それはそれとして一気に省略。
 2012年のおれに言いたいこととしては…
  • 全てのコンセントは3極にしておけ!
  • 壁面に埋め込まれるLANのケーブルは、黙ってカテゴリ7にしておけ!
という事くらい。あとは概ねいいチョイスだったぞ!過去のおれ!

■キャッシュサーバをCubox→TS-121→RaspberryPi2に移行するまで


 引っ越しの際、NASをQNAP TS-121に変更したため、Squid、PrivoxyはCuboxからこちらに移行。
 空いたCuboxにGeexboxを入れてUSB-DACに繋いで遊ぶか…と思い立ち、久々にCuboxを触ると、SolidRunのHPからCuboxのWikiが消えてしまい、ググっても出てくるのはCubox-iとHummingBoardの情報ばかり。
 Geexboxも、Cubox-Installerから入れられるのはarmhf版のNightlyBuildだけで、USB-DACを繋ぐとフリーズするので、公式ページを覗きに行くと、まさかのISISクラッキング。
 こりゃちょっと安心して遊べないぞ…ということで、代替わりしたRaspberryPi2(以下RPi2)でいろいろ遊んでいたところ、以下のページを発見。

- Midwestern Mac, LLC
Getting Gigabit Networking on a Raspberry Pi 2 and B+


 そういや、丁度手元にUSB3.0のUSB-GbEアダプタがあるな…とpingを使って簡単に計測すると、200Mbpsとまではいかないが、160Mbpsは出ている計算。

  60000(Bytes ping packet) * 2(Times[Up/Down]) * 8(byte to bit) / 0.006(sec) = 160Mbps
    ※玄人志向 GbE-USB3.0S2とサンワサプライ 400-HUB022で確認。どちらも同値。

 暗号化しないFTPでも150~200Mbpsは出ているので、これは案外使えるんじゃね?ということで、ついカッとなってRPi2をサーバに仕立てて遊んでみた。後悔はしていない。…多分。
(もうすぐDebian-jessieがリリースされるのにwheezyか…とかその辺は置いとく)
 初代RPi(メモリ256MB版)でも実測120Mbpsは出ているので、そちらでもメモリが許す限りの範囲でサーバ化は可能なんじゃないだろうか。
(512MBは実測前に友人に譲渡したので不明。B+、A+はそもそも持ってないので実測していない)

■RPi2をサーバ化してやってみたいこと

  • TS-121にownCloud6を入れて、あまりの遅さに使用を断念したので、RPi2上のownCloud8はどんなモンだか使ってみたい
  • 引っ越しに当たり、NGNのIPv6-IPoE環境に移行したので、入れるサーバもIPv6化しておきたい
  • Polipo+Ziproxy+Squid3+Privoxy+dnsmasqで「ぼくのかんがえたさいきょうのキャッシュサーバ」を作ってみたい
というわけで、Cuboxで使っていた64GB-SSDもSATA-USB変換をカマして接続し、本格的にサーバ化してみたのでした。
 ちなみに、構成としては以下の通り。

THE INTERNET !!
Polipo
Ziproxy
Squid3
Privoxy
Client(PC, Tablet, etc...)

Polipo:外部サーバとのアクセスをHTTP1.1化
Ziproxy:画像ファイルの画質をある程度犠牲にして再圧縮して省サイズ化
Squid3:ziproxyで圧縮した状態のファイルをキャッシュ
Privoxy:広告等の不要なリクエストをリジェクト

…という構成。IPv6対応させるためにSquidは2系じゃなく3系を使用。
 普段はPolipo+Squid3で、スマホやVPNの場合だけZiproxy+Privoxyを使う、という場合は、SquidとZiproxyを入れ替えてもいいかもしれない。
 また、Privoxyより上位のプロキシに直接接続できるよう、意図的に接続先を絞っていないので、プロキシ全体が安定してきたら、接続先を絞っておくと良い。

 「IPv6-IPoEならPPPoEの速度制限を受けないから、キャッシュ要らなくね?」という問いには聞こえないフリをしますよ?


キャッシュサーバとownCloudサーバをRaspberryPi2に移行する-IPv6対応(2)に続く...