paranitips

Never stop learning! がモットーのゆるふわエンジニアブログ

nginx.confを8万行削除した話

f:id:paranishian:20181010192436p:plain

強い気持ちでやりました😇

自分が関わる前からあったnginx.conf。

それはそれは大きく膨らんでおりました🐷

デプロイはchefで行っていたんですが、dry-runでも時間がかかりすぎて差分確認するのも一苦労、、という状態😢

少しでも快適な開発環境にすべく、やっていき!💪

TL;DR

大したことはやってなくて、アクセスログと照らし合わせて地道に削除していっただけなのであしからず🙇

削除の方針

nginx.confの中身を見ると、ほとんどがもはや機能しているかわからないリダイレクトのコードだったので、今回はそれらを削除していくことにしました。

今は使っていないURLでもどこかのブログやサイトで昔のURLが残っていることがあります 🤔💦

ただ、そのURLをどこまで面倒見るの?って話で、今回はプロダクトオーナーと相談して、

「直近3ヶ月でアクセス数がxxに満たない場合はSEO的にも価値がないので削除する」

という方針にしました。
(特に意味はないけど一応数字を伏せておいた😇)

アクセスログの保存と解析

サイトへのアクセスはすべてALBを経由してnginxに流れているので、ALBのアクセスログを見ていきます。

という流れでアクセスログデータを取得します。

ALBのアクセスログをS3に格納する

アクセスログのS3への格納作業自体はポチポチするだけで完了します👌
Application Load Balancer のアクセスログ - Elastic Load Balancing

(この作業を3ヶ月以上前にやってたので、現時点ですでにログデータがたまった状態です)

Athenaの連携とデータ取得

Athenaはこのへんのドキュメントとサイトを参考にしました👇

では、さっそくテーブルを作成していきます。

あらかじめパーティション(今回はdtにした)を設定して作成します。

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
    type string,
    time string,
    elb string,
    client_ip string,
    client_port int,
    target_ip string,
    target_port int,
    request_processing_time double,
    target_processing_time double,
    response_processing_time double,
    elb_status_code string,
    target_status_code string,
    received_bytes bigint,
    sent_bytes bigint,
    request_verb string,
    request_url string,
    request_proto string,
    user_agent string,
    ssl_cipher string,
    ssl_protocol string,
    target_group_arn string,
    trace_id string,
    domain_name string,
    chosen_cert_arn string,
    matched_rule_priority string,
    request_creation_time string,
    actions_executed string,
    redirect_url string,
    new_field string
    )
    PARTITIONED BY (dt string)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
    'serialization.format' = '1',
    'input.regex' = 
'([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) ([^ ]*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\"($| \"[^ ]*\")(.*)')
    LOCATION 's3://<your-alb-logs-directory>/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<region>';

(locationの<>部分はよしなに変更してください。)

Athenaでは各クエリでスキャンされるデータ量に基づいて課金されるので、対象を絞るためにパーティションつくっておきます。
今回は直近3ヶ月のデータだけで十分だったので手動でパーティションを作りました。
(なのでパーティションの自動化も今回はしていません)

ALTER TABLE alb_logs ADD
  PARTITION (dt='2018-07') LOCATION 's3://<your-alb-logs-directory>/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<region>/2018/07'
  PARTITION (dt='2018-08') LOCATION 's3://<your-alb-logs-directory>/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<region>/2018/08'
  PARTITION (dt='2018-09') LOCATION 's3://<your-alb-logs-directory>/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<region>/2018/09'

パーティションの確認

show partitions alb_logs

リクエストの取得

パーティションを指定してデータ取得します。

SELECT count(*) AS request_count,
         request_url
FROM alb_logs
WHERE dt >= '2018-07'
        AND dt <= '2018-09'
GROUP BY  request_url
ORDER BY  request_count DESC

結果ファイルをcsvでダウンロードすると、以下のようなデータが確認できます。

"request_count","request_url"
"12345","https://sample.com:443/path/to/hoge"
"10000","https://sample.com:443/path/to/fuga"
"8000","http://sample.com:80/path/to/piyo"
...

あとは、grepsedなどのコマンドを駆使してリクエスト数を確認し、nginx.confと照らし合わせて削除していくだけです。(つらそう😇)

