WordPressは、インストールやユーザーの登録をするとメールが送信されます。またアプリケーションシステムでは、メール送信する場面が少なからず発生します。
今回セットアップを進めるVPSサーバーはメールを受信する必要はありませんが、WordPressから発信するメールや、PHPプログラムからメールを送信できるようにする必要があります。
ここではそのための、メールを送信する専用サーバーとなるセットアップを実施します。
サーバーに搭載されるメール機能は、以下の3つの役割に分担され、異なるパッケージが提供されています。
目的とするサーバーでは、上記MTA機能だけ動作するようにします。
パッケージはSendmail、qmail、Postfixなど複数ありますが、検索すると専らPostfixの説明が多いのでPostfixを利用します。
思った通り動作させるには、ここでもSELinuxの設定が重要になります。PHPによるメール送信の際プロセスはPostfixのmain.cfファイルをアクセスしますが、SELinuxによりブロックされているため、それを許可する必要があります。
Postfixをインストールします。
# yum install postfix
環境ファイルを編集します。
# vim /etc/postfix/main.cf myhostname = sv.mt-systems.jp mydomain = mt-systems.jp inet_interface = all inet_protocols = ipv4 mynetworks = 127.0.0.1 smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination message_size_limit = 101485760
メール送信はサーバー内のアプリケーションシステムが実行し、ユーザーや外部からSMTP接続による送信はしません。ですので、SMTP認証や外部接続の設定はしませんでした。ポートの解放も設定しません。
firewall-cmdを利用してsmtpポートが開いてないか確認します。
# firewall-cmd --list-services
次にSELinuxの設定です。情報を確認して設定しますが、セキュティポリシーの確認はブール型変数を扱うコマンドを利用します。
# getsebool -a | grep sendmail
「httpd_can_sendmail –> off」とあれば、
# setsebool -P httpd_can_sendmail on
を実行します。-Pは再起動時の指定です。
あとはサービスの起動を確認します。
# systemctl start postfix
次のコマンドはサービス(デーモン)の自動起動設定を一覧で確認します。
# systemctl list-unit-files -t service
サービスの自動起動設定はenableを、解除はdisableを利用します。
# systemctl enable postfix.service
サービスの自動起動設定状態、起動状態の確認は次の通りです。
# systemctl status postfix.service
表示の「Loaded」が自動起動設定状態、「Active」が動作状態です。
準備が整ったので、PHPを使ってテストメールを送信します。以下はPHPのテストメール送信プログラムです。
$ vim test_mail.php <?php $to = 'mt-systems@mt-systems.jp'; $subject = 'テスト from VPSサーバー'; $body = 'VPSサーバーのSMTPを利用したテストメールの送信'; $result = mb_send_mail($to, $subject, $body); var_dump($result);
ブラウザーからプラグラムのURLを指定し、実行の結果、trueが表示されれば、メール送信コマンドmb_send_mail()は正常に動作したことになります。
falseの場合、エラーが発生している可能性が高いので、エラーログか、あるいはPHPのエラー表示をONにして内容を確認します。
trueにも関わらずメールが送信されない場合、Postfixの動作やSELinuxの設定の確認をします。
以下参考にさせていただいたページのリンクです。
さくらのVPS Postfixの設定
Postfixによる、セキュリティに配慮したメールサーバの構築方法
WordPress Contact Form 7からのメール送信失敗でSELinuxを設定変更した件
Postfixのインストール
WordPressのセットアップは、これまでセットアップしたApache、PHP、MariaDBの各サーバーが正常に動作していれば、容易かと思います。
しかしながら、WordPressのバージョンアップの際SELinuxのセキュリティチェックで書き込みが禁止されている場合、FTPの接続IDとパスワードを求められることがあります。それを回避するための設定を、ブラウザーでWordPressにアクセスする前に処理しておきます。
ここでのインストールの説明は、Apacheのバーチャルホストの設定、サーバー上のWordPressのインストール先に関して、次の設定と仮定します。
バーチャルホスト Document Root: /var/www/test Server Name: test.sub.example.com WordPressのインストール先 /var/www/test/wp/ WordPressのアクセス http://test.sub.example.com
先ずはWordPressをダウンロード、解凍します。wgetコマンドが無い場合は、先にインストールしておきます。
$ sudo yum install wget $ cd /var/www/test $ wget http://ja.wordpress.org/wordpress-4.9-ja.tar.gz $ tar zxvf wordpress-4.9-ja.tar.gz
次にWordPressのアップデートに関わるファイルパーミッション、SELinuxのセキュリティに関する設定です。
解凍したwordpressディレクトリ配下の所有者、グループはそれぞれ、apacheとwebusersに変更します。
$ sudo chown apache:webusers --recursive wordpress
ディレクトリはグループが継承されるようにSGIDを設定します。
$ sudo find ./wordpress -type d -print | sudo xargs chmod g+s
apacheユーザーをwebusersグループに追加します。
$ sudo gpasswd -a apache webusers
SELinuxの設定情報を確認します。
$ ls -aZ wordpress
例えばリスト表示のwordpress/index.phpファイルを確認してください。
-rw-rw-r--. apache webusers unconfined_u:object_r:httpd_sys_content:s0 index.php
のような場合、httpd_sys_content_tをhttpd_sys_rw_content_tに変更します。下記はwordpressディレクトリ配下全てを変更します。
$ sudo chcon -t httpd_sys_rw_content_t wordpress/ -R
さて、WordPressのアクセスを「http://test.sub.example.com/」とするための作業に移ります。
wordpressディレクトリをwpディレクトリに変更後、ブラウザーからサイトをアクセスしてWordPressのセットアップを実行します。
$ mv wordpress wp
WordPressのセットアップに先立って、wp-config.phpファイルを用意してください。ここでは詳細を割愛します。
データベースに関して前回設定しました。ここではデータベース名「testdb」、ユーザー名「testuser」、パスワード「xxx」にしています。
データベースの接続先は「localhost」になります。動作中にエラーが発生した場合、エラー表示されるようにWP_DEBUGをtrueに設定しておきます。
セットアップは、「http://test.sub.example.com/wp」をアクセスして起動します。
セットアップ後、「http://test.sub.example.com」でWordPressサイトをアクセスできるように編集します。
これはWordPressのインストール先を、WordPressに対する不正アクセスがサイトのトップを直接標的としますので、それを避けるためにサブディレクトリ「wp」にしたからです。
手順1.
管理画面のパーマリンク設定で、基本以外のものを選択、保存します。画面下部に「.htaccess」の内容が表示されます。「.htaccess」ファイルがwpディレクトリに出力されているか確認してください。
手順2.
管理画面の設定一般で、サイトアドレスを「http://test.sub.example.com/wp」から「http://test.sub.example.com」に変更、保存します。
手順3.
wpディレクトリにある「.htaccess」ファイルと「index.php」ファイルを「/var/www/test」ディレクトリへコピーします(移動ではありません)。
index.phpファイルの最後にある「’/wp-blog-header.php’」を「’/wp/wp-blog-header.php」に変更します。
以下参考にさせていただいたページのリンクです。
SELinuxの基本を理解する
Fixing Permission Denied on CentOS7(SELinux)
WordPressを専用ディレクトリに配置する
記事に関して質問をいただいても回答できませのでご了承ください。