インフラブログ

とあるWEBサイトのインフラを構築運用するメモ

ChatOpsなデプロイ環境にしたい

新しい案件の話しがあり、インフラ構成、デプロイ周りをどうしようかと考えていました。 前までクラウドはAWS一択でしたが最近はGCPなどにも興味があり、 「とりあえずDockerが動くクラウドならうちらが作るアプリも動くだろう」 というスタンスでDockerを積…

RedisのHyperLogLogを試してみる

AWSのElasticCacheのredisが2.8.19になりHyperLogLogというのをサポートしたとのことなので、どんなものか試してみました。 HyperLogLogの利用法としてユニークユーザの推移に便利と記事でよく紹介されているようで、 今回のお試しでもwebサイトに訪問した人…

hubotを使ってあれこれする(mongodbをtailする)

サイトの50xエラー発生時になるべくリアルタイムで社内に周知する。 運用しているサイトで50xエラーが発生した際に、なるべくリアルタイムで社内に周知したいと考えていました。 nginxのログはcapped属性でmongodbにも集約しているので、これを常時tail監視…

hubotを使ってhipchat上であれこれする

hubot hipchat やりたいこと チャットアプリのhipchatとボットとして動くhubotを使って、下記の事をしてみようと思い、設定してみました。 社内にあるubuntuでhubotを起動して、hipchat上にボットとして常駐させるようにします。 運用するサイトに対する問い…

Docker環境でRailsを起動するところまで確認する

作業確認流れ プライベートなDocker registry(S3 backed)を用意する。 registryのWEBUIを用意する。 手元のmacでdockerが動くようにする。 既存のrailsアプリをDockerイメージ化してregistryにpushする。 Dockerまで動く状態の別の端末からRailsアプリのイメ…

社内のクラウドストレージにownCloud(+AWS S3)を使う。