例えば、ポート番号が邪魔なのでこんなことをしてパスだけ確認したりとか。

egrep ':\d+\/path\/to\/' results.csv | sed -E "s/http.+:(443|80)\//\//g"

今回はじめてawksedを使いましたが、まだまだ使いこなせてない感😪

気の遠くなるような作業かと思いましたが、意外とトップレベルで削除できるものが多かったのでなんとかなりました。
(たとえば /path/to/hogegrepで引っかからなかったら/path/to/hoge/1/path/to/hoge/2など、配下のURLに関するコードも一気に削除できるよね、みたいな。)

地道な削除作業が完了し、QAを経て無事リリースできました🎉

リリース後は特に障害も起きず、chefでのデプロイもスムーズになったので頑張った甲斐がありました。よかった。

幸せに開発するためには自分で環境を変えて行かなあかんのや!という強い気持ち。

以上です🤗

技術書典で買った「さわって学べる!iOSテスト駆動開発」を読んだのでその感想と3章の誤植の共有

今年の技術書典ではboothでiOS中心に10冊ほど買いました。

今回読んだ本はこれ👇

shindyu.booth.pm

swiftでテストを書いたことがなかったので、TDDを勉強するというよりは、その書き方や導入が把握できればいいかなー、と思って読んでみました。
結果、とてもわかりやすく体系的に学べたので無事テストを書いていけそうです。
これで1,000円とは、お買い得な世の中ですね🤗

TDDをやっていて一つ気になったのが、
「プロパティや関数名をまだ宣言してないのでコード補完が効かなくてつらい問題」
特にtableviewまわりはメソッド名長すぎてtypoがつらい😢

こういうのってどうしてんだろうなーと思って友人のエンジニアに聞いてみたら、

まずは「tableviewがあること」みたいなテストを書いてプロパティつくっていくかなー。 そのテストが通ってればtableviewのコード補完も効くしね。

と言われて、なるほど!!と思った💡

その他メモ

  • Dependency Injectionの中にはConstructor InjectionとSetter Injectionなるものがある
  • 初耳のアーキテクチャがあった
    • MVP, VIPER
  • 既存アプリにTDDを導入する手順は参考になった
    • ビルド時間の計測
      • BuildTimeAnalyzerはそのうち使ってみる
    • Carthageへの移行
    • Embedded Frameworkの利用
    • CIの導入
      • CircleCIは経験済みなのでbitrise使ってみる

3章の誤植の共有

3章は実際にアプリをつくっていく流れだったので、理解のために写経しました。
途中でビルドやテストが通らなくて困ったので、「こうやったら進行できたよ」という共有です。
同じように写経する人の参考になれば😉


p.38 ファイル名が間違っている

ArticleListViewControllerTests.swiftArticleListViewController.swift

p.39 宣言文が間違っていてテストが通らない

// この部分を
let vc ArticleListViewController()

// こう書き換える
let article = Article(title: "記事タイトル")
let client = FakeArticleListAPIClient(fakeResponse: [article])
let vc = ArticleListViewController(client: client)

p.41 itemsの初期化をしていないのでビルドが通らない

// この部分を
var items: [Article]

// こう書き換える
var items: [Article] = []

p.42 tableviewにcellを登録してないので落ちる

// この一行をviewDidLoadに追加する
tableView.register(ArticleListCell.self, forCellReuseIdentifier: "ArticleListCell")

p.45 moduleをimportしてないのでテストできない

// ArticleListViewControllerTests.swiftに追加する
import SafariServices

以上です。
swiftやってくぞ!💪

nginx+wordpressのdocker環境を構築する

はじめに

localにwordpressが動く環境がすでにあったのですが、メンバーの新規参入時など環境構築が大変だったのでdockerで環境を構築できるようにしました。

dockerはこの本を読んで勉強しました👇

とおもったらもう第二版が出ていた😮

dockerでwordpress環境をつくるサンプルはたくさんあったのですが、一からwordpressをつくっていくものだったりapache前提だったりとちょっと要件が違う・・・🤔

今回は「既存のnginx+wordpress環境をdockerで構築する」をやっていきます💪

