馬とテニスのIT革命
馬とテニスとリラックマが好きな IT 系のエンジニアです。
AWS

AmazonLinuxでnginxを使ったWebサーバを構築する

ここまでで 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を削除するAmazonLinux ではデフォルトで ec2-user というユーザが作成されています。 これは AmazonLinux で ...

また、ssh のアクセスは 10022 番ポートで受け付けるようにしています。

こちらに接続してコンソール画面で作業をしていきますよ。

あわせて読みたい
AmazonLinuxでsshの待ち受けポートを22番から別の番号に変更するEC2 で Web サーバを構築する手順に盛り込もうと思いましたが、ssh の待ち受けポートの変更だけで記事を独立させてみました。 ...

まずは、アップデート通知が届いているパッケージをすべて更新しておきます。

$ yum -y update

次に開発ツール類をインストールします。

$ yum -y groupinstall base "Development tools"

不要サービスの停止

他にも不要なサービスはありますが、ここではパケットフィルタ系のサービスのみ停止しておきます。

インスタンス再起動時にもサービスが自動起動しないようにしておきます。

AWS の場合はポートをセキュリティグループで制御した方が楽ですからね。

$ service iptables stop

$ service ip6tables stop

$ chkconfig iptables off

$ chkconfig ip6tables off

スワップの作成

t2.micro だとメモリが 1GB と心もとないのでスワップメモリを活用します。

2GB くらい割り当てておけばいいでしょう。

インスタンス再起動時にも割当たるようにしておきます。

$ fallocate -l 2038904k /swap.img && mkswap /swap.img && swapon /swap.img
$ 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 です。

$ date

Sat Aug  4 14:27:45 UTC 2018

JST はシンボリックリンクで /etc/localtime に設定しておきます。

$ rm -f /etc/localtime

$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

スワップの再割り当て確認がてらインスタンスを再起動してもいいですが、再起動するのが困る場合は crond のサービス再起動でタイムゾーンを反映させます。

$ service crond restart

また、ハードウェアクロックの時刻も調整しておきます。

$ vi /etc/sysconfig/clock

ZONE="Asia/Tokyo"
UTC=false

nginxのインストール

Web サーバには Apache ではなく nginx を採用します。

まだまだ業務系システムを開発する会社では Apache を使うイメージが強いですが、個人的には nginx を使う会社の方が多くなってきた印象があります。

Windows Server で IIS 使われるよりは断然 Apache 使ってくれた方がいいですけどね(笑)

$ yum install -y mailx nginx

nginx のサービス自動起動を設定しておきます。

$ chkconfig nginx on

PHPのインストール

いい加減 PHP7 系に乗り換えたいのですが、アプリの改修が追い付いていないので今回は PHP5 系です。

実は使用している PHP のフレームワークが Codeigniter2 系なんですよね・・・。

Codeigniter3 系に置き換える際にはまた記事を書きたいと思います。

いつの間にか phpredis もパッケージに追加されているので yum で入れちゃいます。

$ yum -y install php56 php56-devel php56-fpm php56-pdo php56-mysqlnd php56-mbstring php56-pecl-redis

php-fpm の設定を調整します。

$ 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 の設定を調整します。

$ vi /etc/php.ini

date.timezone = "Asia/Tokyo"

php-fpm のサービス自動起動を設定しておきます。

$ chkconfig php-fpm on

nginxの設定

この時点で、nginx の設定をします。

まずはサイト単位ではなく nginx 全体の設定をします。

nginx.conf は下記のような感じで設定します。

ELB を通す場合はソースアドレスを取得するようにしておきましょう。(今回はELBは使いませんが)

$ 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 のサービスを起動します。

$ service nginx start

php-fpm のサービスも起動します。

$ service php-fpm start

ここまでで Web サーバの基本的な設定は完了です。

次回、EC2 の最終仕上げをしていきます。

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/10/19 13:59:11時点 Amazon調べ-詳細)

あなたにオススメ