AWS S3の設定 アクセスキー、アクセスシークレットキーの作成 S3でバケットexample-owncloudを作成。 IAMでuser owncloud作成。AmazonS3FullAccessの権限を付ける。 アクセスキー、アクセスシークレットキー作成 ポリシーを下記に変更 { "Version": "2012-10…

RDSのリードレプリカ作成後にテーブルデータをプリロードする

レプリカ作成した後、全テーブルをプライマリキーで検索してテーブルデータをメモリにロードしておきます。 #!/bin/sh stage=$1 stty -echo echo -n "password for ${stage} ?> " read pass stty echo SLAVE="${stage}-db-slave-1.xxxxxxxxxxx.ap-northeast-…

fluentd+Elasticsearch+kibanaでnginxのログを視覚化する

nginxのアクセスログをfluentdを経由してElasticsearchに保存します。 ログの視覚化にはkibanaを使います。 こんな感じで500系のエラーの発生具合を時系列のグラフで見れるようにします。 仕組みについてはこちらの記事が参考になります 設定 Elasticsearch…

mongodb構築

WEBサーバのアクセスログ、アプリのアクティビティログをmongodbで保存することにしました。 アクセスログの追跡をできるようにrockmongoというWEBユーザーインタフェイスも入れておきます。 レプリカセットを作る PRIMARY,SECONDARY,ARBITERで3つのインス…

NginxでPOSTデータをログに出力する

POSTのデータもログにとっておいたほうが後の調査にも役立つだろうと思い、設定をしておきます。nginxの場合、プロキシしている前提になりますが、location内にもaccess_logを書くことで$request_bodyからPOSTデータが拾えるようです。一応リクエストのボデ…

AWS CloudFront経由で静的コンテンツを配信する

画像、音声、css、jsなど静的コンテンツをAWS CloudFront経由で配信してwebサーバの負荷を軽減するようにします。 CloudFrontはリバースプロキシ型のキャッシュサーバのように動作します。 CloudFrontを試していたところ一つ問題を確認しています。クライア…

AWSのScheduled Scalingを使って日時に合わせてインスタンス数を調整する

時間帯やイベント開催中かどうかによってアクセス数が変動すると思われるので、appsサーバのインスタンス増減をスケジューリングできるようにします。以下の想定でスケジュールを設定してみます。 スケジュールの例 イベント非開催時の通常時 深夜過疎(1:00-…

AWS Auto Scalingでunicornサーバとresqueサーバの台数を調節する 

ピークタイムやイベント開催中かどうかによってWEBサイトの負荷が大きく変動するのが予想されるので、オートスケーリングを使用してインスタンスを必要な時に必要な台数だけ確保するようにしてサーバ費用を抑えるようにします。 どのサーバにオートスケーリ…

AWS SNSでメール通知を行う

AWS Cloudwatchで監視を行っていてしきい値超えを検知した場合に、AWS SNSで設定されている通知を行う事ができます。 SNSでの通知としては・メールを送信・指定のURLにアクセスする・APNsにPush通知を行うなどがありますが、今回は指定のメールアドレスにメ…

AWS RDSでMySQLサーバを立ち上げる

RDSを使ってmysqlをmaster,slaveのレプリケーション構成で立ち上げます。 redisと同じようにスクリプトでセットアップできるようにします。パラメータは初期パラメータとしてとりあえずの設定をしています。 MultiAZでマスタを立ち上げるとactiveがap-northe…

AWS ElasticacheでRedisサーバを立ち上げる

Redisを使用するのでelasticacheのredisでmaster-slaveのレプリケーション構成を作ります。 手順は以下のようになります。 パラメータグループを新規作成、一部のパラメータを変更する(aof,timeout) このパラメータグループを使うノードを作成する(マスタ…

AWS ELB(Elastic Load Balancing)作成

インターネットからのHTTPリクエストを受けるproxyサーバとRailsが動くアプリケーションサーバの間にロードバランサであるELBを挟んで複数のアプリケーションサーバにリクエストを振るようにします。ちなみにELBはZeus製と聞いたことがあります。 AWS Mamage…

redis-commanderでredisサーバへの操作を行えるようにする

node.jsで作られたredisマネジメントツールredis-commanderをインストールします。 GUIでredisの操作できます。 手順 $sudo yum install nodejs $sudo yum install npm $sudo npm install -g redis-commander haproxy redis-commanderからはローカルのhaprox…

unicorn/resqueのプロセス管理にeyeを使う

unicorn,resqueのプロセス管理に今回はeyeを使うことにします。 はじめBluepillで設定していたのですが、Ruby2.0環境だとBluepillのプロセスがゾンビで溜まりまくるという問題があり、代替をさがしていたところeyeというのがありました。God、Bluepillを参考…

nginxでソーリーページを返す - メンテ以外の場合

以下の状況の場合はnginxでエラーハンドリングを行います。 リバースプロキシしてappsサーバからの応答が一定以上ない場合のタイムアウト appsサーバからのステータスコードが40x,50xの場合 nginxが40X,50Xのステータスコードでレスポンスを返すと、プラット…

メール以外の方法でもアラートの通知を行う(Twilio)

アラート通知の続きです。 サービスダウン検知 MSPに運用を手伝ってもらっていればサービスダウンが発生した場合でも電話で障害連絡してくれたり一次対応をやってくれたりするのですが、今回はスモールスタートでの運用ということもありMSPを使うことを勘定…

メール以外の方法でもアラートの通知を行う(1)

前に書いた記事がデプロイの話で、WEBサイト環境構築というよりかは運用的な記事でした。今回はさらに脱線してアラートの通知について書きます。 デプロイの設定作業の時に色々参考記事を漁ってたのですが、デプロイ開始、終了を音声で通知したりJenkinsのビ…

Capistrano(3.x)でデプロイする

AWS内のステージング環境をセットアップしているとアプリが動くところを早く確認したくなり、過去の案件で使われてたCapistranoの設定を流用してさっさとデプロイしようとしたところ、最近はバージョンが3らしく、書き方も大きく変わっているようです。 Capi…

appサーバ(Rails)周りの準備

appサーバ(Rails)周りの準備 アプリそのものはプログラマーさんが制作していて、私のほうでは作ったアプリをサーバ上で動かす環境とデプロイ周りを担当します。 以前にもRails環境のサーバをいくつか構築したことがあり、過去を思い出してみると、 Lighttpd+…

nginxでのプロキシ

nginxに来たアクセスをインターナルなELBにフォワードしてappサーバ群に振り分けてもらいます。 インターネット | nginx | ELB | appサーバ群 nginxのプロキシ先にELBを指定している場合このような問題がおきますので、参考記事のように設定しておきます。 h…

アクセスログのフォーマットをltsv形式にする

nginxが出力するアクセスログをfluentdで取り込み、それをElasticSearchやMongoDBに集約する予定なので、取り込みやすいようにログフォーマットをltsv形式にします。 必要そうな項目を一通り羅列しました。 upstream_statusはappsサーバからのステータスコー…

メンテ中の場合、nginxでメンテ画面を返す。

メンテ中のメンテ画面 Capistranoでのメンテナンス切り替えはmaintenance.htmlファイルを配置するかどうかというものなので、nginx側で下記のように設定してメンテ画面を表示するのが一般的かと思います。 こういう感じ if (-f $document_root/system/mainte…

nginxで同一ユーザからの過度なアクセスを制限する。

連打対策してるのをユーザにわかってもらえる程度の制限 今回運用するWEBサイトではユーザがほぼ同タイミングでPOSTのボタンを数回連打したり、もしくはツールなどを使って一定期間同じリクエストを延々と飛ばしてきたりする可能性が普通にあるらしく、ある…

内部用の名前解決DNSを用意する

物理サーバでインフラ環境を作っていた時は、サーバに固定IPをつけたりネットワークアドレスも「10.1.1.0/24がAPPSセグメントで10.1.2.0/24がDBセグメントで・・・」と設計することがほとんどでした。 EC2を試した時はデフォルトでDHCPな環境だったので、AWS…

リバースプロキシ用のnginxをインストールする

WEBサーバ(web)とアプリケーションサーバ(apps)をリバースプロキシ構成にします。WEBサーバは今回nginxを採用します。 WEBサイトの構築運用にあたってWEBサーバ側で行いたい要件が以下のようにあり、nginxに設定していきます。 nginxがどれくらい負荷に強い…