毎日書く

のを目標に頑張るか

2017年5月31日

生活リズム

なんとか9時台に起きることができたので、今週の崩れに崩れた生活リズムは解消できたのではないかと思う。

DNS

地元の友達が、「インターネット遅い、日本死ね」みたいなこと言いながら、DNSエラーっぽい画面のキャプチャをツイートしてて、暇だったから絡んでた。

話を聞いてみると、自室の無線LANの強度が低く中継器を使っているが、やはり遅い、いつもキャプチャした画面のようになってしまうとのこと。

ルータの設定とかいろいろ話して試行錯誤してたけど、DNSエラーなら別にGoogleのPublicDNS使えばええやんみたいな話で、そういう感じにまとまった。

(docker-composeを使って)ローカルで動作しているアプリにSSLでアクセスしてみる

ローカルで動作しているアプリに対してSSLでアクセスしたい、が、わざわざローカルにNginxを建てたくはない。

そこでDockerなわけで、Dockerfileを書いて奇々怪々なdocker runとかしたくないのでサクッと書いてサクッと建つdocker-composeでやっていく。

課題としては以下のような感じ。

  • Dockerコンテナ内からホストマシンにポートフォワードするためにホストマシンのIPアドレスを知る必要がある
  • アプリによってはポート番号が違う場合があり良しなにしたい

ローカルで完結するからにはオレオレ証明書で、その辺はサクッと作ってもらって以下のようなdocker-compose.ymlを書く。

version: '3'
services:
  nginx:
    image: nginx:alpine
    # 1
    command: >
      /bin/sh -c
      "envsubst '
      $$NGINX_UPSTREAM_HOST
      ' < /tmp/nginx.conf.template
      > /etc/nginx/nginx.conf
      && nginx -g 'daemon off;'"
    volumes:
      - ./certs/server.crt:/etc/nginx/certs/server.crt
      - ./certs/server.key:/etc/nginx/certs/server.key
      - ./nginx.conf.template:/tmp/nginx.conf.template
    ports:
      - 8443:443
      - 8080:80
    # 2
    env_file: ./.env

#1 については、nginx:alpineのDockerイメージのCMDを書き換えている部分。こうすることによって、起動段階で毎回envsubstが走るようになり、環境変数によって自由にnginx.confが書き換えられる。

参考:

qiita.com

#2 について、#1envsubstで書き換える変数の設定。例:

NGINX_UPSTREAM_HOST=10.10.10.1:3000

どこから10.10.10.1なんて出てきたの、ということになっているけれど、これは課題にもあるように、Dockerコンテナ内からホストマシンにポートフォワードするためのホストマシンのIPで、別に10.10.10.1じゃなくてもいい。

qiita.com

ループバックアドレスエイリアスを設定することで、Dockerコンテナ内からもこのエイリアスにアクセスできるようになる。

実際に10.10.10.1エイリアスに設定するために打つコマンドは以下の通り:

$ sudo ifconfig lo0 alias 10.10.10.1/24

ところで、docker-compose.ymlservices.nginx.volumesで設定さている ./nginx.conf.template は以下の通り:

worker_processes  1;

events {
  worker_connections  256;
}

http {
  server {
    listen 80;
    access_log /proc/self/fd/1;
    error_log /proc/self/fd/2;
    location / {
      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-Host $host;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_pass              http://${NGINX_UPSTREAM_HOST};
      proxy_redirect          off;
    }
  }

  server {
    listen 443  default_server;
    server_name localhost;
    access_log /proc/self/fd/1;
    error_log /proc/self/fd/2;
    ssl_certificate     /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;
    ssl on;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";

    location / {
      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-Host $host;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_pass              http://${NGINX_UPSTREAM_HOST};
      proxy_redirect          http:// https://;
    }
  }
}

他の ./certs以下の証明書関連は適宜発行するとして、この状態で起動する。

$ docker-compose up nginx

おもむろに、Railsアプリを起動させる場合は以下のように起動する。

$ bundle exec rails s -b 10.10.10.1 -p 3000

それで、https://localhost:8443/にアクセスすると以下のようになる。

f:id:toihrk:20170531192648p:plain

オレオレ証明書だから保護はされないらしい。

課題に対してのアンサーは

Dockerコンテナ内からホストマシンにポートフォワードするためにホストマシンのIPアドレスを知る必要がある

ホストマシンのループバックアドレスエイリアスを指定してやる。

アプリによってはポート番号が違う場合があり良しなにしたい

Nginxの起動時にnginx.confを良しなに書き換えれば良い。