centOS-stream8でWebサーバーを立ち上げる

背景

趣味のバレーボールをやる際にプレー動画を撮影して仲間内で共有しています。共有方法は会員制サイトを立ち上げて、そのサイト上で行っていますが、レンタルサーバーだとアクセスが集中した際に止まってしまうため、サイトを自前サーバーに移行することにしました。

前の記事で新ファイルサーバーをラズパイで立ち上げたので、元々ファイルサーバーとして使用していた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経由で別サーバーのデータベースにアクセスしようとするとアクセスエラーとなりました。原因と対処法はこちらで追加の作業が必要になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

eleven + 19 =