#
ドキュメント

Document

自分のための備忘録です。

Index

ref.
https://www.findxfine.com/category/aws

Amazon Linux

$ cat /etc/system-release

Amazon Linuxの特徴とCentOSとの違い まとめ | Developers.IO

VPCに配置したEC2へPHP, Apache, MySQLをインストール

参考記事
AWSへEC-CUBE3をインストール : EC-CUBE3 FindxFine | Web制作に関するメモ
Amazon Linuxで nginx + php7 環境構築 | // sakura note

  1. yum アップデート/Remiリポジトリ追加登録
  2. Apacheインストール/セットアップ
  3. PHP本体/拡張モジュールインストール
  4. MySQLインストール/セットアップ
  5. PHP本体バージョンアップ
  6. WordPressインストール

1. yum アップデート/Remiリポジトリ追加登録

sudoなしでrootとして実行可能にします。

$ sudo -i

既存のパッケージを更新します。

# yum update

登録済みリポジトリ確認をします。
(2017.03.09時点のAmazon Linux AMI release 2016.09の例)

# ls /etc/yum.repos.d
// amzn-main.repo  amzn-nosrc.repo  amzn-preview.repo  amzn-updates.repo  epel-testing.repo  epel.repo

Remiリポジトリを登録します。

# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -ivh remi-release-6.rpm

登録済みリポジトリを確認します。

# ls /etc/yum.repos.d
// ...  remi-php54.repo  remi-php70.repo  remi-php71.repo  remi-safe.repo  remi.repo   追加リポジトリ

2 Apacheインストール/セットアップ

# yum install httpd

各ディレクトリで.htaccessを使用可能にします。

設定ファイル:/etc/httpd/conf/httpd.conf

<Directory "/var/www/html">
…..
#AllowOverride None  <-- コメントアウト
AllowOverride All    <-- 追加
…..
</Directory>
# service httpd start 
// または
# apachectl start

3 PHP本体/拡張モジュールインストール

remi-php70リポジトリからPHP関連をインストールします。

2017年8月15日追記
remi-php70でエラーが発生しますが、remi-php71で正常に動作します。
以下php70をphp71と読み替えてください。   (2017年8月15日時点はphp72はyum installでいくつかエラーが発生します。)

本体をインストールします。

# yum --enablerepo=remi-php70 --disablerepo=amzn-main install php

必要な拡張モジュールをインストールします。

# yum --enablerepo=remi-php70 --disablerepo=amzn-main install php-pdo php-mysqlnd php-mbstring

gdインストール
php-gdをインストール前にlibwebp、gd-lastをインストールします。

# yum --disablerepo=amzn-main --enablerepo=epel install libwebp
# yum install gd-last
# yum --enablerepo=remi-php70 --disablerepo=amzn-main install php-gd 

PEAR/PECLインストールします。
php-pearをインストールする前にautomake, gccおよびphp-develをインストールします。
PECLはphp-pearのインストールの際に合わせてインストールされます。

# yum install automake
# yum install gcc
# yum --enablerepo=remi-php70 --disablerepo=amzn-main install php-devel
# yum --enablerepo=remi-php70 --disablerepo=amzn-main install php-pear

XDebugインストール

# pecl install xdebug

php.iniへ下記を追加します。

zend_extension=/usr/lib64/php/modules/xdebug.so

php.iniへ記載する代わりに20-xdebug.iniをScan for additional .ini filesへ作成することもできます。

例) xdebug.ini

zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.dump_globals = 1;
xdebug.dump.SERVER = *;
xdebug.dump.GET = *;

4 MySQLインストール

# yum install mysql-server

MySQLセットアップします。

// MySQLを起動します
# service mysqld start 

セキュリティ関連(rootユーザーのパスワード設定など)を設定します。

# /usr/bin/mysql_secure_installation

MySQL5.7からrootはmysqlクライアントからのみ接続可能です。
php - SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'. Tried everything - Stack Overflow

2017.08.15 追記1

バージョン5.6をインストール

# yum install mysql56-server

またmysqlクライアントもインストールする場合は下記を実行します。

# yum install mysql56
2017.08.15 追記2

Amazon LinuxでMySQLデーモンが起動できないときの対策です。

ログファイルを確認します。

/var/log/mysqld.log

下記行エラーが発生していました。

InnoDB: mmap(137363456 bytes) failed; errno 12

下記記事を参考に/etc/my.cnfでパフォーマンススキーマをオフに設定したら解消しました。
t2.nano で MySQL5.6 を動かすために | ゲンジニア日記 – presented by yskw.info

[mysqld]
...
...
performance_schema=off # <---- 追記

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

パフォーマンススキーマについては下記を参照ください。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 22.1 パフォーマンススキーマクイックスタート

5 PHP本体バージョンアップ

PHP7.0から7.1へアップデートします。yum updateでremi-repo71が利用可能になっていることが前提です。 既存のPHP本体を削除します。

# yum remove -y php
# yum install -y --enablerepo=remi-php71 --disablerepo=amzn-main php

