ホーム > WWWページ作成について > FreeBSD、Apacheでサーバを構築して公開する

FreeBSD、Apacheでサーバを構築して公開する


2020.9.29 高橋 誠

 ADSLからさらに光接続になり、せっかくの常時接続をサーバにも使おうということになりあちこちを見て、何とか参照できるところまでにこぎつけたのでご報告します。

目次

マシンの準備

 AT互換機なら一世代前のでも良いとのことで、DELL OPTIPLEX 780を中古で買ってきました。標準搭載OSがWindows 7なので、2世代前になりますか(^_^;。メモリは8GBにしてます。HDは内蔵440GBで使っています。1000MBASE-Tに対応したLANボードがついてます。
 ディスプレイとキーボードは置く場所がないので切替え装置で共用しています。

FreeBSDのダウンロードと組込

ブート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が参照できるようにしておくと便利です。
  1. USBをインストール先マシンにさしてブートします。
  2. IP V6がどうのこうのにはNoを答えて、
  3. DHCPを試すか? と聞かれたら、DHCPなのでYesを答えます。

FreeBSDの基本設定

  1. コピーが終わると、Do you want this machine to function as a network gateway?と聞かれます。サーバに使いルータ機能はいらないのでNoと答えます。
  2. Do you want to configure inetd and simple internet services?セキュリティ上不安なので余分なサービスは止めておくためNoと答えます。
  3. Security profileはhighにするように答えました。
  4. Would you like to customize your system console setting?にYesと答え、3 Keymapの設定でJapanese 106を選びます。
  5. Would you like to set this machine's time zone now?にYesと答え、次のSelect local or UTCはNoと答え、5 Asiaから19 Japanを選びます。JSTでいいかと念を押されます。
  6. root以外のユーザを追加するように言われるので、Wheelグループで一つ追加します。rootはftpできないので。
  7. 最後にrootのパスワードを設定しておしまい。USBを取り除いて、再起動します。

FreeBSD Ports/Packages Collection

 rootでログインして、Portsから二つインストール。  これで、Packageのトップに戻りInstallにカーソルを移動して、Enterで組み込みを開始します。今度は、すでにnetwork設定をしてあるのでその構成を使うことを確認されftpサーバを選ぶだけです。

.cshrcの設定

 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

Apacheのダウンロードと組込み

  1. スタート
     apachectlコマンドで開始/終了ができます。
    /tmp>apachectl start
    
    を入力した後、Apache インストール時のテストページがサーバに与えたアドレスで見えれば成功です。

ftpdの設定

 ProFTPDがめちゃ難しくなっていたので、家庭LAN内部で使うだけなんで、ftpdにしました。  inetdから起動するので次の設定を/etc/rc.confに入れました。
inetd_enable="YES"
 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

Apacheの設定

 /usr/local/etc/apache24/httpd.confで設定します。
  1. ddo.jpでもらったドメイン名を指定します。
    ServerName hobbit.ddo.jp:80
    
  2. DocumentRoot "/usr/local/www/apache24/data"になっています。ここのデータを削除して、htmlデータを置くことにしました。
  3. apacheは同じ名称で、ブラウザの言語設定によって、別の文書を呼びだす機能があります。これを有効にするためにMultiViewsを指定します。
    <Directory />
        Options FollowSymLinks MultiViews
        AllowOverride None
    </Directory>
    
     ユーザから見たらindex.htmlになるファイルを と作っておくと、ブラウザの言語設定にあわせて使い分けることができます。
  4. Apacheが出すエラーメッセージも下記をコメントアウトするとこの機能が動くようになります。
    # Multi-language error messages
    Include etc/apache24/extra/httpd-multilang-errordoc.conf
    
  5. 自動起動用の、/usr/local/etc/rc.d/apach24.shが作られるようになりました。
  6. パスワード付の頁を作るには認証の通りにします。
    1. パスワードファイルの作成
      /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
      
    2. /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のインストールとセットアップ

  1. AWStatsの改造からダウンロード。
  2. 解凍し/usr/local/awstatsを作りFTPで転送。
  3. configure.plの実行
    /usr/local/awstats/tools>perl awstats_configure.pl
    
  4. /usr/local/awstats/wwwroot/cgi-bin/awstats.hobbit.ddo.jp.confの設定確認
  5. データファイルの書き込み許可
    /usr/local/apastats>chmod 777 data
    
  6. 最初のデータファイルの作成、出力
    /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
    
  7. これが、http://hobbit.ddo.jp/awstats.html.ja.utf8で参照できればok。
  8. 上記スクリプト内で言われるとおりに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");
    
    
  9. 本質的に問題ではないのですが、Another HTML-lintのエラーが多発したので、なるべくなくなるようにawstats.plを改造しました。AWStatsをFreeBSDで動かすに示します。HTML-lintに従うとフレームが使えないので、次の指定をして下さい。
    #-----------------------------------------------------------------------------
    # オプショナルセットアップセクション:外観 (必須ではないがAWStatsの機能を向上)
    #-----------------------------------------------------------------------------
    
    # AWStatsがCGIとして利用される場合, 表示にフレームを利用することができます.
    # フレームは統計を動的に閲覧する際のみに有効となります. コマンドラインから
    # 統計ページを生成した場合, このオプションは利用されず, フレーム無しのページ
    # が生成されます.
    # 取り得る値: 0 もしくは 1
    # 既定値: 1
    #
    UseFramesWhenCGI=0
    
  10. Geo::Ipfreeの組込み IPアドレスから国名を割り出し、国別統計にするオプションです。

DNSの設定

 /etc/resolv.confに次の行を追加します。ルータがDNSにも機能しています。
nameserver     192.168.1.1

Buffalo BHR-4GRV2の設定

  1. 標準設定では192.168.1.1を呼び出します。
  2. 「詳細設定」-「LAN設定」では、
    1. LAN側IPアドレス:192.168.1.1
    2. サブネットマスク:255.255.255.0
    3. DHCPサーバ機能を「使用する」にチェックします。
    4. 割り当てIPアドレスは192.168.1.2から64台。
  3. 「詳細設定」-「LAN設定」-「DHCPサーバー設定 [拡張設定]」では、
    1. リース期間:48時間。
    2. デフォルトゲートウェイの通知:ブロードステーションのLAN側IPアドレス。
    3. DNSサーバの通知:DHCPでもらったアドレス。
    4. ドメイン名の通知:hobbit.ddo.jp
  4. 「セキュリティー」-「ポート変換」の設定
    1. バーチャル・サーバー:「有効」を選択。
    2. 「LAN側IPアドレス」を「192.168.1.100」、「プロトコル」で「http」、「LAN側ポート」で「80」を指定し「設定」します。
    3. 「LAN側IPアドレス」を「192.168.1.100」、「プロトコル」で「smtp」、「LAN側ポート」で「25」を指定し「設定」します。
と設定します。メールクライアントはLAN内に限定するので、POP:110について外部からのアクセスはさせません。

ダイナミックDNSの設定

 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を組み込んであるのですがどこにあるのかは、
etc>find / -name wget
で見つけます。また、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実行時にエラーがあるとここで指定したアドレスにメッセージが来ます。

mailの設定

 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
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
pwcheck_method: auxprop

SMTP AUTHユーザー追加

/>saslpasswd2 -c -u hobbit.ddo.jp user_name
Password:
Again (for verification):
sasldblistusers2
user_name@hobbit.ddo.jp: 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を新規作成
/>vi /etc/periodic.conf
sendmail        /usr/local/sbin/sendmail
send-mail       /usr/local/sbin/sendmail
mailq           /usr/local/sbin/sendmail
newaliases      /usr/local/sbin/sendmail
/>vi /etc/make.conf
最終行に追加しようとしたら、なくて新規。
NO_MAILWRAPPER=YES
NO_SENDMAIL=YES

postfix起動

/>vi /etc/rc.conf
次を最終行に追加します。
postfix_enable="YES"
/>/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
protocols = imap pop3
ファイルが分かれました。
/>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起動

/>vi /etc/rc.conf
次を最終行に追加します。
dovecot_enable="YES"
/>/usr/local/etc/rc.d/dovecot start

メールエイリアスのデータベース再構築

/>vi /etc/aliases
最終行に追加。
root:  user_name@hobbit.ddo.jp
設定を反映
/>postalias /etc/aliases

ユーザー用メールディレクトリ作成

/>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サーバ

 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をインストールしました。
>perl -MCPAN -e shell
の後適当に答えて、
cpan>install LWP
でインストールできました。
 Jcode.pm-0.88もテーブルを切り替えているので、個別にインストールしましたが、標準でよければ、Portsにあります。
 そのまま公開すると、怒られるので管理者とかを書き直す必要があります。

参考文献


ホーム(x)