VMwareのホスト・ゲスト間ファイル共有機能は便利な機能であるわけだが、 CentOS 7.3 と VMware Tools 10.0.x の組合わせではコンパイルエラーが生じてToolsのインストールが失敗し、ファイル共有が使えない。

具体的にはこんなエラー。

/tmp/modconfig-CXZXGV/vmhgfs-only/page.c:1649:23: エラー: 関数 ‘wait_on_bit’ への引数が多すぎます
                       TASK_UNINTERRUPTIBLE);
                       ^
In file included from include/linux/mmzone.h:9:0,
                 from include/linux/gfp.h:5,
                 from include/linux/mm.h:9,
                 from include/linux/pagemap.h:7,
                 from /tmp/modconfig-CXZXGV/vmhgfs-only/page.c:28:
include/linux/wait.h:1044:1: 備考: ここで宣言されています
 wait_on_bit(void *word, int bit, unsigned mode)
 ^
make[2]: *** [/tmp/modconfig-CXZXGV/vmhgfs-only/page.o] エラー 1

現時点で最新の VMware Tools 10.1.0 build-4449150 を手動ダウンロードして導入し解決。

元情報
VMware Tools 10.1.0 build-4449150

ダウンロードした VMware-Tools-10.1.0-core-4449150.tar.gz に収録されている linux.iso をゲストOSでマウントし、あとはいつもの手動インストールを行う。

Apacheと比べて、軽い速いという定評のlighttpd(ライト・ティーピーディーとか、ライティーと呼ばれてます)。

自分の会社でも、PHPやらRoRやらCGI系を動かす関係上、FastCGIとの相性も良さげなlighttpdをメインWWWサーバーとして使っている。
で、やっぱり業務でSVNとかWebDAVとか使いたいのですが、WebDAVはともかく、SVNはApacheでいうところのmod_dav_svn相当の機能がなかったりするんだな。

そこで、lighttpdをプロキシにして、バックエンドにApacheを置いてSVNとかWebDAVをしようという試み。

CentOS 5.5にlighttpdを導入する方法はここをみてね。

■構成はだいたいこんな感じ

バックエンドとしてApacheを立てる。今回はlighttpdと同一サーバ上に立てるため、ポートを8080とかに変更。
mod_davとmod_dav_svnで、普通にSVNやWebDAVを動かしておく。

フロントは、lighttpdで、SSLサイトを作る。
で、Basic認証を行いつつ、プロキシ機能で、バックエンドのApacheに転送する。
SSLはlighttpdで終端。(フロント->バックエンドはhttp)

■まず、Apacheの設定

ポート番号変更ね。


[root@kvm1 ~]# vi /etc/httpd/conf/httpd.conf
・・・
Listen 8080
・・・

あとSVN&WebDAV設定だけど、CentOSのRPM版では、/etc/httpd/conf.d配下の*.confが全てhttpd.confにインクルードされるようになってるので、ここに個別に設定ファイルをつくります。

まずSVN。当然だけどサーバ上でまずSVNリポジトリを作っておく必要あり。ここでは/var/db/svnにリポジトリを置いて、それをhttp://(ホスト名)/svn/でアクセスさせる予定。


[root@kvm1 ~]# vi /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
<Location /svn>
  DAV svn
  SVNParentPath /var/db/svn
</Location>

次にWebDAV。mod_davはhttpd.conf側でロードされるだよ。
RequestHeaderうんたらの部分は何をしているかというと、WebDAVのCOPYとかMOVEはhttpリクエストヘッダにコピー/移動先となるURLを乗っけてくるため、プロキシが見逃して変換してくれない。よって、WebDAV側で外向けURL(FQDN。SSLつき)からWebDAVサーバ上で通用するURL(自分自身。SSLなし)に変換しないといけないんだな。


[root@kvm1 ~]# vi /etc/httpd/conf.d/dav.conf
RequestHeader edit Destination ^https://(ホスト名)/ http://localhost:8080/ early
<Location "/dav">
  Options -Indexes
  Dav on
</Location>

■lighttpdの設定


[root@kvm1 ~]# vi /etc/lighttpd/lighttpd.conf
・・・
(SSLサイトですよの設定)
$SERVER["socket"] == ":443" {
  ssl.engine = "enable"
  ssl.pemfile = "/etc/lighttpd/ssl/server.pem"
  server.document-root = "/var/www/lighttpd-ssl"

(認証。LDAP連携してます)
  auth.backend = "ldap"
  auth.backend.ldap.hostname = "localhost"
  auth.backend.ldap.base-dn = "ou=People,dc=foo,dc=bar"
  auth.backend.ldap.filter = "(uid=$)"
  auth.require = (
    "/svn" => (
      "method" => "basic",
      "realm" => "Subversion Auth Realm",
      "require" => "valid-user"
    ),
    "/dav" => (
      "method" => "basic",
      "realm" => "WebDAV Auth Realm",
      "require" => "valid-user"
    )
  )

(プロキシ。自分の8080へ転送する感じで)
  proxy.server = (
    "/svn" => (
      ( "host" => "127.0.0.1", "port" => 8080 )
    ),
    "/dav" => (
      ( "host" => "127.0.0.1", "port" => 8080 )
    )
  )
}

“host”値はIPアドレスな感じで。8080はダブルクォートで囲まない感じで。
あと公開パスとバックエンド側のパス(例えばここでは”/dav”とか)が相互に異なると、これまたDestinationヘッダ変換問題がややこしいことになるんで、合わせるがよい。頑張りたい人だけ頑張ってくれ。

■Expectヘッダ問題。

WebDAVクライアントによっては、たとえばPUT時なんかに「Expect: 100-continue」っていうヘッダをつけてリクエストしてくるんだけど、このヘッダの意味をlighttpdが理解できず、「417 Expectation failed」エラーが出たりします。
クライアント側でこのヘッダを送出しない設定などを行って回避してくれ。
なんかこのごろ、nginxとかに押され気味だよなあlighttpd。

■etc

Windows標準の「ネットワークプレース」はオレオレ証明書だとNGだったりする。(XPは大丈夫?だったかも。Vistaは駄目)
まあWindows標準のWebDAVクライアント機能はクズなんで、良い子のみんなはCarotDAVとかTeamfileとか使ってください。フリーウェア万歳。

Virtual Host + SSL を使いたいのと、仕事だとアンパイな Apache ばかりで飽きたので、lighttpd を入れる。

■Fedora EPEL リポジトリを設定
Apache 勢力の陰謀なのか、lighttpd パッケージは CentOS で初期設定されているリポジトリにはなくて、Fedora EPEL リポジトリというところにおいてある。以下でリポジトリ設定をインストールし使えるようにする。
ちなみに 32bit 版のひとは x86_64 が i386 に変わるよ


[root@kvm1 ~]# wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-3.noarch.rpm
[root@kvm1 ~]# rpm -Uvh epel-release-5-3.noarch.rpm

■lighttpd インストール
ってことで、素直に yum を使いインストール。


[root@kvm1 ~]# yum install lighttpd

■ファイアウォール設定
80と443を通すよう設定してiptables再起動。


[root@kvm1 ~]# vi /etc/sysconfig/iptables
[root@kvm1 ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@kvm1 ~]# service iptables restart
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中filter                   [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]
iptables モジュールを読み込み中ip_conntrack_netbios_ns     [  OK  ]

■他のPCなどからアクセステスト
紙飛行機のロゴが出てきたらOK。