Contents
LAMP環境を最新の環境で構築した時の備忘録です。
前提
客先からの依頼で、最新環境でのIntranet-Serverの構築依頼がありました。
社内Webアプリの開発環境及び運用Serverなので出来だけ最新の環境が良いとのこと。
「CentOS7 + Apache2.4 + MySQL5.7 + PHP7 + PHPMyAdmin」で環境を作る。
仮想環境上に「CentOS7 1611」をインストール
インストールするベース環境は、「サーバー(GUI使用)」を選択
CentOS7 初期設定
SELinux
SELinux (Security-Enhanced Linux) の現在の状態は以下のようにして確認できます。(デフォルトは有効)
1 2 3 4 5 |
[root@sv ~]# getenforce Enforcing # SELinux は有効な状態 [root@sv ~]# getenforce Disabled # SELinux は無効な状態 |
SELinux を利用する場合、通常の Linux アクセス権の設定は問題なくとも、SELinux のアクセス制御によってアクセスが拒否され、サービス/アプリケーションが期待通りの動作をしないといった場合が発生することがあるため、サーバーに設定/公開するサービス/アプリケーションによっては、SELinux へのアクセス許可/不許可の設定が必要になることがあります。
設定対象とするサーバーが安全な社内のみの利用である等の理由で SELinux を無効にしたいといった場合は、以下のように設定して無効化できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@sv ~]# vi /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled ### endorcing 有効 ### permissive 制限付き有効 ### disabled 無効 # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted |
ファイアウォール
ファイアウォールサービスの現在の状態は以下のようにして確認できます。
1 2 3 4 5 |
[root@sv ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) |
ファイアウォールサービスを利用する場合、デフォルトではインバウンド通信はほぼ許可されていないため、サーバーに設定/公開するサービス/アプリケーションに応じて、許可/不許可の設定が必要になります。
自身のネットワーク内で、設定対象とするサーバーの上位にファイアウォール機器が設置されており、サーバー側ではファイアウォールサービスは必要ないといった場合は、以下のようにして停止することも可能です。
1 2 3 4 5 6 7 8 |
サービスの停止 [root@sv ~]# systemctl stop firewalld.service 自動起動設定の無効化 [root@sv ~]# systemctl desable firewalld.service ファイアウォールサービスの現在の状態は以下のようにして確認できます。 [root@sv ~]# systemctl status firewalld.service |
システム最新化
システムをインストールした後は、可能であればシステムを最新化しておいた方がよいでしょう。
1 2 3 4 |
yum自身の更新を行う [root@sv ~]# yum -y update yum system update [root@sv ~]# yum -y update |
一般ユーザー追加
一般ユーザーを追加します。
1 2 3 4 5 6 7 |
[root@sv ~]# useradd toshi [root@sv ~]# passwd toshi Changing password for user toshi. New UNIX password:# 設定したいパスワードを入力 Retype new UNIX password:# パスワード再入力 passwd: all authentication tokens updated successfully. [root@sv ~]# |
root ユーザーにスイッチできるユーザーを限定するには以下のように設定します。(例として「toshi」ユーザーのみに限定)
sudo設定
作成した一般ユーザー(toshi)にsudo権限付与
visudoで/etc/sudoersを開き、下記の行のコメントアウトを外す
1 2 3 4 |
[root@sv ~]# visudo ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL |
ユーザーをwheelグループに追加
1 |
[root@sv ~]# usermod -G wheel toshi |
wheelグループのみにする
下記の行のコメントアウトを外す
1 2 3 4 |
[root@sv ~]# vi /etc/pam.d/su # Uncomment the following line to require a user to be in the "wheel" group. auth required pam_wheel.so use_uid |
日本語化(ロケールの変更)
1 |
[root@sv ~]# lcoallocalectl set-locale LANG=ja_JP.UTF-8 |
ロケール確認
1 2 3 4 |
[root@sv ~]# localectl status System Locale: LANG=ja_JP.UTF-8 VC Keymap: jp X11 Layout: jp |
リポジトリの設定
インストールに使うリポジトリの設定をします。
CentOSには、公式のリポジトリが用意されていて、通常のyumコマンドで利用可能ですが、保守的で最新のソフトウェアやバージョン更新が行われないので、epelやremiというパッケージをインストールして、各リポジトリにある最新のソフトウェアを利用します。
そもそもリポジトリとはなに?
Linuxのリポジトリとは、ソフトウェアやアプリケーションパッケージを管理しているマーケットです。
EPELとREMIって何?メリットは?
epelもremiもそれぞれのリポジトリを指すようです、2つともインストールしておく理由は、どちらかいいほうを取るためです。
epelにない場合はremiから、remiより最新のバージョンが使われている場合はepelからと言う保険的な感じらしいです。違ってたらごめんなさい。
そもそもCentOSには、公式のリポジトリが用意されていて、通常のyumコマンドで利用可能です、ですが、CentOSのリポジトリは、保守的で最新のソフトウェアやバージョンの更新が行われないので、CentOSにepelやremiというパッケージをインストールして、各リポジトリにある最新のソフトウェアを使おうということです。
実は、非公式なepelとremiリポジトリなんですが、epelのパッケージもremiのパッケージも公式のリポジトリからインストール出来るという点で少し安心して使っています。
epelのインストール
1 |
[root@sv ~]# yum -y install epel-release.noarch |
remiのインストール
1 |
[root@sv ~]# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm |
インストール後には、epelリポジトリを優先的に使うような設定が有効になっています。
なので、yum updateコマンドを実行すると公式パッケージがEPELリポジトリのパッケージで上書きされてしまいます、なにぶん非公式なものなので、必要なときにだけ、epelリポジトリを使うようにしましょう。
1 2 3 4 5 |
# enabled=0 としておいて、必要な時のみ読み込む方法 [root@sv ~]# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo # enabled=0 としておいて、必要な時のみ読み込む方法 [root@sv ~]# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/remi-safe.repo |
BIND
名前解決サービスである DNS (Domain Name System) サーバーを構築します。
1 2 3 |
[root@sv ~]# yum -y install bind [root@sv ~]# rpm -qa | grep bind [root@sv ~]# cd /etc/named |
Apache
Apacheは、公式サイトのバージョンが最新に近い状態であったので、公式サイトからのインストールを行います。
インストール
1 |
[root@sv ~]# yum -y install httpd |
起動
1 |
[root@sv ~]# systemctl start httpd |
自動起動の設定
1 |
[root@sv ~]# systemctl enable httpd |
MySQL 5.7
CentOS7では、mariaDB(MySQL互換のDB)がデフォルトでインストールされている場合があるので、MySQLと競合を起こさないように削除します。
mariaDB、既存MySQL削除
1 2 |
[root@sv ~]# yum remove mariadb-libs [root@sv ~]# yum -y remove mysql* |
MySQL 5.7 インストール
※適宜URLは最新に変更すること(確認用URL)
https://dev.mysql.com/downloads/repo/yum/
1 2 |
[root@sv ~]# yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm [root@sv ~]# yum -y install mysql-community-server |
バージョン確認
1 2 |
[root@sv ~]# mysqld -V mysqld Ver 5.7.19 for Linux on x86_64 (MySQL Community Server (GPL)) |
起動
1 |
[root@sv ~]# systemctl start mysqld.service |
自動起動の設定
1 |
[root@sv ~]# systemctl enable mysqld.service |
rootユーザーの初期パスワード
MySQL5.7では、初回起動と同時にrootユーザーにランダム文字列のパスワードが設定され、ログに出力される。
1 |
[root@sv ~]# cat /var/log/mysqld.log | grep 'password is generated' |
初期設定
mysql_secure_installationコマンドで設定していきます。
※新しいルートのパスワードは、大文字、小文字、数字、記号の全てが入っている必要があるので注意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
[root@sv ~]# mysql_secure_installation Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin? # パスワード品質チェックプラグインの有効化の選択 Press y|Y for Yes, any other key for No: y There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file # パスワード品質チェックの強度の選択 Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 Please set the password for root here. # root パスワードを設定 New password: Re-enter new password: By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. # 匿名ユーザー削除 Remove anonymous users? (Press y|Y for Yes, any other key for No) : y Success. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. # root のリモートログイン有効/無効 Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y Success. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. # テストデータベース削除 Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. # 特権情報リロード Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done! |
MySQL接続確認
1 2 3 4 5 |
[root@sv ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.19 MySQL Community Server (GPL) |
my.cnfに以下を設定します
- ストレージエンジンを、InnoDB
- データファイル・ログファイルをテーブルごとに設定
- 文字コードをutf8に
変更前の状態
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
mysql> show variables like 'char%' ; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.07 sec) mysql> |
my.cnfに追記します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@sv ~]# vi /etc/my.cnf [mysqld] default-storage-engine=InnoDB innodb_file_per_table character-set-server = utf8 collation-server = utf8_general_ci [mysql] default-character-set = utf8 [client] default-character-set = utf8 |
変更後の確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
mysql> show variables linke 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) mysql> mysql> SHOW VARIABLES LIKE 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.00 sec) |
PHP7
libmcryptインストール
mcryptのインストールに必要なので先にインストール
1 |
[root@sv ~]# yum --enablerepo=epel install libmcrypt --y |
FastCGIで動かせるPHP-FPM、キャッシュ周りのOPcache、APCuはイン スストールしておきます
インストール
1 2 3 4 5 6 7 |
[root@sv ~]# yum --enablerepo=remi-php70 install -y php php-cli php-devel php-common php-mbstring php-mysql php-fpm php-gd php-mcrypt php-opcache php-pdo php-xml [root@sv ~]# php -v PHP 7.0.22 (cli) (built: Aug 2 2017 09:39:55) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.22, Copyright (c) 1999-2017, by Zend Technologies |
php.ini 設定
初期ファイルのバックアップ
1 2 |
[root@sv ~]# [root@sv ~]# cp /etc/pphp.ihp.ini /etc/php.ini.bk |
php.iniに以下を設定します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[root@sv ~]# vi /etc/php.ini [PHP] # レスポンスヘッダにPHPのバージョンを表示しない expose_php = Off # 全てのログを出力 error_reporting = E_ALL # ブラウザでエラーを表示しない display_errors = Off # エラーをログに残す log_errors = On # エラーログの長さを設定 log_errors_max_len = 4096 # エラーログ出力先 error_log = "/var/log/php_errors.log" # 文字エンコーディング default_charset = "UTF-8" [Date] # タイムゾーン date.timezone = "Asia/Tokyo" [mbstring] # デフォルト言語 mbstring.language = Japanese # 内部文字エンコーディング mbstring.internal_encoding = UTF-8 # HTTP入力文字エンコーディングのデフォルト mbstring.http_input = auto # 文字エンコーディング検出順序のデフォルト mbstring.detect_order = auto |
動作確認
ドキュメントルートにphpinfoを出力するphpファイルを作成します。
1 2 3 4 5 6 7 8 |
[root@sv ~]# vi /var/www/html/info.php <?php // すべての情報を表示します。デフォルトは INFO_ALL です。 phpinfo(); ?> [root@sv ~]# systemctl restart httpd |
PHP-FPMとは
FPM(FastCGI Process Manager)はPHPのFastCGIでの実装の1つ。
FastCGIとは
CGIの高速化・負荷を軽減するための動作仕様の1つ。
前提として、webサーバでのPHPの実行環境は、モジュール版とCGI版という二種類があります。
モジュール版は、Webサーバーのプロセスの中でPHPを実行する方法です。 Apacheであれば基本はモジュール版で動作します。
CGI版は、実行ファイル形式で動くので、Webサーバーとは別のプロセスで実行されます。ユーザーからのリクエストの度に、プロセスの生成/破棄が発生するので、大量のリクエストがあると大量のプロセスの生成/破棄が発生し、この事がパフォーマンスを悪化します。
ゆえに、モジュール版で動作させるのが定石でした。
FastCGIは、CGIの高速化・負荷軽減を行った実行環境です。
初回リクエスト時に実行したプロセスをメモリ上へ保持することで、次回リクエスト時はメモリ上のプロセスを実行し、高速化や、プロセスの生成/破棄に伴うCPUへの負荷を軽減します。
パフォーマンス面は、モジュール版 >= FastCGI > CGIといったところ。
FastCGIの一番のメリットは、CGIのメリットを活かしつつ高速化したところだと思います。(CGIを動かす各ユーザーは、Webサーバーを動かすユーザーとは切り離されているので、他ユーザーに干渉してしまうといった危険がない)
ただし、現在のトレンドとしてapacheではなくnginxと組み合わせて使うことで、apacheモジュール版よりもハイパフォーマンスになります。
起動中か確認
1 2 |
[root@sv ~]# ps ax | grep php-fpm 3530 pts/0 S+ 0:00 grep --color=auto php-fpm |
起動/停止
1 2 3 4 5 |
起動 [root@sv ~]# systemctl start php-fpm 停止 [root@sv ~]# systemctl stop php-fpm |
apache conf設定
/etc/httpd/conf.d/ 配下にconfファイルを新規作成してhttpd.confで読み込まれるようにする
1 2 3 4 |
$ vi /etc/httpd/conf.d/php-fpm.conf # ProxyPassMatch でPHPファイルはfcgiに流すように指定 ProxyPassMatch ^(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1 disablereuse=on |
切り替え
モジュール版への切り替え
1 2 3 |
[root@sv ~]# systemctl stop php-fpm" [root@sv ~]# mv /etc/httpd/conf.d/php-fpm.conf /etc/httpd/conf.d/php-fpm .conf.bk [root@sv ~]# systemctl reload httpd.service |
PHP-FPMへの切り替え
1 2 3 4 |
[root@sv ~]# [root@sv ~]# systemctl start php-fpm [root@sv ~]# mv /etc/httpd/conf.d/php-fpm.conf.bk /etc/httpd/conf.d/php- fpm.conf [root@sv ~]# systemctl reload httpd.service |
MySQL 5.7 : phpMyAdmin
phpMyAdmin をインストールして、Web ブラウザ経由で MySQL の操作ができるように設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@sv ~]# yum --enablerepo=epel --enablerepo=remi-php7 -y install phpMyAdmin インストール: phpMyAdmin.noarch 0:4.4.15.10-2.el7 依存性関連をインストールしました: libtidy.x86_64 0:5.4.0-1.el7 libzip5.x86_64 0:1.2.0-1.el7.remi php-bcmath.x86_64 0:7.0.22-1.el7.remi php-fedora-autoloader.noarch 0:1.0.0-1.el7 php-pecl-zip.x86_64 0:1.15.1-1.el7.remi.7.0 php-php-gettext.noarch 0:1.0.12-1.el7 php-process.x86_64 0:7.0.22-1.el7.remi php-tcpdf.noarch 0:6.2.13-1.el7 php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.13-1.el7 php-tidy.x86_64 0:7.0.22-1.el7.remi 完了しました! |
内部ネットワークからのアクセス許可の設定
1 2 3 4 5 6 |
[root@sv ~]# vi /etc/httpd/conf.d/phpMyAdmin.conf # 17行目:アクセス許可IP追記 Require ip 127.0.0.1 192.168.60.0/24 # 34行目:アクセス許可IP追記 Require ip 127.0.0.1 192.168.60.0/24 |
apache再起動
1 2 3 |
[root@sv ~]# [root@sv ~]# systemctl restart httpd.service [root@sv ~]# |
クライアントPC で Web ブラウザを起動し、「http://(ホスト名またはIPアドレス)/phpmyadmin/」にアクセスします。
認証フォームが表示されるので、MySQL に登録したユーザーで認証してログインします。
ここでは例として root でログインします。