FreeBSD、Apacheでサーバを構築して公開する
2020.9.29 高橋 誠
ADSLからさらに光接続になり、せっかくの常時接続をサーバにも使おうということになりあちこちを見て、何とか参照できるところまでにこぎつけたのでご報告します。
目次
AT互換機なら一世代前のでも良いとのことで、DELL OPTIPLEX 780を中古で買ってきました。標準搭載OSがWindows 7なので、2世代前になりますか(^_^;。メモリは8GBにしてます。HDは内蔵440GBで使っています。1000MBASE-Tに対応したLANボードがついてます。
ディスプレイとキーボードは置く場所がないので切替え装置で共用しています。
ブートUSBの作成
DVD付の解説書もあるのですが、バージョンアップに追いつくのが大変です。ブロードバンド環境ならネットワークインストールがお勧めです。
Windows 10等から、https://download.freebsd.org/ftp/releases/i386/i386/ISO-IMAGES/12.1/からマシンに合わせて、FreeBSD-12.1-RELEASE-i386-memstick.img.xzをダウンロードして、どこかのディレクトリたとえばC:\freebsdに入れます。Windows 10で展開して、C:\freebsdに置きます。
ブート用USBを用意して、Win32 Disk Imagerで作成します。ヴァージョンアップの場合にFreeBSD自身で行うのは、
C:\>cd freebsd
# dd if=FreeBSD-12.1-RELEASE-i386-memstick.img of=/dev/da0 bs=1M conv=sync
インストール
unix上にもいろいろなエディタがあるのですが、初期設定をする時点ではviコマンドによる定義ファイルの編集が必要になりますから、Windows側に、Jvimを組み込んで、必要に応じてhelpが参照できるようにしておくと便利です。
- USBをインストール先マシンにさしてブートします。
- IP V6がどうのこうのにはNoを答えて、
- DHCPを試すか? と聞かれたら、DHCPなのでYesを答えます。
FreeBSDの基本設定
- コピーが終わると、Do you want this machine to function as a network gateway?と聞かれます。サーバに使いルータ機能はいらないのでNoと答えます。
- Do you want to configure inetd and simple internet services?セキュリティ上不安なので余分なサービスは止めておくためNoと答えます。
- Security profileはhighにするように答えました。
- Would you like to customize your system console setting?にYesと答え、3 Keymapの設定でJapanese 106を選びます。
- Would you like to set this machine's time zone now?にYesと答え、次のSelect local or UTCはNoと答え、5 Asiaから19 Japanを選びます。JSTでいいかと念を押されます。
- root以外のユーザを追加するように言われるので、Wheelグループで一つ追加します。rootはftpできないので。
- 最後にrootのパスワードを設定しておしまい。USBを取り除いて、再起動します。
rootでログインして、Portsから二つインストール。
- wget
/>cd /usr/ports/ftp/wget
/usr/ports/ftp/wget>make install
- wwwのapache24を選択。apache 2.4.41がありました。
/>cd /usr/ports/www/apache24
/usr/ports/www/apache24>make install
これで、Packageのトップに戻りInstallにカーソルを移動して、Enterで組み込みを開始します。今度は、すでにnetwork設定をしてあるのでその構成を使うことを確認されftpサーバを選ぶだけです。
FreeBSDの標準のコマンドプロンプトをDOSのように変える方法がFreeBSD-users-jp 27240にありました。
# $FreeBSD: src/etc/root/dot.cshrc,v 1.25.2.2 2001/03/05 13:36:53 asmodai Exp $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#
alias h history 25
alias j jobs -l
alias la ls -a
alias lf ls -FA
alias ll ls -lA
# A righteous umask
umask 22
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin)
setenv EDITOR vi
setenv PAGER more
setenv BLOCKSIZE K
if ($?prompt) then
# An interactive shell -- set some stuff up
alias cd 'cd \!*; set prompt = "`pwd`>"'
set prompt = "`pwd`>"
set filec
set history = 100
set savehist = 100
set mail = (/var/mail/$USER)
if ( $?tcsh ) then
bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward
endif
endif
- スタート
apachectlコマンドで開始/終了ができます。
を入力した後、Apache インストール時のテストページがサーバに与えたアドレスで見えれば成功です。
ProFTPDがめちゃ難しくなっていたので、家庭LAN内部で使うだけなんで、ftpdにしました。
inetdから起動するので次の設定を/etc/rc.confに入れました。
inetdからftpdを起動するために、/etc/inetd.confの下記の行のコメントを外します。
ftp stream tcp nowait root /usr/libexec/ftpd telnetd -l
/usr/local/etc/ftpd.confは変更していません。あちこち見えてしまうので便利なのですが、セキュリティ上は問題なんで、後で述べるルータの設定で外から見えなくしています。
自分のアドレスが解決できないというので、/etc/hostsに次の行を追加しました。
192.168.1.100 hobbit.ddo.jp
/usr/local/etc/apache24/httpd.confで設定します。
- ddo.jpでもらったドメイン名を指定します。
ServerName hobbit.ddo.jp:80
- DocumentRoot "/usr/local/www/apache24/data"になっています。ここのデータを削除して、htmlデータを置くことにしました。
- apacheは同じ名称で、ブラウザの言語設定によって、別の文書を呼びだす機能があります。これを有効にするためにMultiViewsを指定します。
<Directory />
Options FollowSymLinks MultiViews
AllowOverride None
</Directory>
ユーザから見たらindex.htmlになるファイルを
- index.html.ja.sjis 日本語でshift_JISのページ
- index.html.ja.utf8 日本語でUTF-8のページ
- index.html.en.iso8859-1 英語でISO-8859-1のページ
と作っておくと、ブラウザの言語設定にあわせて使い分けることができます。
- Apacheが出すエラーメッセージも下記をコメントアウトするとこの機能が動くようになります。
# Multi-language error messages
Include etc/apache24/extra/httpd-multilang-errordoc.conf
- 自動起動用の、/usr/local/etc/rc.d/apach24.shが作られるようになりました。
- パスワード付の頁を作るには認証の通りにします。
- パスワードファイルの作成
/usr/local/www>mkdir passwd
/usr/local/www>bin/htpasswd -c /usr/local/www/passwd/password ユーザ名
New password:パスワード
Re-type new password:パスワード
Adding password for user ユーザ名
/usr/local/www>chown www /passwd/password
- /usr/local/apache/apache/htdocs/secretをパスワードプロテクトされたフォルダとすると、次のように指定します。領域名はIEだと「ネットワークパスワードの入力」のダイアログで、「領域」として表示されます。日本語で出ることもありますが、ローマ字にしておくほうが無難です。ここと上で指定したユーザ名と上で指定したパスワードを入力すると該当ディレクトリの表示が可能になります。
<Directory /usr/local/apache/apache/htdocs/secret>
AuthType Basic
AuthName "領域名"
AuthUserFile /usr/local/www/passwd/passwords
require user ユーザ名
</Directory>
AWStatsのインストールとセットアップ
- AWStatsの改造からダウンロード。
- 解凍し/usr/local/awstatsを作りFTPで転送。
- configure.plの実行
/usr/local/awstats/tools>perl awstats_configure.pl
- /usr/local/awstats/wwwroot/cgi-bin/awstats.hobbit.ddo.jp.confの設定確認
- LogFile="/var/log/access_log.utf8
- SiteDomain="hobbit.ddo.jp"
- Lang="jp" 出力するhtmlの言語になります。
- DirData="/usr/local/apastats/data"
- データファイルの書き込み許可
/usr/local/apastats>chmod 777 data
- 最初のデータファイルの作成、出力
/usr/local/awstats/tools>perl utf8_decode.pl < /var/log/access_log > /var/log/access_log.utf8
/usr/local/awstats/wwwroot/cgi-bin>perl awstats.pl -update -config=hobbit.ddo.jp
/usr/local/awstats/wwwroot/cgi-bin>perl awstats.pl -output -config=hobbit.ddo.jp -staticlinks > /usr/local/www/apache24/data/awstats.html.ja.utf8
- これが、http://hobbit.ddo.jp/awstats.html.ja.utf8で参照できればok。
- 上記スクリプト内で言われるとおりにcrontab -eで登録
SHELL=/bin/sh
MAILTO=自分のメールアドレス
#
15 4 * * * /usr/bin/perl /usr/local/awstats/awstats.cron
awstats.cronの中身。環境に合わせて変更しました。
#!/usr/bin/perl
# 完全日本語版AWStats用サンプルcronファイル
#
# ファイルパス等は自分の環境に合わせて書き直して下さい。
# httpのログファイルをデコードした上で一時ディレクトリに格納します。
# access_log.utf8は一時的にデコードしたログを保存するファイルの名前です。
system("/usr/local/awstats/wwwroot/cgi-bin/utf8_decode.pl < /var/log/access_log > /var/log/access_log.utf8");
# awstats.plが切り詰めないオリジナルのログを切り詰めます。
open(LOG,"+</var/log/access_log");
truncate(LOG,0);
close(LOG);
# Ver.5.0から、更新処理を別途走らせる必要ができたらしい....
system("/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=hobbit.ddo.jp -update > /dev/null");
# awstats.plを走らせ、htmlファイルを出力します。
# 必須ではありませんが、awstats.plを直接参照させるよりも、htmlに出力して表示す
# る方が、良好なパフォーマンスが得られます。
system("/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=hobbit.ddo.jp -output > /usr/local/www/apache24/data/awstats.html.ja.utf8");
- 本質的に問題ではないのですが、Another HTML-lintのエラーが多発したので、なるべくなくなるようにawstats.plを改造しました。AWStatsをFreeBSDで動かすに示します。HTML-lintに従うとフレームが使えないので、次の指定をして下さい。
#-----------------------------------------------------------------------------
# オプショナルセットアップセクション:外観 (必須ではないがAWStatsの機能を向上)
#-----------------------------------------------------------------------------
# AWStatsがCGIとして利用される場合, 表示にフレームを利用することができます.
# フレームは統計を動的に閲覧する際のみに有効となります. コマンドラインから
# 統計ページを生成した場合, このオプションは利用されず, フレーム無しのページ
# が生成されます.
# 取り得る値: 0 もしくは 1
# 既定値: 1
#
UseFramesWhenCGI=0
- Geo::Ipfreeの組込み IPアドレスから国名を割り出し、国別統計にするオプションです。
- /etc/awstats/awstats.hobbit.ddo.jp.confの設定
# プラグイン名: GeoIPfree
# 必要とされるPerlモジュール: Geo::IPfree version 0.2+ (Graciliano M.P.内)
# 概要: 国別の統計を、IP-国データベースを利用して作成します。
# このプラグインは、イントラネットのログファイルを解析する際には無意味です。
# 注: このプラグイン(PerlのGeo::IPfreeモジュールを必要し、データベースは無料だが
# 更新が遅い)を利用するか,GeoIPプラグイン(MaxmindのPerlのGeo::IPモジュールを必要
# とし、やはり無料で更新が早い)を利用するかを選択する必要があります。
# このプラグインを利用するとAWStatsの処理速度は10%程度低下します!
#
#LoadPlugin="geoipfree"
- CPANから組込み
/etc/resolv.confに次の行を追加します。ルータがDNSにも機能しています。
- 標準設定では192.168.1.1を呼び出します。
- 「詳細設定」-「LAN設定」では、
- LAN側IPアドレス:192.168.1.1
- サブネットマスク:255.255.255.0
- DHCPサーバ機能を「使用する」にチェックします。
- 割り当てIPアドレスは192.168.1.2から64台。
- 「詳細設定」-「LAN設定」-「DHCPサーバー設定 [拡張設定]」では、
- リース期間:48時間。
- デフォルトゲートウェイの通知:ブロードステーションのLAN側IPアドレス。
- DNSサーバの通知:DHCPでもらったアドレス。
- ドメイン名の通知:hobbit.ddo.jp
- 「セキュリティー」-「ポート変換」の設定
- バーチャル・サーバー:「有効」を選択。
- 「LAN側IPアドレス」を「192.168.1.100」、「プロトコル」で「http」、「LAN側ポート」で「80」を指定し「設定」します。
- 「LAN側IPアドレス」を「192.168.1.100」、「プロトコル」で「smtp」、「LAN側ポート」で「25」を指定し「設定」します。
と設定します。メールクライアントはLAN内に限定するので、POP:110について外部からのアクセスはさせません。
https://qiita.com/hishi1008/items/8f0ac4647b55cbcb89bdから/etc/ntp.confを次のように作ります。
#
# ntp.conf
#
server ntp.jst.mfeed.ad.jp
server ntp.ring.gr.jp
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap nopeer
次のコマンドで動作が確認できます。
/etc>ntpq -p
/etc>ntpdate -d localhost
T-comで おうちインターネットサーバー構築を参考に、ddoupdate.shを組み込みます。Portでwget 1.8.2_5を組み込んであるのですがどこにあるのかは、
で見つけます。また、PPPが確立していないときにwgetするとip_newのアドレスが0.0.0.0になり、そのときアドレスの登録に行っても無駄なので、nul0をとして、ip_newがこれと等しいかチェックするようにしてみました。この場合、cmpが必ずエラーメッセージを出してくるので、[FreeBSD-users-jp 44430] Re: crontab logで見つけて2>&1を追加しました。これでも本当にIPアドレスが変わるときにはメッセージが来ますが、「動いている証拠」と思ってあえてそのままにしています。|の使い方が分からないのでべたなコーディングになりました。
#!/bin/sh
/usr/local/bin/wget -qO - http://http://info.ddo.jp/remote_addr.php > /root/html_temp
/usr/local/bin/perl -pe 's/\x0D\x0A/\n/g' < /root/html_temp > /root/html_unix_temp
/usr/local/bin/perl /root/getip.pl < /root/html_unix_temp > /root/ip_new
cmp /root/ip_new /root/nul0 > /dev/null 2>&1
if [ $? != 0 ] ; then
cmp /root/ip_new /root/ip_old > /dev/null
if [ $? != 0 ] ; then
cp -f /root/ip_new /root/ip_old
/usr/local/bin/wget -O - 'http://free.ddo.jp/dnsupdate.php?dn=hobbit&pw={パスワード}' > /dev/null
fi
fi
ここで、getip.plの中身は、やはりべたに、utf-8で作りました。
#!/usr/bin/perl
use Jcode;
$status = 0;
while(<STDIN>){
Jcode::convert(\$_,utf8,sjis);
if (/ローカルアドレス/) {
$status = 1;
} elsif ($status == 1) {
print;
last;
}
}
crontab -eコマンドで、
SHELL=/bin/sh
MAILTO=自分のメールアドレス
#
3,8,13,18,23,28,33,38,43,48,53,58 * * * * /root/ddoupdate.sh
15 3 12,22 * * rm -f /root/ip_old
とし定時実行を予約します。ddoupdate.shを5分おきに実行します。また、1ヶ月更新しないとddo.jpから自動削除されてしまうので、12日と22日の3時15分に強制的に更新するようにしました。cron実行時にエラーがあるとここで指定したアドレスにメッセージが来ます。
Postfix Dovecot インストールを参考に下記の通りとしました。
procmail-3.22インストール
/usr/ports/mail/procmail> make BATCH=yes install clean
cyrus-sasl-2.1.27インストール
オプションはサポートしていないそうです。make configでみたらデフォルトになっていたので、そのままmake。
/usr/ports/security/cyrus-sasl2> make BATCH=yes install clean
/usr/ports/security/cyrus-sasl2> rehash
cyrus-sasl-saslauthd-2.1.27インストール
オプションはサポートしていないそうです。make configでみたらデフォルトになっていたので、そのままmake。
/usr/ports/security/cyrus-sasl2-saslauthd> make BATCH=yes install clean
/usr/ports/security/cyrus-sasl2-saslauthd> rehash
postfix-3.4.7インストール
オプションの指定方法が変わりました。
/usr/ports/mail/postfix> make config
BDBとSASLを追加で選択
/usr/ports/mail/postfix> make BATCH=yes install clean
/usr/ports/mail/postfix> rehash
main.cf編集
vi /usr/local/etc/postfix/main.cf
myhostname = hobbit.ddo.jp # コメント解除でホスト名指定
mydomain = hobbit.ddo.jp # コメント解除でドメイン名指定
myorigin = $myhostname # コメント解除(送信元メール)
inet_interfaces = all # コメント解除(受信するネットワークアドレスを指定)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # コメント解除(ローカル配送先)
mynetworks = 192.168.1.0/24, 127.0.0.0/8 # リレーを許可するIPアドレス
relay_domains = $mydestination # コメント解除(リレーを許可するドメインを指定)
alias_maps = hash:/etc/aliases # コメント解除(エイリアスを設定)
alias_database = hash:/etc/aliases # コメント解除(エイリアスを設定)
home_mailbox = Maildir/ # コメント解除(Maildir形式)
mailbox_command = /usr/local/bin/procmail ←コメント解除&変更(procmailのパスを指定)
# Cyrus-SASL configuration # 下記を追加(SASLによるSMTP認証を使用)
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes
/etc/rc.conf編集
下記を追加。
saslauthd_enable="YES"
saslauthd_flags="-a sasldb"
saslauthd開始。
/usr/local/etc/rc.d/saslauthd start
SMTP AUTH設定
vi /usr/local/lib/sasl2/smtpd.conf
SMTP AUTHユーザー追加
/>saslpasswd2 -c -u hobbit.ddo.jp user_name
Password:
Again (for verification):
sasldblistusers2
[email protected]: userPassword
/usr/local/etc/sasldb2.db所有権変更
ファイル名がちょっと変わりました。
/>chown cyrus:mail /usr/local/etc/sasldb2.db
/>chmod 640 /usr/local/etc/sasldb2
sendmail停止
/>/etc/rc.d/sendmail stop
/>vi /etc/rc.conf
次を最終行に追加します。
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
/etc/periodic.confを新規作成
sendmail /usr/local/sbin/sendmail
send-mail /usr/local/sbin/sendmail
mailq /usr/local/sbin/sendmail
newaliases /usr/local/sbin/sendmail
最終行に追加しようとしたら、なくて新規。
NO_MAILWRAPPER=YES
NO_SENDMAIL=YES
postfix起動
次を最終行に追加します。
/>/usr/local/etc/rc.d/postfix start
dovecot-2.3.7.2インストール
/>cd /usr/ports/mail/dovecot
/usr/ports/mail/dovecot>make BATCH=yes install clean
dovecot.conf編集
場所が変わってました。
/>chmod 640 /usr/local/etc/dovecot/dovecot.conf
/>vi /usr/local/etc/dovecot/dovecot.conf
ファイルが分かれました。
/>vi /usr/local/etc/dovecot/conf.d/10-ssl.conf
ssl = no
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem
/>vi /usr/local/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
dovecot起動
次を最終行に追加します。
/>/usr/local/etc/rc.d/dovecot start
メールエイリアスのデータベース再構築
最終行に追加。
設定を反映
ユーザー用メールディレクトリ作成
/>mkdir -p /home/user_name/Maildir/{cur,new,tmp}
/>chmod -R 700 /home/user_name/Maildir
/>chown -R user_name:user_name /home/user_name/Maildir
Procmail設定
/>vi /usr/local/etc/procmailrc
新規
SHELL=/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin
DROPPRIVS=yes
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
#LOGFILE=$MAILDIR/procmail.log
# 件名に「未承諾広告※」を含むメールを破棄する
:0
* ^Subject:.*=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?[Bb]\?GyRCTCQ\+NUJ6OS05cCIo
/dev/null
Procmailログローテーション
/>vi /usr/local/etc/logrotate.d/procmail
新規
/home/*/Maildir/procmail.log {
monthly
rotate 4
missingok
}
ここで作ったサーバはローカルな名前では自分で参照できますが、hobbit.ddo.jpのドメイン名では自分だけは参照できません。Another HTML-lintでテストしてみるのも一つの方法です。
HTML Lintも動作させることが出来ました。/usr/local/www/data/htmllint/htmllint.envの設定は次の通りです。
# CGI 用ディレクトリ (絶対パスかCGI相対パスで指定、なるべく絶対パスにしてください)
$RULEDIR = '/usr/local/www/data/htmllint/'; # 規則ファイルの場所
$LOGSDIR = '/usr/local/www/data/htmllint/logs/'; # ログファイルの場所 (不要ならコメントアウト)
$TMPDIR = '/usr/local/www/data/htmllint/tmp/'; # テンポラリファイルの場所
$IMGDIR = '/usr/local/www/data/htmllint/'; # イメージファイルの場所
$TAGSLIST = '/usr/local/www/data/htmllint/tags/'; # タグ一覧キャッシュ用の場所 (空ならキャッシュしない)
# 設定するときはアクセス権を適当に与えておくこと
# HTML 用ディレクトリ (CGI が出力する HTML 中で使う)
$HTMLDIR = './'; # HTMLファイルの場所
$GATEWAYURL = $HTMLDIR.'htmllint.html'; # ゲイトウェイサーヴィス HTML
$EXPLAIN = $HTMLDIR.'explain.html'; # 解説用 HTML (HTML用)
$CGIROOT = $HTMLDIR; # CGIの場所
$IMGROOT = $HTMLDIR; # イメージファイルの場所
また、httpd.confに
<Directory "/usr/local/www/data/htmllint">
Options +ExecCGI
AddDefaultCharset iso-2022-jp
</Directory>
を追加しました。
Another HTML-lintのダウンロードの頁からhtmllint.zipを解凍して、/usr/local/www/data/htmllintにFTPしました。ここで、次の通り変更したら動作しました。
/usr/local/www/data/htmllint>chmod 777 htmllint.cgi
/usr/local/www/data/htmllint>chmod 777 tmp
/usr/local/www/data/htmllint>chmod 777 logs
/usr/local/www/data/htmllint>chmod 777 tags
CPUの能力の差はいかんともしがたく、とんでもなく遅いです。
FreeBSDの標準のPerlではLWPが入っていないので、CPANからLWP 6.49をインストールしました。
の後適当に答えて、
でインストールできました。
Jcode.pm-0.88もテーブルを切り替えているので、個別にインストールしましたが、標準でよければ、Portsにあります。
そのまま公開すると、怒られるので管理者とかを書き直す必要があります。
ホーム(x)