4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「CentOS7、Apache2.4、PHP7、MySQL5.7」の構成でLAMP環境を構築する方法

Last updated at Posted at 2018-02-18

開発するならLAMP環境ぐらいはさくっと組めるようになっておいた方がいいよねって思ったので、CentOS、Apache、PHP、MySQLの組み合わせでLAMP環境を構築してみました。

サーバ環境構築はあまり得意ではないので、ひとまず独自ドメインのWebサイトを公開できる状態をゴールにしました。

サーバ構成

前提として、CentOSはインストールされているものとして、以下のバージョンでLAMP環境を組みます。

  • CentOS7
  • Apache2.4
  • PHP7
  • MySQL5.7

EPELリポジトリとRemiリポジトリをインストール

まずはEPELリポジトリとRemiリポジトリをインストールします。


#epelを追加
$ rpm -ivh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
#remiを追加
$ rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

-ivhはインストールを意味するコマンドです。すでに古いRPMパッケージがインストールされている場合は新しいパッケージと入れ替えてRPMパッケージをアップデートする-Uvhを使います。

Apacheのインストール

Apacheは次のコマンドでインストールします。


# yum install httpd

インストールできたら、Apacheのバージョンを確認します。


 # httpd -v

また、インストールしただけの状態ではOSを再起動したときに主導でApacheを起動しなければならないので、自動でApacheも起動するように自動起動の設定をしておきます。


# systemctl enable httpd.service

試しにOSを再起動してみます。


# systemctl reboot

再起動後、Apacheの起動状態を確認してみます。


# systemrctl status httpd.service

Apacheが起動しているメッセージが表示されれば自動起動設定は完了です。次にOSを再起動したときにはApacheも自動起動するようになっています。

DNSの設定

独自ドメインを組み立てたサーバで使う場合、事前に独自ドメインを登録している業者(お名前.comなど)でDNSの設定をしておきます。外部IPアドレスに対してAレコードにドメイン名と外部IPアドレスを登録します。

例: example.com A 3600 xxx.xxx.xxx.xxx

サブドメインも使う場合は、サブドメインもAレコードに設定します。

例: info.example.com A 3600 xxx.xxx.xxx.xxx

また、CNAMEレコードには

例: www.example.com CNAME 3600 example.com

のように記述します。

上の例では「https://www.example.com」にアクセスすると「https://www.example.com」に転送されます。SEO的なことも考えて、wwwの有無はどちらかにそろえておきます。

PHPのインストール

PHPのインストール時には、OPCacheとAPCuもセットでインストールするとPHPの実行を高速化できるらしいです。

調べてみると、OPCacheはPHPアクセラレータのことで、APCuはKVS(Key Value Store)形式でメモリ内にキャッシュする機能を持っているそうです。よくはわかりませんが、PHPインストール時にOPCacheとAPCuを同時にインストールしているドキュメントが多いのでそれにならってインストールします。

インストール前に古いバージョンのPHPを関連ファイル含め先に削除しておきます。


# yum remove php* -y

次に、PHP7を関連ファイルを含めてインストールします。


# yum --enablerepo=remi,remi-php71 install php php-mysqlnd php-gd php-xml php-xmlrpc php-mbstring php-mcrypt php-fpm php-opcache php-apcu -y --skip-broken

PHPのインストールができたか確認するため、PHPのバージョンを表示させてみます。


# php -v

PHP7のバージョン情報が表示されればPHPのインストールは完了です。

PHPはモジュール版のほうが高速ですが、モジュール版ではなくCGIでPHPを動かす場合はサーバ負荷がかかってしまいます。サーバ負荷軽減のためにCGIで動かすときはphp-fpmの自動起動設定を忘れないように行います。


#systemctl enable php-fpm

必要に応じてPHPの設定ファイルであるphp.iniを編集します。php.iniは/etc/php.iniにあります。タイムゾーンの変更やアップロードできるファイルサイズの上限などを設定できます。

httpd.confの編集

httpd.confを直接編集してもいいですが、設定内容の管理のしやすさから/etc/httpd/conf.d/内に設定ファイルを作成してhttpd.confにインクルードする方法がベストです。

インクルードする処理はデフォルトのhttpd.confに処理が書かれているので特に追記するないようです。