主にこの記事を参考にしました。とてもわかりやすかったです🙏
docker-compose で作る nginx + PHP-FPM7 + HTTP/2 に対応したモダンな WordPress 開発環境 – PSYENCE:MEDIA

ってことでまとめます。

移行の方針

  • nginx, wordpressの動く環境をdockerで構築する
    • apacheが入っていないイメージを使う
  • mysqlはlocalで動いているものをそのまま使う
    • のちのち本番をdocker化するにしてもRDSを使うので問題ないはず🤔

ディレクトリ構成

❯ tree . -L 2
.
├── docker-compose.yml
├── nginx
│   └── default.conf
└── my_wordpress
    ├── index.php
    ├── ...

docker-compose.yml

読んだ本ではversion2の書き方でしたが、version3で書いてみました😉
記述がいろいろ省略されてたりしていたけどそんなに大変じゃなかった💪
イメージのバージョンは既存の環境に合わせてるだけなので、最新を使えるなら最新を使ったほうがいいです👌
wordpressのイメージはtagを指定してapacheが入っていないものを使います。

version: '3'
services:
  nginx:
    image: nginx:1.15.3-alpine
    restart: always
    ports:
      - "8082:80"
    depends_on:
      - wordpress
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./my_wordpress:/var/www/html

  wordpress:
    image: wordpress:4.9.8-php5.6-fpm-alpine
    restart: always
    volumes:
      - ./my_wordpress:/var/www/html

nginx.conf

