背景
趣味のバレーボールをやる際にプレー動画を撮影して仲間内で共有しています。共有方法は会員制サイトを立ち上げて、そのサイト上で行っていますが、レンタルサーバーだとアクセスが集中した際に止まってしまうため、サイトを自前サーバーに移行することにしました。
前の記事で新ファイルサーバーをラズパイで立ち上げたので、元々ファイルサーバーとして使用していたIntelNUC(BOXNUC5PPYH)を流用して、新規でWebサーバーを立ち上げます。OSはCentOS-stream8をミニマムインストールして一からセッティングしていきたいと思います。
ミニマムインストール完了状態からスタート
centOS-stream8のインストールはbootディスクを作成して、こちらのサイトを参考に行いました。bootインストールは立ち上げ時にミラーサイトからダウンロードしながら行います。家のネットワークがヨワヨワなのでDAZNで野球見ながらやると、失敗しました。
初期セットアップ(wifi,SSH,vim)
Webサーバーとしてカスタマイズする前に基本機能のセットアップを行います。
NetworkManager-wifiインストール
centOS-stream8では初期状態で無線LANが使用出来ませんでした。原因はNetworkManager-wifiがインストールされていないためです。ここではOSインストールに使用した有線ネットワークを使用してセットアップします。
[root@localhost ~]# nmcli d //ネットワークデバイスを確認 DEVICE TYPE STATE CONNECTION enp3s0 ethernet 接続済み enp3s0 wlp2s0 wifi 管理無し -- lo loopback 管理無し -- [root@localhost ~]# yum -y install NetworkManager-wifi //NetworkManager-wifiのインストール ... [root@localhost ~]# reboot
再起動後に確認すると無線接続が可能となります。nmtuiを使用してwifi設定をすると接続が完了します。
[root@localhost ~]# nmcli d DEVICE TYPE STATE CONNECTION enp3s0 ethernet 接続済み enp3s0 wlp2s0 wifi 接続無し -- lo loopback 管理無し -- [root@localhost ~]# nmtui //nmtuiを使用してネットワーク設定
wifi設定後
[root@localhost ~]# nmcli d DEVICE TYPE STATE CONNECTION enp3s0 ethernet 接続済み enp3s0 wlp2s0 wifi 接続済み [ssid] lo loopback 管理無し --
SSH通信のセットアップ
セットアップは以前の仮想環境でのセットアップ記事で書いている通りに行えば可能です。
が、SSHポートを変更するためにSElinux設定の変更が必要です。ただしミニマムインストールでは"semanage"が使用出来ないので、ツールをインストールします。
[root@localhost ~]# yum provides /usr/sbin/semanage メタデータの期限切れの最終確認: 0:03:21 時間前の 2021年04月17日 15時49分14秒 に実施しました。 policycoreutils-python-utils-2.9-14.el8.noarch : SELinux policy core python utilities Repo : baseos 一致: ファイル名 : /usr/sbin/semanage [root@localhost yasuyoshi]# yum -y install policycoreutils-python-utils-2.9-14.el8.noarch ...
その後、下の記事の方法でSSH接続をセットアップします。
vimのセットアップ
エディターは好みが分かれますが、私はvimを使用するのでセットアップしておきます。
[root@localhost ~]# yum -y install vim ... [root@localhost ~]# vi ~/.vimrc //vim設定ファイルの新規作成
.vimrcファイルの内容
set hlsearch # 検索文字をハイライトする set number # 行番号を付ける set wrap # ウィンドウサイズで折り返す
以上で完了です。その他カスタマイズはこちらのサイトが参考になります。
apache(Webサーバー)のセットアップ
apache(httpd)のインストール
先ほどの設定まで、centOS7の癖でyumを使用していましたが、ここからはdnfを使用します。httpdをインストールすると自動でapacheユーザーが作成されますが、このユーザーを使い続けることはセキュリティ上良くないです。そこで、新規にwwwユーザー(login禁止)を作ることにします。
[root@localhost ~]# useradd -s /sbin/nologin www [root@localhost ~]# passwd www ユーザー www のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 [root@localhost ~]# cat /etc/passwd | grep www www:x:1001:1001::/home/www:/sbin/nologin
次にhttpdのパッケージを探してインストールします。
[root@localhost ~]# dnf list | grep httpd centos-logos-httpd.noarch 82.0-2.el8 @appstream httpd.x86_64 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-filesystem.noarch 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-tools.x86_64 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-devel.x86_64 2.4.37-30.module_el8.3.0+462+ba287492.0.1 appstream httpd-manual.noarch 2.4.37-30.module_el8.3.0+462+ba287492.0.1 appstream keycloak-httpd-client-install.noarch 1.0-2.el8 appstream libmicrohttpd.i686 1:0.9.59-2.el8 baseos libmicrohttpd.x86_64 1:0.9.59-2.el8 baseos python3-keycloak-httpd-client-install.noarch 1.0-2.el8 appstream [root@localhost ~]# dnf -y install httpd httpd-tools httpd-devel httpd-manual ...//色々出てきますが省略// 完了しました! [root@localhost ~]# dnf list installed | grep httpd centos-logos-httpd.noarch 82.0-2.el8 @appstream httpd.x86_64 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-devel.x86_64 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-filesystem.noarch 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-manual.noarch 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream httpd-tools.x86_64 2.4.37-30.module_el8.3.0+462+ba287492.0.1 @appstream [root@localhost ~]# which httpd /usr/sbin/httpd [root@localhost ~]# systemctl start httpd [root@localhost ~]# systemctl status httpd
以上、パッケージのインストール、確認、起動、自動起動設定を一気に行いました。
firewallの設定変更
homeとpublicにhttpdサービスを許可します。ポート追加は無しで通信可能でした。
[root@localhost ~]# firewall-cmd --add-service=http --zone=public --permanent [root@localhost ~]# firewall-cmd --add-service=http --zone=home --permanent [root@localhost ~]# firewall-cmd --reload
デフォルトページによる動作確認
これで、クライアントPCからブラウザでサーバーにアクセスすればapacheデフォルトページが表示されます。
httpd.confの設定
[root@localhost ~]# cd /etc/httpd/conf [root@localhost conf]# ls httpd.conf magic [root@localhost conf]# cp -p httpd.conf httpd.conf.org [root@localhost conf]# ls httpd.conf httpd.conf.org magic [root@localhost conf]# vim httpd.conf
下記のように変更します。
... User www #変更69行目(変更前:User apache) Group www #変更70行目(変更前:Group apache) ... ServerAdmin webmaster.[任意のドメイン] #変更98行目(変更前:ServerAdmin root@localhost) ... ServerName web.[任意のドメイン]:80 #変更98行目(変更前:ServerName www.example.com:80) ... DocumentRoot "/home/www/html" #変更122行目(変更前:DocumentRoot "/var/www/html") ... <Directory "/home/www"> #変更127行目(変更前:<Directory "/var/www">) ... <Directory "/home/www/html"> #変更134行目(変更前:<Directory "/var/www/html">) ... Options FollowSymLinks #変更147行目(変更前:Options Indexes FollowSymLinks) ... ScriptAlias /cgi-bin/ "/home/www/cgi-bin/" #変更250行目(変更前:ScriptAlias /cgi-bin/ "/var/www/cgi-bin/") ... <Directory "/home/www/cgi-bin"> #変更258行目(変更前:<Directory "/var/www/cgi-bin">) ...
ドキュメントディレクトリの作成
.htmlあるいは.php等を保存するためのドキュメントディレクトリを作成しておきます。ディレクトリの所有者はwwwに設定しておき、パーミッションは"755"とします。最後にhttpdをリスタートしておきます。
[root@localhost conf]# cd /home/www [root@localhost www]# mkdir html [root@localhost www]# mkdir cgi-bin [root@localhost www]# chown www:www html [root@localhost www]# chown www:www cgi-bin [root@localhost www]# chmod 755 ./html [root@localhost www]# chmod 755 ./cgi-bin [root@localhost www]# cd ~ [root@localhost www]# systemctl restart httpd
SElinuxのcontext設定変更
SElinuxを無効にしている場合は、先ほど作成したディレクトリにWebページファイルを保存すれば、問題無くアクセス出来ますがSElinuxを有効にしている場合はcontext設定を変更しておく必要があります。
まず、デフォルトディレクトリのcontext確認します。
[root@localhost ~]# ls -Z /var/www system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin system_u:object_r:httpd_sys_content_t:s0 html
次に先ほど作成したディレクトリのcontextを確認します。
[root@localhost ~]# ls -Z /home/www unconfined_u:object_r:user_home_t:s0 cgi-bin unconfined_u:object_r:user_home_t:s0 html
この状態で.htmlファイルを作成して、クライアントPCからアクセスしてもhttpd用フォルダとして設定していないため、アクセス拒否されます。そのため、/htmlのcontextを"httod_sys_content_t"に変更する必要があります。また、/cgi-binは"httpd_sys_script_exec_t"に変更が必要です。
[root@localhost ~]# semanage fcontext -d -t user_home_t /home/www/html //contextの初期化が必要な場合 [root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /home/www/html [root@localhost ~]# restorecon -v /home/www/html Relabeled /home/www/html from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 [root@localhost ~]# semanage fcontext -d -t user_home_t /home/www/cgi-bin //contextの初期化が必要な場合 [root@localhost ~]# semanage fcontext -a -t httpd_sys_script_exec_t /home/www/cgi-bin [root@localhost ~]# restorecon -v /home/www/cgi-bin Relabeled /home/www/cgi-bin from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:httpd_sys_script_exec_t:s0 [root@localhost ~]# ls -Z /home/www unconfined_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin unconfined_u:object_r:httpd_sys_content_t:s0 html
以上でcontext設定が完了しました。context設定は手動で変更しない限り上位ディレクトリの設定が引き継がれます。そのため、"/www/html/"内で作成したファイルに関しては手動設定の必要はありませんが、別領域からコピー、移動をしたファイルの場合は注意が必要です。
テストファイルでの動作確認
テストファイルを作成して、Webサーバーとしての動作を確認します。
[root@localhost ~]# vim /home/wwwys/html/index.html //index.htmlの内容-ここから-// test page //index.htmlの内容-ここまで-// [root@localhost wwwys]# chmod 644 /home/wwwys/html/index.html
以上で設定は完了です。Webサーバーではセキュリティの観点から、ルートディレクトリのパーミッションは"775"、配下のhtmlおよびphpファイルは"644"とすることが一般的です。
PHPのインストールとセットアップ
PHPのインストール
パッケージ確認からインストール、バージョン確認まで行います。
[root@localhost ~]# dnf search php ##色々出てきますが省略します## [root@localhost ~]# dnf info php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json ##パッケージ確認。色々出てきますが省略します## [root@localhost ~]# dnf install -y php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json ##インストール。色々出てきますが省略します## [root@localhost ~]# php -v PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies [root@localhost ~]# dnf list installed | grep php-fpm php-fpm.x86_64 7.2.24-1.module_el8.2.0+313+b04d0a66 @appstream
php-fpm設定ファイルの変更
Apacheに合わせたユーザー設定とパフォーマンス設定を行います。初期ファイルをコピーした後、設定ファイルを書き換えます。
[root@localhost ~]# cp -p /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org #初期設定をコピー [root@localhost ~]# ls /etc/php-fpm.d/ #無事コピーしたのを確認 www.conf www.conf.org [root@localhost ~]# vim /etc/php-fpm.d/www.conf #php-fpmの設定変更
/etc/php-fpm.d/www.confの変更内容
※2022/8/9追記しました。pm.start_serversはpm.min_spare_servers以上とする必要があります。
... user = www #24行目あたり(初期値user = apache) ... group = www #26行目あたり(初期値group = apache) ... listen.owner = www #48行目あたり(初期値;listen.owner = nobody) listen.group = www #49行目あたり(初期値;listen.group = nobody) listen.mode = 0666 #50行目あたり(初期値;listen.mode = 0660) ... pm.max_children = 50 #115行目あたり(コメントアウト削除) ... pm.start_servers = 10 #120行目あたり(初期値;pm.start_servers = 5)2022/8/9追記 ... pm.min_spare_servers = 10 #126行目あたり(初期値;pm.min_spare_servers = 5) ... pm.max_spare_servers = 35 #131行目あたり(コメントアウト削除) ... pm.max_requests = 500 #142行目あたり(コメントアウト削除) ...
php-fpmの起動と自動起動設定と動作確認
ここで一旦PHPを起動してみます。エラーが出なければ問題ありません。自動起動リストにも追加しておきます。
[root@localhost ~]# systemctl start php-fpm [root@localhost ~]# systemctl enable php-fpm Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.
php.iniの設定変更
次にphp.iniファイルを編集していきます。もちろん初期設定はバックアップを取っておきます。
[root@localhost ~]# cp -p /etc/php.ini /etc/php.ini.org [root@localhost ~]# vim /etc/php.ini
/etc/php.iniの変更内容
... expose_php = Off #374行目あたり(初期値expose_php = On) ... post_max_size = 256M #672行目あたり(初期値post_max_size = 8M) ... upload_max_filesize = 128M #825行目あたり(初期値upload_max_filesize = 2M) ... date.timezone = "Asia/Tokyo" #902行目あたり(初期値;date.timezone =) ... mbstring.language = Japanese #1510行目あたり(コメントアウト削除) ... mbstring.internal_encoding = UTF-8 #1517行目あたり(初期値;mbstring.internal_encoding =) ... mbstring.http_input = UTF-8 #1524行目あたり(初期値;mbstring.http_input =) ... mbstring.http_output = pass #1534行目あたり(初期値;mbstring.http_output =) ... mbstring.encoding_translation = On #1542行目あたり(初期値;mbstring.encoding_translation =) ... mbstring.detect_order = auto #1547行目あたり(コメントアウト削除) ... mbstring.substitute_character = none #1552行目あたり(コメントアウト削除) ...
設定後、リスタートを行いエラーが無いことを確認します。
[root@localhost ~]# systemctl restart php-fpm [root@localhost ~]# systemctl status php-fpm [root@localhost ~]# systemctl restart httpd
ここまでで設定完了です。念のため、apacheでの動作確認のためにテストファイルを作成します。テストファイルの内容はphpの設定状態を出力するものですが、セキュリティのためにテスト時以外は"phpinfo();"部分をコメントアウトしておきましょう。
<?php phpinfo(); ?>
クライアントマシンからブラウザでアクセスしてPHPの設定情報が表示されれば設定完了です。
メール送信サーバーのセットアップ
postfixのインストール
メールサーバーとしてpostfixをインストールし初期設定を行います。
[root@webserver ~]# dnf install postfix メタデータの期限切れの最終確認: 3:11:16 時間前の 2021年05月04日 13時05分19秒 に実施しました。 依存関係が解決しました。 ===================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ ===================================================================================================================== インストール: postfix x86_64 2:3.5.8-1.el8 baseos 1.5 M 依存関係のインストール: libicu x86_64 60.3-2.el8_1 baseos 8.8 M トランザクションの概要 ===================================================================================================================== インストール 2 パッケージ ... 完了しました! [root@webserver ~]# systemctl enable postfix Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service. [root@webserver ~]# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org [root@webserver ~]# vim /etc/postfix/main.cf
設定ファイル"/etc/postfix/main.cf"を編集します。
... mydomain = mail.example.jp #102行目(任意のドメインに変更) ... myorigin = $mydomain #118行目($mydomainに変更) ... inet_interfaces = all #132行目(コメントアウト削除) ... inet_protocols = ipv4 #137行目(ipv4を選択) ... mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain #182行目($mydomeinを追加) ... home_mailbox = Maildir/ #437行目("Maildir/"に変更) ...
firewallの設定変更
smtpサービスを許可します。通常のポート(25/tcp)を使用すれば、別途ポート開放は不要です。
[root@webserver ~]# systemctl restart postfix [root@webserver ~]# firewall-cmd --add-service=smtp --permanent [root@webserver ~]# firewall-cmd --reload
ここまでの操作でメール送信が可能になりました。確認のため、サンプルファイルを作成してメール送信を確認します。
[root@webserver ~]# vim /home/www/html/mailtest.php
<?php function SendMail($from,$sendto,$subject,$text){ // 変数とタイムゾーンを初期化 $header = null; // ヘッダー情報を設定 $header = "MIME-Version: 1.0\n"; $header .= "From:" .$from."\n"; $header .= "Reply-To:" .$from."\n"; // メール送信 return(mb_send_mail($sendto,$subject,$text,$header)); } $mail = '送信先メールアドレス'; $from = '送信元メールアドレス'; $urls = array(); $urls[] = array( 'protocol' => 'https', 'domain' => 'tossuplab.sakura.ne.jp' ); $to = $mail; $subject = "test"; $message = "test-message"; if(SendMail($from,$to,$subject,$message)){ echo "送信OK"; }else{ echo "送信NG"; } ?>
ファイルの権限を変更しておきます。
[root@webserver ~]# chmod 644 /home/www/html/mailtest.php
まずは強制的にスクリプトを実行してみます。phpスクリプトの実行は管理者権限が無くても可能です。"送信OK"と出力されれば、送信成功です。
[hoge@webserver ~]$ php -f /home/www/html/mailtest.php 送信OK
この状態でブラウザにてアクセスすると、"送信NG"出力となり、上手くメールを送信出来ません。原因はSElinuxで設定変更を行わないとhttpdによるメール送信が許可されていないためです。下記コマンドでSElinuxの設定変更を行います。
[root@webserver ~]$ getsebool httpd_can_sendmail httpd_can_sendmail --> off [root@webserver ~]$ setsebool -P httpd_can_sendmail on [root@webserver ~]$ getsebool httpd_can_sendmail httpd_can_sendmail --> on
以上で設定完了です。これでブラウザアクセスでのメール送信も可能になりました。
追加設定
データベースへのアクセス設定
後日、構築したWEBサーバーからhttpd経由で別サーバーのデータベースにアクセスしようとするとアクセスエラーとなりました。原因と対処法はこちらで追加の作業が必要になります。