Apache2.4のインストール&構築

1.はじめに

Apache2.0から2.2、そして最新の2.4系へアップデートしました

2.本体のインストールと設定起動

では、そのままインストールしてしまいます
# cd /usr/ports/www/apache24
# make install clean
オプションはデフォルトのまま、沢山ありすぎて良く分かりません。

次に設定をします
confファイルは /usr/local/etc/apache24/httpd.conf です。
ServerRoot "/usr/local"
Listen 80
LoadModule 以下沢山

AddHandler cgi-script .cgi .pl .rbx

User www
Group www
Timeout 600

ServerAdmin www@hogehoge.mydns.jp
ServerName hogehoge.mydns.jp:80
<Directory "/usr/local/www">
    Options -Indexes +FollowSymLinks +ExecCGI #-Indexesはファイルを見せないため
    # .htaccessを使用する場合Allにしておく
    AllowOverride All
    Order allow,deny
    Allow from all
    Deny from アクセスさせたくないドメイン、例えば.krとか
</Directory>

DirectoryIndex index.html index.htm index.php index.cgi index.pl index.shtml index.shtm

AddHandler cgi-script .cgi .pl .rbx

# エラーした場合に表示するページ
ErrorDocument 500 /500.html
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html

# httpsでアクセスしてきたときの設定関係
Include etc/apache24/extra/httpd-ssl.conf

