53ningen.com

@gomi_ningen's Website

GNU-Coreutils touch コマンドの実装を読む

<p> 基本的に <code>utime(2)</code> を使えば良さそうなので、実装が楽そうだし、自分で書いて見つつ、GNU-Coreutils の実装を眺めてみるかなという気持ちになったので挑戦。<code>utime(2)</code> は次のようなインターフェースを持っている。</p>
#include <sys/types.h>
#include <utime.h>

int utime(const char *path, struct utimbuf *buf);

struct utimbuf {
    time_t actime;
    time_t modtime;
}
<h3>基本的な実装</h3> <p>単純に actime と modtime を更新してやればよいので、次のように書けば良さそう</p>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
#include <utime.h>

int main(int...
Read More

tree コマンドを実装する

 個人的に抜けている知識の穴を探したり、見つかった穴を塞ぐ目的で、最近「ふつうの Linux プログラミング」という本を読んでいます。C 言語をガリガリ書くみたいなことを普段はそれほどやらないので、結構知らないことがあったり、誤解している部分がポロポロと見つかって非常に良いので、みなさん是非読んでみてください。これと並列に「Go ならわかるシステムプログラミング」も読みながらコードを書いています。

 さて、そんな本の中盤で ls コマンドの実装をする局面がありました。この実装自体はわりと単純で、ディレクトリを opendir(3) で開き、readdir(3) で読んでいくというもの。man によると返される dirent 構造体は次のようなものであるそうだ。

struct dirent { /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */
        ino_t      d_ino;                /* file number ...
Read More

telnet コマンドをワン切りする

ワン切りという言葉が死後になりつつある気がしないでもないですが、telnet で繋いですぐ切りたいときに次のようにすればよさげ。

% (sleep 0.2 && echo 'quite') | telnet 53ningen.com 80
Trying 160.16.144.83...
Connected to 53ningen.com.
Escape character is '^]'.
Connection closed by foreign host.

とここまで書いたときに冷静に考えて nc コマンド使えば良いだけだったということを思い出した

% nc -vz 53ningen.com 80
Connection to 53ningen.com port 80 [tcp/http] succeeded!

けど、CentOS 7 の nc コマンド、ncat へのエイリアスになってて、z オプションが存在しなくなってしまっている...。[同じことにくるしんでいる記事](https://qiita.com/lumbermill/items/2...

Read More

27円/月で運用できるAWS Lambda を用いたウェブサイトの外形監視

ウェブサイトの外形監視とは?

ウェブサイトがユーザーからきちんと閲覧できるかどうかを監視するという至極単純なものが「ウェブサイトの外形監視」です。外形というワードが入っているとおり、ユーザー側から名前解決を正常に行うことができ、宛先にきちんとリクエストを行え、妥当な時間内に正常なレスポンスを受け取ることができるかをチェックすることが目的になると思います。

したがって、構築されたサーバーとはネットワーク的にも物理的にも独立した場所から監視を行えると良いのですが、そうすると外形監視サーバーのお守りをしなければならず、個人でちゃんとやろうとすると微妙に面倒ではあります。

AWS Lambda を用いたウェブサイトの外形監視

AWS Lambda は、オンデマンドでコードの断片を実行することができるアプリケーション基盤です。あらかじめサーバーを立てて置かなくても、実行したいコードを配置しておき、実行したいときにサーバーのことなど何も考えずに呼び出すことができます。ウェブサイトの外形監視は、せいぜいリクエストを送ってステータスコードやレスポンスタイムなどを見てあげるだ...

Read More

gdb を使ったデバッグ

<ul> <li>「<a href="http://amzn.to/2CQhKu1">ふつうの Linux プログラミング</a>」というほんでバグがある C のコード <code>bug_head.c</code> のデバッグ作業をするときに <code>gdb</code> というツールが紹介されていた</li> <li>デバッグ時に <code>gdb</code> が役に立つので、ひとまずその流れを以下でみてみる</li> </ul> <h3>基本的なデバッグの流れ</h3> <p>流れを見た方がわかりやすいのでまず実例からみていく</p>
# コンパイルは -g オプションをつける
$ gcc ./src/bug_head.c -g -o ./bin/bug_head

# gdb をかましてデバッグ対象バイナリを実行する
$ gdb ./bin/bug_head
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 Free Software Foundation, Inc...
Read More

strace コマンドで遊ぶ

「ふつうの Linux プログラミング」という本をラビットハウス社で輪読しているが、その中で strace コマンドというものが出てきた。

man STRACE(1)

man によると strace とはシステムコールとシグナルをトレースできるツールのようだ

  • NAME: strace - trace system calls and signals
  • SYNOPSIS: strace [-CdffhiqrtttTvVxxy] [-In] [-bexecve] [-eexpr]... [-acolumn] [-ofile] [-sstrsize] [-Ppath]... -ppid... / [-D] [-Evar[=val]]... [-uusername] command [args]
  • In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called ...
Read More

logrotate のログ保持日数の変更

例えば以下のような fluentd ログの logrotate 設定が入っているとします。

/var/log/td-agent/td-agent.log {
  daily
  rotate 8
  compress
  delaycompress
  notifempty
  create 640 td-agent td-agent
  sharedscripts
  postrotate
    pid=/var/run/td-agent/td-agent.pid
    if [ -s "$pid" ]
    then
      kill -USR1 "$(cat $pid)"
    fi
  endscript
}

この前提のもと、保持する世代を減らすために rotate の設定を 8 から 5 に減らす場合には注意が必要で、6世代目ファイルのみが削除され、6-8世代のファイルが残ってしまいます。簡単に次のようなコマンドで消しておくとよいかも。保持期間を増やすときはあまり問題は生じなそう?

$ ls /var/log/td-agent/ ...
Read More

ELB + EC2 + RDS でふつうのアプリケーションを構成する

  • VPC とサブネットを切り、その上に ELB, EC2, RDS を配置する、いたって普通のアプリケーションを構成する手順を自分向けにまとめておく
  • だいたいざっくりとはわかってるけどたまにやるとアレっとなったりする

構成するものの全体像

  • public subnet に ELB、private subnet に EC2, RDS を配置する
  • EC2, RDS ともに Multi AZ 配置として、耐障害性、可用性を高める

VPC の構成

  • 10.1.0.0/16 を AWS 用のアドレス帯として確保していると仮定して VPC を用意する
    • DNS ホスト名を有効する #
  • サブネットはひとまず以下のように切る
    • あくまでざっくりと流れを説明するために適当に切ってるので、用途に合わせ適当にサイズを変える

| role | subnet | AZ | Vi...

Read More

Amazon WorkDocs とは

情報ソース: Amazon WorkDocs ドキュメント

  • フルマネージドなエンタープライズ向けストレージおよびファイル共有サービス
  • Amazon WorkSpace のユーザーは追加料金なしで WorkDocs へのアクセス権限が付与される

課金体系の概要

情報ソース: Amazon WorkDocs 料金

ざっくりといえば、アクティブなユーザーアカウントとストレージの料金が課金対象

  • Amazon WorkDocs ユーザー/月: 5〜8 USD
    • Workspace のユーザーは最初の 50 GBまで料金に含まれる
    • そうでないユーザーは最初の 1TB まで月 2〜3 USD
    • それ以降の料金に関しては S3 の料金に従う [#](https://aws.amazon.com/jp/s3/pricing/#Storage_Prici...
Read More

Apach と nginx への HSTS 設定

HSTS(HTTP Strict Transport Security)とは?

  • SSL に対応しているウェブサーバーへの HTTP リクエストに対し、サーバー側がレスポンスヘッダに SSL 通信が可能であることを表すデータを付与することにより、ブラウザに HTTPS での通信を行うことを促す仕組みを HSTS とよぶ
    • RFC6797 で定義される: https://tools.ietf.org/html/rfc6797
    • preload と併用すると 301 でリダイレクト先を指定する際、そのリダイレクト先が改ざんされていないことを保証できない欠点を補える

技術的な仕組み

  1. ユーザーが HTTP リクエストを対象サーバーに送る
  2. サーバーは https エンドポイントへ 301 リダイレクトレスポンスを返す
  3. https エンドポイントはレスポンスヘッダに 以下を付与しブラウザに HTTPS で通信を行うことを促す
  • `Strict-Transport-Security "max-age=31536000; includeSubD...
Read More

特定ホストに対してのみ踏み台を経由して Ansible を実行する

ネットワーク的に踏み台サーバーを経由しないと到達できないサーバーに Ansible を流す

公式ドキュメントに書かれている方法はすべてのサーバーでの作業時に踏み台を踏むような形になるが、外から疎通できない一部のホストだけ踏み台を踏むようにしたい場合は、host_vars に対象ホスト名と同じ名前でファイルを作って、以下のように設定を入れればよい。

---

ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@host"'

...

Read More

さくらVPSのスイッチを利用してローカルネットワークを構成する

さくら VPS のスイッチを用いて L2 接続をして、次のような構成を作る手順メモ。書いておいてアレですが、実際にやるときは公式のドキュメントを読んでください。

<img src="https://static.53ningen.com/wp-content/uploads/2018/01/21013455/sakura_vps_napt-e1537461295666.png" alt="" width="423" height="469" class="aligncenter size-full wp-image-1206" />

1. さくら VPS ...

Read More

53ningen.com 大改修

学生時代に適当に構築してツギハギだらけになっていた 53ningen.com が動いているサーバー gomi-old01 を良き形にしつつ gomi-web01 に移転した作業ログです。基本的にただ Wordpress が動いていたサーバーを Ansible 化して、お引越ししたというだけの内容ではあります。やったことは具体的にはつぎのようなものです。

  1. DNS サーバーの Route 53 移行
  2. ドメインの Route 53 移管
  3. 稼働しているサーバーの Ansible 化
  4. データベースの引越し
  5. Wordpress アプリケーションの引越し
  6. 新サーバーへ DNS 切り替え

また次のものは新規で導入しました

  • L7 レイヤーでのヘルスチェック導入

  • 障害発生時に DNS フェイルオーバーでエラー画面を表示

  • サーバーログの S3 への送出

  • elasticsearch, kibana

  • zabbix による監視, Slack 通知

1. DNS サーバーの Route 53 移行

ドメインも Route 53 に移管しますが、...

Read More

Copyright © 53ningen.com