FreeBSD14にApache+SubversionをインストールしてNginxからリバースプロキシ

Subversionの容量が増えてきたので、複数サーバーにSubversionをインストールしてリポジトリを分けようとしているときの覚書。

環境: FreeBSD 14.0, Apache 2.4.59, Subversion 1.14.3


1. Apacheをインストール

pkg経由でインストール。
# pkg search apache
# pkg install apache24

ビルドオプションを確認。
# apachectl -V

Server version: Apache/2.4.59 (FreeBSD)
Server built:   unknown
Server's Module Magic Number: 20120211:131
Server loaded:  APR 1.7.3, APR-UTIL 1.6.3, PCRE 10.43 2024-02-16
Compiled using: APR 1.7.3, APR-UTIL 1.6.3, PCRE 10.43 2024-02-16
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses disabled)
 -D APR_USE_FLOCK_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/usr/local"
 -D SUEXEC_BIN="/usr/local/bin/suexec"
 -D DEFAULT_PIDLOG="/var/run/httpd.pid"
 -D DEFAULT_SCOREBOARD="/var/run/apache_runtime_status"
 -D DEFAULT_ERRORLOG="/var/log/httpd-error.log"
 -D AP_TYPES_CONFIG_FILE="etc/apache24/mime.types"
 -D SERVER_CONFIG_FILE="etc/apache24/httpd.conf"

自動起動するように設定。
# sysrc apache24_enable="yes"

サービス名とか起動スクリプトを確認。
# less /usr/local/etc/rc.d/apache24

設定ファイル編集してポート番号を変更する。
# less /usr/local/etc/apache24/httpd.conf

Listen 8080
ServerAdmin info@hoge.jp

configtestしてApache起動。
# apachectl configtest
# service apache24 start

待ち受け中のポート確認。
# netstat -an -p tcp


2. Subversionをインストール

pkg経由でインストール。
# pkg search subversion
# pkg install subversion

Apache用モジュールをインストール。
# pkg search dav_svn
# pkg install mod_dav_svn

モジュールのconfファイルを確認。
# less /usr/local/etc/apache24/modules.d/220_subversion.conf

CentOSと違ってコメントアウトされていた。


3. ApacheとNginxの設定

リポジトリの置き場所を作成してApacheの設定ファイル編集。
# mkdir -p /home/svn/repo/
# cd /usr/local/etc/apache24/Includes/
# vim 01_svn.conf

LoadModule dav_module         libexec/apache24/mod_dav.so
LoadModule dav_svn_module     libexec/apache24/mod_dav_svn.so
LoadModule authz_svn_module   libexec/apache24/mod_authz_svn.so
LoadModule dontdothat_module  libexec/apache24/mod_dontdothat.so

<VirtualHost *:8080>
  ServerName svn.hoge.co.jp
  <Location />
    DAV svn
    SVNParentPath /home/svn/repo
    SVNListParentPath on
  </Location>
</VirtualHost>

Apache再読み込み。
# apachectl configtest
# service apache24 reload

nginxにリバースプロキシの設定をする。
ついでにcertbot用の設定も記述しておく。
# cd /usr/local/etc/nginx/conf.d/
# vim 02_svn.conf

server {
    listen       80;
    server_name  svn.hoge.jp;

    # Accept for Let's Encrypt(certbot)
    location /.well-known/acme-challenge {
        access_log off;
        root /usr/local/www/nginx/;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header Destination $http_destination;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8080;
    }
}

nginx再読み込み。
# nginx -t
# service nginx reload

テスト用のリポジトリを作ってウェブ経由でチェックアウトできるか試す。
# cd /home/svn/repo/
# svnadmin create test
# chown -R www:www test/

TortoiseSVNでチェックアウトしてコミットできるか確認する。


4. HTTPS化

NginxまでをTLSで暗号化する。
certbotで証明書取得。
# certbot certonly --webroot -w /usr/local/www/nginx/ -d svn.hoge.co.jp

nginx設定ファイル編集。
ついでに日本からのIPアドレスしか許可しないようにする。
# cd /usr/local/etc/nginx/conf.d/
# less 02_svn.conf

server {
    include conf.d/include/ssl_listen.inc;
    server_name  svn.hoge.jp;

    # Accept for Let's Encrypt(certbot)
    location /.well-known/acme-challenge {
        access_log off;
        root /usr/local/www/nginx/;
    }
 
    # Restrict access from Japan
    include conf.d/include/allow/JP.inc;
    deny all; 
 
   # Fixed for move japanese file in svn
    set $fixed_destination $http_destination;
    if ( $fixed_destination ~ ^https(?<myurl>.*)$ ) {
        set $fixed_destination "http$myurl";
    }

    location / {
        client_max_body_size 300M;
        access_log off;
        error_log /dev/null;

        proxy_set_header Host $http_host;
        proxy_set_header Destination $http_destination;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8080;
    }

    include conf.d/include/ssl.inc;
    ssl_certificate         /usr/local/etc/letsencrypt/live/svn.hoge.jp/fullchain.pem;
    ssl_certificate_key     /usr/local/etc/letsencrypt/live/svn.hoge.jp/privkey.pem;
    ssl_trusted_certificate /usr/local/etc/letsencrypt/live/svn.hoge.jp/chain.pem;
}

nginx再読み込み。
# nginx -t
# service nginx reload

さっきのtestリポジトリをRelocateして確認。


5. リポジトリへのアクセス制限

Basic認証ユーザーを作成する。
# cd /home/svn/
# htpasswd.py -b -c .htpasswd daiki password

Subversionのアクセス制御ファイルを作成。
# vim .htauthz

[groups]
admin = daiki

[/]
* =
@admin = rw

httpd設定ファイル編集。
# cd /usr/local/etc/apache24/Includes/
# less 01_svn.conf

LoadModule dav_module         libexec/apache24/mod_dav.so
LoadModule dav_svn_module     libexec/apache24/mod_dav_svn.so
LoadModule authz_svn_module   libexec/apache24/mod_authz_svn.so
LoadModule dontdothat_module  libexec/apache24/mod_dontdothat.so

<VirtualHost *:8080>
  ServerName svn.hoge.co.jp
  RequestHeader edit Destination ^https http early
  <Location />
    DAV svn
    SVNParentPath /home/svn/repo
    SVNListParentPath on

    SVNAdvertiseV2Protocol off

    Require valid-user
    AuthType Basic
    AuthName "SVN"
    AuthUserFile /home/svn/.htpasswd
    AuthzSVNAccessFile /home/svn/.htauthz
  </Location>
</VirtualHost>

Apache再読み込み
# apachectl configtest
# service apache24 reload

さっきのtestリポジトリをUpdate/Commitして確認。



【関連記事】