ここまでで EC2 へアクセスするための最低限の設定が完了したので、いよいよ Web サーバを構築していきます。
今回は、無料枠期間を想定して Web サーバ 1 台に色々とサービスを詰め込む前提で進めていきます。
nginx(公開用、管理用)
PHP
MySQL(クライアント)
Redis(クライアント)
Jenkins(デプロイ用)
また、ELB を介さずに直接 HTTPS のアクセスを受け付けます。
よって、Web サーバ側で SSL のサーバ認証をします。
サーバ証明書は Let’s Encrypt を利用します。
OSの基本設定
AmazonLinux をインストールして ec2-user を削除しただけの状態なので、まずは OS の基本的な設定をしていきます。
ec2-user の削除については「AmazonLinuxで新しいユーザを作成してec2-userを削除する」を参照してください。

また、ssh のアクセスは 10022 番ポートで受け付けるようにしています。
「AmazonLinuxでsshの待ち受けポートを22番から別の番号に変更する」の記事の通り、こちらに接続してコンソール画面で作業をしていきます。

まずは、アップデート通知が届いているパッケージをすべて更新しておきます。
1 | $ yum -y update |
次に開発ツール類をインストールします。
1 | $ yum -y groupinstall base "Development tools" |
不要サービスの停止
他にも不要なサービスはありますが、ここではパケットフィルタ系のサービスのみ停止しておきます。
インスタンス再起動時にもサービスが自動起動しないようにしておきます。
AWS の場合はポートをセキュリティグループで制御した方が楽ですからね。
1 2 3 4 5 6 7 | $ service iptables stop $ service ip6tables stop $ chkconfig iptables off $ chkconfig ip6tables off |
スワップの作成
t2.micro だとメモリが 1GB と心もとないのでスワップメモリを活用します。
2GB くらい割り当てておけばいいでしょう。
インスタンス再起動時にも割当たるようにしておきます。
1 | $ fallocate -l 2038904k /swap.img && mkswap /swap.img && swapon /swap.img |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ vi /etc/rc.local SWAPFILENAME=/swap.img MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'` if [ $MEMSIZE -lt 2097152 ]; then SIZE=`expr ${MEMSIZE} \* 2`k elif [ $MEMSIZE -lt 8388608 ]; then SIZE=${MEMSIZE}k elif [ $MEMSIZE -lt 67108864 ]; then SIZE=`expr ${MEMSIZE} / 2`k else SIZE=4194304k fi fallocate -l $SIZE $SWAPFILENAME && mkswap $SWAPFILENAME && swapon $SWAPFILENAME |
タイムゾーンの設定
日本向けのサービスですし、海外展開とか考えないのでタイムゾーンを UTC から JST に変更します。
実際に日付を確認してみるとわかりますが、最初は UTC になっていますからね。
下記のコマンドを実行したのは日本時間で 8/4 の 23:27 です。
1 2 3 | $ date Sat Aug 4 14:27:45 UTC 2018 |
JST はシンボリックリンクで /etc/localtime に設定しておきます。
1 2 3 | $ rm -f /etc/localtime $ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime |
スワップの再割り当て確認がてらインスタンスを再起動してもいいですが、再起動するのが困る場合は crond のサービス再起動でタイムゾーンを反映させます。
1 | $ service crond restart |
また、ハードウェアクロックの時刻も調整しておきます。
1 2 3 4 | $ vi /etc/sysconfig/clock ZONE="Asia/Tokyo" UTC=false |
nginxのインストール
Web サーバには Apache ではなく nginx を採用します。
まだまだ業務系システムを開発する会社では Apache を使うイメージが強いですが、個人的には nginx を使う会社の方が多くなってきた印象があります。
Windows Server で IIS 使われるよりは断然 Apache 使ってくれた方がいいですけどね(笑)
1 | $ yum install -y mailx nginx |
nginx のサービス自動起動を設定しておきます。
1 | $ chkconfig nginx on |
PHPのインストール
いい加減 PHP7 系に乗り換えたいのですが、アプリの改修が追い付いていないので今回は PHP5 系です。
実は使用している PHP のフレームワークが Codeigniter2 系なんですよね・・・。
Codeigniter3 系に置き換える際にはまた記事を書きたいと思います。
いつの間にか phpredis もパッケージに追加されているので yum で入れちゃいます。
1 | $ yum -y install php56 php56-devel php56-fpm php56-pdo php56-mysqlnd php56-mbstring php56-pecl-redis |
php-fpm の設定を調整します。
1 2 3 4 5 6 7 8 9 10 11 | $ vi /etc/php-fpm-5.6.d/www.conf ; 変更 user = nginx group = nginx listen = /var/run/php-fpm/php-fpm.sock listen.owner = nginx listen.group = nginx ; 以下をコメントアウト ;listen.acl_users = apache,nginx |
php.ini の設定を調整します。
1 2 3 | $ vi /etc/php.ini date.timezone = "Asia/Tokyo" |
php-fpm のサービス自動起動を設定しておきます。
1 | $ chkconfig php-fpm on |
nginxの設定
この時点で、nginx の設定をします。
まずはサイト単位ではなく nginx 全体の設定をします。
nginx.conf は下記のような感じで設定します。
ELB を通す場合はソースアドレスを取得するようにしておきましょう。(今回はELBは使いませんが)
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 | $ vi /etc/nginx/nginx.conf user nginx; worker_processes auto; worker_rlimit_nofile 100000; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; events { worker_connections 2048; multi_accept on; use epoll; } http { include /etc/nginx/mime.types; default_type application/octet-stream; client_max_body_size 5m; # For ELB set_real_ip_from 172.31.0.0/16; real_ip_header X-Forwarded-For; log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio" $request_time'; access_log /var/log/nginx/access.log main; server_tokens off; sendfile on; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; client_body_buffer_size 64k; reset_timedout_connection on; send_timeout 10; gzip on; gzip_http_version 1.0; gzip_types text/plain text/xml text/css application/xml application/xhtml+xml application/javascript application/x-javascript application/json application/x-httpd-php; gzip_disable "MSIE [1-6]\."; gzip_disable "Mozilla/4"; gzip_comp_level 1; gzip_proxied any; gzip_vary on; gzip_buffers 4 8k; gzip_min_length 1100; include /etc/nginx/conf.d/*.conf; } |
nginx のサービスを起動します。
1 | $ service nginx start |
php-fpm のサービスも起動します。
1 | $ service php-fpm start |
ここまでで Web サーバの基本的な設定は完了です。
次回、EC2 の最終仕上げをしていきます。