/etc/httpd/conf.d/に基本設定ファイル00server.confおよびVirtualhost設定ファイルvirtual.confを作成しておきます。

Apacheのセキュリティ設定

Apacheをデフォルトの設定で運用するのはセキュリティ上よくありません。そのため、いくつかのセキュリティ対策を事前にしておきます。

まず、/etc/httpd/conf.d/内にあるwelcome.confを削除します。welcome.confはApacheのバージョン情報などが記載されているため、もし見られてしまったときはサーバのApacheのバージョンを知られてしまいます。


# rm /etc/httpd/conf.d/welcome.conf

また、CentOS7ではディレクティブ一覧表示をautoindex.confで制御しています。デフォルトで使用する画像などのファイルが格納されているiconsフォルダの設定もautoindex.confに記述されています。不要な設定ファイルなのでautoindex.confも削除しておきます。


# rm /etc/httpd/conf.d/autoindex.conf

Apacheの基本設定

Apache設定ファイルはhttpd.confが先に読み込まれ、httpd.conf内にincludeしている/etc/httpd/conf.d/内の*.confファイルの接頭文字が数字、アルファベットの順に読み込まれます。

つまり、基本設定を記述する00server.confはconf.d内で最初に読み込まれるファイルになります。

/etc/httpd/conf.d/00server.confには、例えば次のような記述をします。


TimeOut 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
ServerName example.com:80
ServerTokens Prod
ServerSignature Off
TraceEnable Off
UseCanonicalName Off
AddDefaultCharset Off
HostnameLookups Off
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
  Options -Indexes +ExecCGI +FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>
<IfModule dir_module>
  DirectoryIndex index.html index.php index.cgi
</IfModule>

各行の意味はApacheの公式ドキュメント(core - Apache HTTP サーバ バージョン 2.4)を参照すれば詳しく書いてあります。

ちなみに、「Options -Indexes +ExecCGI +FollowSymLinks」の記述でマイナスを使った場合は、他の設定にはプラスが必要です。プラスを付けなければエラーになります。

「DirectoryIndex index.html index.php index.cgi」ではここに記述したファイル順にファイルが探されることを意味しています。

Virtualhostの設定

VirtualHost設定で独自ドメインに関する設定をします。virtual.confを/etc/httpd/conf.d/につくって例えば次のようなことを書きます。


<VirtualHost *:80>
  ServerName example1.com
  DocumentRoot /var/www/html/example1.com/public_html
  <Directory "/var/www/html/example1.com/public_html">
    ~
  </Directory>
</VirtualHost>
<VirtualHost *:80>
  ServerName example2.com
  DocumentRoot /var/www/html/example2.com/public_html
  <Directory "/var/www/html/example2.com/public_html">
    ~
  </Directory>
</VirtualHost>

この設定をする前に各ドメインのDNS設定がVirtualHostを設定するサーバに変更されている状態にしておきます。

複数ドメインのvirtualhostを立てる場合はそれぞれ分けて書きます。ログファイルの蓄積場所の指定も行えます。

参照:Apache2.4 VirtualHost設定例

MySQLのインストールと基本設定

CentOS7にはMariaDBがプリインストールされています。今回はMySQLで運用するのでMySQLとの競合リスクを排除するためにMariaDBは削除します。


# yum remove mariadb-libs

MySQLをMySQL :: Download MySQL Yum Repositoryから探してrpmファイルをインストールします。


# yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

安全のためにMySQLのバージョンが5.7であることを確認してからMySQLをインストールします。


# yum info mysql-community-server
# yum -y install mysql-community-server

インストールできたことを確認します。


# mysqld --version

MySQLを起動します。


# systemctl start mysqld.service

サーバ起動時にMySQLが自動起動されるように設定しておきます。


# systemctl enable mysqld.service

次に、MySQLの初期設定を行います。MySQLのrootパスワードはインストール時に設定されています。ここで表示されるパスワードはメモしておきます。


# cat /var/log/mysqld.log | grep root

MySQLの初期設定は次のコマンドで始めます。


# mysql_secure_installation

事前にメモしておいたパスワードを入力して、rootパスワードの変更を行います。他にも匿名ユーザーの削除などもしておきます。基本的にはすべての質問にYes(コマンドではy)で回答していきます。