Include etc/apache24/Includes/*.conf

# バーチャルホストなど
Include etc/apache24/extra/httpd-vhosts.conf

# それ以外にlog関係はお好みで変更する

/etc/rc.conf
apache24_enable="YES"

起動させる
# /usr/local/etc/rc.d/apache24 start
で起動できます。

動くようになったら他のportsインストール時にApache24である事を伝えるために
/etc/make.confへ下記を追記します。
DEFAULT_VERSIONS+=apache=2.4

3.SSL証明

SSL証明書ですが、オレオレ証明でも良いのですがせっかくなので無料で証明が取れるLet's Encrypt SSLを使用してみます。

まずはcertbotをインストールします。
# cd /usr/ports/security/py-certbot
# make install clean

証明書を取るサーバーから下記コマンドで証明書が入手できます。
その際に、ドメイン名で逆引き出来てHPアクセスできたらになりますのでApacheが動いていることが条件になります。
# certbot certonly --webroot -w /usr/local/www/ -d hogehoge.mydns.jp -m user@hogehoge.mydns.jp --agree-tos

これで証明書が下記のファイルとして使用できます。
証明書
/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/cert.pem
証明書+中間CA証明書
/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/fullchain.pem
秘密鍵
/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/privkey.pem
中間CA証明書
/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/chain.pem

無料なので証明期間は90日と短いです。
よってcronで下記コマンドを一定期間で回すことで自動更新しましょう。
/usr/local/bin/certbot renew --force-renew && /usr/local/etc/rc.d/apache24 restart
他にもsaslやwebminなどにも使用していたら、証明書更新後に再起動するようにcronしておきましょう。

ドメイン名などが変わった場合、過去の設定を削除しましょう。
設定ファイルは
/usr/local/etc/letsencrypt/renewal/
にあります。

4.SSL証明の自動更新

Let's Encrypt SSLの有効期限は90日です。
忘れないようにこれも自動化しておきましょう。

/root/certupdate
#!/bin/sh
export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
# 証明書取得
/usr/local/bin/certbot renew --force-renew
# 権限設定しないと動かない場合があるので
chmod -R 600 /usr/local/etc/letsencrypt/archive/hogehoge.mydns.jp/*
chmod -R 600 /usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/*
# Apache再起動
/usr/local/etc/rc.d/apache24 restart
# sendmail再起動
/etc/rc.d/sendmail restart
# saslauthd再起動
/usr/local/etc/rc.d/saslauthd restart
# webmin再起動
/usr/local/etc/rc.d/webmin.sh restart

このシェルスクリプトを90日未満で動かせば自動更新できます。
私は念のために1か月に1回回しています。
1回ミスしても次は確実に90日以内なので。
2か月にすると1回ミスすると次は既に90日を過ぎますし、1.5ヵ月は設定できないので。

5.httpsの設定

Apache2.4ではhttpd-ssl.confで設定します。
/usr/local/etc/apache24/extra/httpd-ssl.conf
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout 300
<VirtualHost _default_:443>
DocumentRoot "/usr/local/wwwssl" #SSLのルートディレクトリ
ServerName hogehoge.mydns.jp:443
ServerAdmin www@hogehoge.mydns.jp
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
SSLEngine on
SSLCertificateFile "/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/cert.pem"
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/privkey.pem"
SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/hogehoge.mydns.jp/chain.pem"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/www/wwwssl"> #SSLのルートディレクトリ
SSLOptions +StdEnvVars
Options -Indexes +FollowSymLinks +ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Deny from アクセスさせたくないドメイン
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/var/log/httpd-ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

次に設定でhttpd.confを編集します
/usr/local/etc/apache24/httpd.conf
LoadModule ssl_module libexec/apache24/mod_ssl.so
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
Include etc/apache24/extra/httpd-ssl.conf
あとは再起動で有効になります

6.PHPのインストール

まず、使用するデーターベースをインストールします
私はMySQL派(マイナーですが)なのでMySQLをインストールします。
# cd /usr/ports/databases/mysql80-server
# make install clean
これで必要な他のportsもインストールしてくれます

最初にユーザー設定をしますが、最初のパスワードは
/var/log/mysqld.log
に書かれているというのですが、なぜか私の環境ではログが排出されずログインできないで困りました。
そこで裏技を
/usr/local/etc/mysql/my.cnf
に追記
[mysqld]
skip-grant-tables

mysqlを起動
# /usr/local/etc/rc.d/mysql-server start

mysqlへログインして新しいパスワードを設定する。
# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35-log Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@localhost [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

root@localhost [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '新規パスワード';
Query OK, 0 rows affected (0.00 sec)

root@localhost [(none)]> quit
Bye
#
これでパスワードを更新できました。

そしてphpをインストールします
# cd /usr/ports/lang/php83
# make config
するとオプションがいろいろ選べます
私は「IPv6」をOFF、ZTSとMYSQL80をONしました。
そして一旦OKで抜けます

今度こそ本当のインストール
# cd /usr/ports/lang/php83-extensions
# make install clean
初めてだとまたオプションが出て来ます
マルチバイトとMySQLi、MySQLIをONしました。
2回目以降の場合は「make config」で選んで下さい

引き続き設定をします。
まずPHP設定ファイルをコピーします
# cp /usr/local/etc/php.ini-development /usr/local/etc/php.ini

一部修正します。
short_open_tag = On
これはphpのスクリプトでスタートを
<?php
と書かなければならないのを
<?
だけで済むので私は使用しています。

次にApacheでphpが動かせるようmod_phpをインストールします。
# cd /usr/ports/www/mod_php83
# make install clean
オプションはMySQLNDとZTSをONしました。

次にmysqliをインストールします。
# cd /usr/databases/php83-mysqli
# make install clean

次にApacheのconfファイルを編集します。
/usr/local/etc/apache24/httpd.conf
LoadModule php_module libexec/apache24/libphp.so
AddHandler application/x-httpd-php .php

#2行目よりこちらの方が良い?
<FilesMatch \.php>
SetHandler application/x-httpd-php

# REMOTE_HOSTで名前表示する場合、逆引きするために追記
HostnameLookups on

</FilesMatch>

あとはApacheを再起動すればOKです。
動作確認する為に以下の内容のファイルを作りアクセスして見てPHPの設定などちゃんと出れば動いています。
info.php
<? phpinfo(); ?>

blogのMovaTypeでMySQLを使用していてバックアップを取るのに簡単な方法としてデータベース自信をコピーしたので、その際のコマンドを。
$ mysqldump -u user_name -p from_db > from_db.dump.sql
$ mysqladmin -u user_name -p create dest_db
一度mysqlにログインして
mysql> RESET MASTER;
を実行して
$ mysql -u user_name -p dest_db < from_db.dump.sql
でコピーできます。

またMySQL8からは文字コードのデフォルトがutf8mb4になり5.7以前で吐き出したsqlファイルをそのままインポートしても文字化けしてだめでした。
MySQL5.7以前で吐き出したsqlファイルを編集し
DEFAULT CHARSET=latin1;

DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
に書き換えてからインポートすることで上手くいきました。

7.バーチャルホストの設定

最近はビデオなど家電をHPでアクセスすると外から録画予約など出来る事があるので、外からでもビデオなどをアクセスできるようにしてみます。
設定にはバーチャルホストを利用します。

/usr/local/etc/apache24/extra/httpd-vhosts.conf
#サーバー本体へのアクセスは、普通のDocumentRootを誘導
<VirtualHost *:80>
 DocumentRoot "/usr/local/www"
 ServerAdmin www@hogehoge.mydns.jp
 ServerName hogehoge.mydns.jp
</VirtualHost>

#ローカルの家電へのアクセスにはProxyで誘導
<VirtualHost *:80>
 ProxyPreserveHost Off
 ProxyPass / http://192.168.1.**/
 ProxyPassReverse / http://192.168.1.**/ #ローカルIPを設定
 ServerAdmin www@hogehoge.mydns.jp
 ServerName video.hogehoge.mydns.jp
</VirtualHost>

再起動すれば上記の場合
http://video.hogehoge.mydns.jpへアクセスすると
192.168.1.**へダイレクトにアクセスします。