fastcgi_passにはdocker-compose.ymlに記述したservice名を指定します。(今回はwordpress

server {
  listen 80;
  server_name _;

  root  /var/www/html;
  index index.php;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(\.+)$;
    fastcgi_pass wordpress:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

いざdockerを起動

$ docker-compose up -d

で起動して、 http://localhost:8082 で既存のwordpressページが表示されればOK👍

おまけ

よく使うコマンド

コンテナを起動する

$ docker-compose up -d

コンテナを停止する

$ docker-compose stop

コンテナを再起動する

$ docker-compose restart

logを見とく

$ docker-compose logs -f

コンテナに入る

$ docker exec -it {container_name} sh

dockerイメージの履歴を見る

$ docker history {image}

今回、wordpressイメージの違いを見るために使いました。

❯ docker history wordpress
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
41e689eea0cd        3 weeks ago         /bin/sh -c #(nop)  CMD ["apache2-foreground"]   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop) COPY file:40bd880f26da3ada…   7.62kB
<missing>           3 weeks ago         /bin/sh -c set -ex;  curl -o wordpress.tar.g…   27.3MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV WORDPRESS_SHA1=0945ba…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV WORDPRESS_VERSION=4.9…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/www/html]       0B
<missing>           3 weeks ago         /bin/sh -c a2enmod rewrite expires              60B
<missing>           3 weeks ago         /bin/sh -c {   echo 'opcache.memory_consumpt…   171B
<missing>           3 weeks ago         /bin/sh -c set -ex;   savedAptMark="$(apt-ma…   3.5MB
<missing>           5 weeks ago         /bin/sh -c #(nop)  CMD ["apache2-foreground"]   0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0B
<missing>           5 weeks ago         /bin/sh -c #(nop) WORKDIR /var/www/html         0B
<missing>           5 weeks ago         /bin/sh -c #(nop) COPY file:24613ecbb1ce6a09…   1.35kB
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-php-e…   0B
<missing>           5 weeks ago         /bin/sh -c docker-php-ext-enable sodium         20B
<missing>           5 weeks ago         /bin/sh -c #(nop) COPY multi:c925dfb355ea16b…   6.44kB
<missing>           5 weeks ago         /bin/sh -c set -eux;   savedAptMark="$(apt-m…   56.9MB
<missing>           5 weeks ago         /bin/sh -c #(nop) COPY file:207c686e3fed4f71…   587B
<missing>           5 weeks ago         /bin/sh -c set -xe;   fetchDeps='   wget  ';…   13.4MB
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENV PHP_SHA256=3585c1222e…   0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENV PHP_URL=https://secur…   0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENV PHP_VERSION=7.2.9        0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV GPG_KEYS=1729F83938DA…   0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHP_LDFLAGS=-Wl,-O1 -…   0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHP_CPPFLAGS=-fstack-…   0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHP_CFLAGS=-fstack-pr…   0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHP_EXTRA_CONFIGURE_A…   0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHP_EXTRA_BUILD_DEPS=…   0B
<missing>           2 months ago        /bin/sh -c {   echo '<FilesMatch \.php$>';  …   237B
<missing>           2 months ago        /bin/sh -c set -ex  && . "$APACHE_ENVVARS"  …   33B
<missing>           2 months ago        /bin/sh -c a2dismod mpm_event && a2enmod mpm…   68B
<missing>           2 months ago        /bin/sh -c set -ex   && sed -ri 's/^export (…   1.92kB
<missing>           2 months ago        /bin/sh -c #(nop)  ENV APACHE_ENVVARS=/etc/a…   0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV APACHE_CONFDIR=/etc/a…   0B
<missing>           2 months ago        /bin/sh -c apt-get update  && apt-get instal…   42.3MB
<missing>           2 months ago        /bin/sh -c mkdir -p $PHP_INI_DIR/conf.d         0B
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHP_INI_DIR=/usr/loca…   0B
<missing>           2 months ago        /bin/sh -c apt-get update && apt-get install…   209MB
<missing>           2 months ago        /bin/sh -c #(nop)  ENV PHPIZE_DEPS=autoconf …   0B
<missing>           2 months ago        /bin/sh -c set -eux;  {   echo 'Package: php…   46B
<missing>           2 months ago        /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           2 months ago        /bin/sh -c #(nop) ADD file:919939fa022472751…   55.3MB

あー、apache入ってるなー。🧐

❯ docker history wordpress:4.9.8-php5.6-fpm-alpine
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7d3fe91e2ab2        3 weeks ago         /bin/sh -c #(nop)  CMD ["php-fpm"]              0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop) COPY file:40bd880f26da3ada…   7.62kB
<missing>           3 weeks ago         /bin/sh -c set -ex;  curl -o wordpress.tar.g…   27.3MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV WORDPRESS_SHA1=0945ba…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV WORDPRESS_VERSION=4.9…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/www/html]       0B
<missing>           3 weeks ago         /bin/sh -c {   echo 'opcache.memory_consumpt…   171B
<missing>           3 weeks ago         /bin/sh -c set -ex;   apk add --no-cache --v…   3.52MB
<missing>           3 weeks ago         /bin/sh -c apk add --no-cache   bash   sed      1.5MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  CMD ["php-fpm"]              0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  EXPOSE 9000/tcp              0B
<missing>           3 weeks ago         /bin/sh -c set -ex  && cd /usr/local/etc  &&…   23.4kB
<missing>           3 weeks ago         /bin/sh -c #(nop) WORKDIR /var/www/html         0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-php-e…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop) COPY multi:af8a06a5cfc82b1…   6.43kB
<missing>           3 weeks ago         /bin/sh -c set -xe  && apk add --no-cache --…   34.7MB
<missing>           3 weeks ago         /bin/sh -c #(nop) COPY file:207c686e3fed4f71…   587B
<missing>           3 weeks ago         /bin/sh -c set -xe;   apk add --no-cache --v…   13.8MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_SHA256=5000d82610…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_URL=https://secur…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_VERSION=5.6.37       0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV GPG_KEYS=0BD78B5F9750…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_LDFLAGS=-Wl,-O1 -…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_CPPFLAGS=-fstack-…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_CFLAGS=-fstack-pr…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_EXTRA_CONFIGURE_A…   0B
<missing>           3 weeks ago         /bin/sh -c mkdir -p $PHP_INI_DIR/conf.d         0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHP_INI_DIR=/usr/loca…   0B
<missing>           3 weeks ago         /bin/sh -c set -x  && addgroup -g 82 -S www-…   4.85kB
<missing>           3 weeks ago         /bin/sh -c apk add --no-cache --virtual .per…   2.69MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PHPIZE_DEPS=autoconf …   0B
<missing>           2 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           2 months ago        /bin/sh -c #(nop) ADD file:25f61d70254b9807a…   4.41MB

こっちはapache入ってない。採用!

以上です🤗