6 WordPressインストール

# curl -LO http://ja.wordpress.org/latest-ja.tar.gz
# tar xvzf latest-ja.tar.gz
WordPress用データベース作成
// ユーザー作成
// rootでログイン
mysql> GRANT ALL PRIVILEGES ON *.* TO <username> IDENTIFIED BY '<password>';
// rootでログアウトし作成ユーザーでログイン
mysql> CREATE DATABASE <database> DEFAULT CHARACTER SET utf8mb4;

VPC上に配置したEC2へPHP, Nginx, MysQLをインストール

Apacheと同様にRemiリポジトリを追加します。

参考記事   YumでNginxセットアップ+PHP-FPM - Qiita

Yumでインストール

# yum install -y httpd   // httpdをインストールしないとNginxが正常にインストールできなかったため
# yum install -y nginx

PHP7, PHP-FPMインストール

# yum --enablerepo=remi-php71 --disablerepo=amzn-main install php php-fpm

設定ファイル変更

設定ファイル パス
Nginx /etc/nginx/nginx.conf
PHP-FPM /etc/php-fpm.d/www.conf
nginx.conf
server {
        .....
        server_name  52.199.2.159;
        .....

        .....

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # これを必ず記載
            # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

       .....
}
www.conf
user nginx
group nginx

PHP-FPM起動

/etc/rc.d/init.d/php-fpm restart

VPC上にEC2(PHP, Apache)とRDSを配置

EC2へMySQLをインストールせずRDSを利用します。

RDSのポイント

  • RDSのインスタンスを作成する前にRDSサブネットグループを作成します。RDSサブネットグループはAvailability Zoneの異なる2つのサブネットを選択する必要があります。
     2つのサブネットは事前に作成しておいてください。
  • RDSのセキュリティグループは送信元のデフォルトはRDSのプライベートアドレスですがEC2のプライベートアドレスへ変更する必要があります。

EC2へmysqlクライアントインストール

# yum install mysql

RDSインスタンスの 作成が完了するとエンドポイントが表示されるのでmysqlの接続でエンドポイント指定

Ubuntu16.04

準備

apt-get updateで参照するリポジトリを最新にします。   当処理を行わないとパッケージのインストール(apt-get install)で古いリポジトリを参照しエラーが発生する可能性があります。

$ sudo apt-get update

Ubuntuバージョン確認

$ sudo cat /etc/lsb-release
// 16.04

Ubuntuアーキテクチャ確認

$ sudo arch
// x86_64

LAMP環境構築

以下の順番は大切です。

  1. Apacheのインストール
  2. PHPのインストール
  3. MySQLのインストール

1と2が逆になるとうまく動作しません。

参考記事

How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04 | DigitalOcean

Apacheインストール

最新版をインストールします。

$ sudo apt-get install apache2

バージョンを指定したインストールの方法を確認してください。

設定ファイル(/etc/apache2/apache2.conf)を検証します。

$ apache2ctl configtest

下記アドレス警告が表示されるときはServerNameへiPアドレスを設定します。

Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message

apache2.conf

ServerName xxx.xxx.xxx.xxx
Apache2起動/再起動
# service apache2 start
# service apache2 restart
# service apathe2 stop

PHPインストール

最新版をインストールします。

$ sudo apt-get install php

Apacheのモジュールとして動作させるためのライブラリをインストールします。   バージョンを指定したインストールの方法を確認してください。

$ sudo apt-get install libapache2-mod-php

MySQLインストール

最新版をインストールします。

$ sudo apt-get install mysql-server

MySQL5.7からrootユーザーはmysqlクライアントからのみ接続可能です。   php - SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'. Tried everything - Stack Overflow

バージョンを指定したインストールの方法を確認してください。

セキュリティ関連を設定します。

# sudo mysql_secure_installation

PHP拡張モジュールインストール

本体にバンドルされているモジュールは下記コマンドで確認できます。

# php -m

足りない拡張モジュールを必要に応じインストールします。
(php-mysqlndはバンドルされていますが今回インストールした本体ではコンパイル時に有効化されていなかったのでダイナミック拡張モジュールとして新たにインストールしました。)

# apt-get install php-mbstring php-mysqlnd php-gd

PECL/PEARインストール

PECLのコンパイルで必要になるphpizeなどのPHP開発ツールをインストールします。

# apt-get install php-dev

PEARをインストールします。
PECLはPEARをインストールすると同時にインストールされます。

# apt-get install php-pear

PECLのインストール例としてXDebugとImageMagickをインストールします。

# pecl install xdebug

php-devをインストールしていないとphpizeがない旨のエラーが発生します。

iniファイル(/etc/php/7.0/apache2/php.ini)で読み込みます。

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

zend_extension=/usr/lib/php/20151012/xdebug.so

ImageMagick

ImageMagickをインストールする準備として下記をインストールしてください。

# apt-get install pkg-config
# apt-get install libmagickwand-dev

PECLでImageMagickをインストールします。

# pecl install imagick