次に文字コードの設定を行います。/etc/my.cnfを開いて以下の4行を最後に追加します。


# vi /etc/my.cnf

character_set_server=utf8mb4
skip-character-set-client-handshake
explicit_defaults_for_timestamp = true
table_definition_cache  = 400

文字コードはUnicode(utf8もしくはutf8mb4)で設定します。

skip-character-set-client-handshakeはクライアントからの要求にも設定した文字コードで返答する設定です。文字化けする場合はこの設定を忘れていることが原因となっていることが多いです。

最後に、MySQlを再起動して設定を適用します。


# systemctl restart mysqld.service

設定した文字コードは次のコマンドで確認できます。


# mysql -u root -p
mysql> show variables like 'char%';

phpMyAdminの設定

MySQLにブラウザから接続して操作するツールのphpMyAdminをインストールし、MySQLにブラウザからアクセスできるようにします。

yumでインストールするとうまくインストールできないことが多いので、通常はwgetを使って手動でインストールします。wgetコマンドをインストールしていないのであれば事前にインストールしておきます。


# rpm -qa | grep wget
# yum install --downloadonly --downloaddir=/tmp wget

バージョンを確認します。(執筆時点では以下バージョン)


# rpm -ivh /tmp/wget-1.14-13.el7.x86_64.rpm

インストールされているかは以下コマンドで確認できます。


# rpm -qa | grep wget

ついでにunzipコマンドが使えるようにunzipをインストールしておきます。


# yum install unzip

次に、MySQLのバージョンを確認してMySQLのバージョンに対応するphpMyAdminをインストールします。以下はMySQL5.7に対応するバージョンです。


# wget https://files.phpmyadmin.net/phpMyAdmin/4.6.6/phpMyAdmin-4.6.6-all-languages.zip unzip phpMyAdmin-4.6.6-all-languages.zip

解凍したファイルは以下フォルダへ移動します。


# mv phpMyAdmin-4.6.6-all-languages /var/www/phpmyadmin

フォルダ名も変更しています。ドキュメントルートにはphpMyAdminは設置せず、エイリアスからアクセスできるように後ほど/etc/httpd/conf.d/phpmyadmin.confにエイリアス設定を記述します。

設定ファイルを作成し、ファイルのパーミッションを変更します。


# mv /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
# chmod 660 /var/www/phpmyadmin/config.inc.php

このconfig.inc.phpファイル内にあるblowfish_secretの部分にランダムな文字列を設定します。


# vi /var/www/phpmyadmin/config.inc.php

$cfg['blowfish_secret'] = 'ここにランダムな文字列を入力します';

また、以下から始まる記述がコメントアウトされているので、コメントアウトを外しておきます。


/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
(略)

phpMyAdminの所有者をapacheに変更します。


# chown -R apache /var/www/phpmyadmin/
# chown -R apache.apache /var/www/phpmyadmin/

エイリアス設定をするために/etc/httpd/conf.d/phpmyadmin.confに以下の記述します。


Alias /ここに任意のランダム文字列 /var/www/phpmyadmin/

AddDefaultCharset UTF-8
Require all granted

これでエイリアスのパスにアクセスすればphpMyAdminにはアクセスできますが、アクセスできない場合はSElinuxが有効化状態であることが原因となっていることがあります。次のコマンドでアクセスできるようになります。


restorecon - R /var/www/phpmyadmin/

phpMyAdminにrootでログインできたら、root権限を持つ新規ユーザーを作成して次回からはそのユーザでログインします。rootログインできないように次の記述をconfig.inc.phpの最後の行に追加します。


$cfg['Servers'][$i]['AllowRoot'] = false;

Basic認証や接続IPアドレスの制限を導入するなどして簡単にphpMyAdminにアクセスできないようにセキュリティ対策をしておく必要があります。

感想

サーバ環境構築は自分には合わないなあと思ってしまいました。やはりフロントエンド側に興味が偏っているのがその理由なのかもしれません。

小規模なWebサービスをつくるぐらいであれば、レンタルサーバでさくっとやってしまった方が時間が節約できてまだいい気がします。サーバインフラのセキュリティのことまで頭が回らないですからね……。

レンタルサーバのスペックも昔より上がってきているようなので、コスパを考えればレンタルサーバでまだいいのかなと思います。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?