参考記事
» PHPにPECLからImageMagickをインストールする

WordPressインストール

# curl -LO http://ja.wordpress.org/latest-ja.tar.gz
# tar xvzf latest-ja.tar.gz
データベース作成

ユーザー追加

GRANT ALL PRIVILEGES ON <db>.* TO '<user>'@'<host>' IDENTIFIED BY '<password>' WITH GRANT OPTION;
flush privileges

データベース作成

CREATE DATABASE <database> DEFAULT CHARACTER SET utf8mb4;

Ubuntu16.04 Appendix

インストール済みパッケージ確認

$ dpkg -l             // Debian系インストール済パッケージ一覧を表示
$ dpkg -L <package>   // 指定したパッケージがインストールされたパスを表示
$ aptitude search "~i" // dpkgの代わりにaptituteも使える
$ aptitude search <package> 

Yum

リポジトリを登録(例Remiリポジトリ)

# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -ivh remi-release-6.rpm

登録リポジトリ設定ディレクトリ

# ls /etc/yum.repos.d

登録リポジトリ一覧

# yum repolist

登録リポジトリ設定ファイルでenabled=1のリポジトリのみ表示します。EPELはデフォルトは0なので一覧に表示されません。

パッケージインストール

# yum --enablerepo=remi-php70 --disablerepo=amzn-main install php-gd

enabled=0のリポジトリは--enablerepoオプションで明示的に指定する必要があります。また探索から明示的に除外するリポジトリは--disablerepoオプションで指定します。

インストール済みパッケージ

# yum list installed
// php関連
# yum list installed | grep php

PHP関連インストール済み削除

# yum remove php-*

リポジトリの優先順位設定

// yum-plugin-prioritiesがインストールされていないときインストール
# yum install -y yum-plugin-priorities

各リポジトリの優先順項目設定
例)remi-php70

priority=1 # 追加 数字が小さい方が優先順位がたかい
enabled=1  # デフォルトで利用可能に変更 enable=0は--enablerepoで明示的に指定が必要です。

OSセキュリティ

  • インストール済みパッケージを最新へバージョンアップ
    yum-cronで定期的にyum updateをします。
  • ログイン/ユーザー
  • rootログイン禁止

    echo > /etc/securetty

  • SSHでのrootログイン禁止
     AWSはSSHでのrootログインが禁止されいます。SSHのログインユーザーはec2-user(Amazon Linux)/ubuntu(Ubuntu)ユーザーです。
     SSHの設定は/etc/ssh/sshd_config
  • SSHサーバー
  • ポート番号変更
  • ポート番号設定はSecurity Groupsで行いますがEC2ではSSHポート番号が変更出来ないようです((残)要調査)。
  • 不要なサービス停止
    chkconfig, ntsysv
  • ネットワークセキュリティ
    $ netstat -atun
    $ iptables -L
    $ ip6tables -L
  • アンチウイルスソフト(Clam AntiVirus)
  • Dos(Denial of Service)   プロードキャスト宛のICMPパケットに応答しない(未)

yum-cron

# yum install -y yum-cron

ユーザー管理(CentOS)

  1. OSのユーザーを追加
  2. シェルログインの禁止
  3. パスワード設定
// ユーザー追加
$ sudo useradd <user> 
// シェルログイン禁止
$ sudo usermod -s /bin/false <user>
// パスワード設定	
$ sudo passwd <user>

AWSはrootのログインを禁止しています。
ログインはSSH経由でec2-userユーザー(Amazon Linux)、ubuntuユーザー(Ubuntu)のみ可能です。

ユーザー一覧

/etc/passwdに記載されています。 ユーザー名のみ抽出

cat /etc/passwd|sed -e 's/:.*//g'

不要なサービス停止

ランレベル

現在のランレベル確認

# runlevel

ランレベル一覧

# chkconfig --list

httpdのランレベル確認

# chkconfig --list | grep httpd

自動起動停止

# chkconfig httpd on

Clam AntiVirus

# yum install -y clamav    // 本体です。
# yum install -y clamav-update // ウイルス定義更新コマンドfreshclamをインストールします。

/etc/freshclam.confのExampleをコメントアウトします。

# Comment or remove the line below. 
# Example  ここをコメントアウト

スキャン実行(var/www/htmlを再帰的にスキャン)。

# clamscan -r /var/www/html

Cronで定義ファイル更新スキャンを実行します。

Cron

ユーザーを指定して編集します。

# crontab -u <user> -e

ユーザーを省略すると現在のユーザーのcrontabを編集します。

# crontab -e

1分ごとにyumのアップデートを実行します。

*/1 * * * * yum -y update >> /var/www/html/cron.txt

60分ごとにyumのアップデートを実行します。

*/60 * * * * yum -y update >> /var/www/html/cron.txt

12時間ごとyumのアップデートを実行します。

* */12 * * * yum -y update >> /var/www/html/cron.txt

crontabの書き方 | server-memo.net

疑問

priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                                                         
amzn-updates/latest