nginxでリバースプロキシを立てる

さて、先の記事Let’s Encryptから取得したSSL証明書ですが、使わないと意味がありません。今回はnginxをHTTPSリバースプロキシとしてセットアップしてみます。

まず今回は既存のポートは生かしたまま、8280番ポートにGitBucket, 8281番ポートにJenkins, 8282番ポートにRocket.Chatを、それぞれ割り当てたいと思います。

例によってdocker-compose.ymlです。

version: '2'

services:
  # リポジトリ
  gitbucket:
    image: takezoe/gitbucket
    container_name: gitbucket
    volumes:
      - ./gitbucket/data:/gitbucket
    environment:
      - TZ=JST-9
    ports:
      - 8080:8080
      - 29418:29418

  # CIサーバ
  jenkins:
    image: jenkins:alpine
    container_name: jenkins
    volumes:
      - ./jenkins/home:/var/jenkins_home
      - ./jenkins/executors.groovy:/usr/share/jenkins/ref/init.groovy.d/executors.groovy
    environment:
      - JAVA_OPTS=-Duser.timezone=Asia/Tokyo
    ports:
      - 8081:8080
      - 50000:50000

  # Rocket.Chatデータ
  db:
    image: mongo:3.0
    container_name: db
    volumes:
      - ./db/data:/data/db
    command: --smallfiles

  # Rocket.Chat本体
  rocket.chat:
    image: rocket.chat:latest
    container_name: rocket.chat
    environment:
      - ROOT_URL=http://localhost:8082
    links:
      - db
    ports:
      - 8082:3000

  # リバースプロキシ
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - gitbucket
      - jenkins
      - rocket.chat
    ports:
      # HTTPS
      - 8280:8280
      - 8281:8281
      - 8282:8282

既存の設定には手を入れず、末尾のnginxの設定のみを追加してあります。/etc/letsencryptに前回取得したSSL証明書がありますので、これをそのままボリュームとしてマウントします。その他、設定ファイルをいくつか上書きします。

まずはnginxの設定 nginx.conf です。通常、worker_processにはサーバのCPU数を指定します。

# nginx.conf
user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

次の各サービスに対するプロキシの設定を、conf.dディレクトリ以下に gitbucket.conf, jenkins.conf, rocketchat.conf として作成します。内容はほぼ同一で、listenするポート番号とproxy_passぐらいしか違いがないので、ここではgitbucket.confのみを例として挙げておきます。

# gitbucket.conf
server {
    # HTTPS
    listen 8280 ssl;
    listen [::]:8280 ssl;
    server_name ドメイン;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ドメイン/privkey.pem;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";

    location / {
        proxy_pass http://gitbucket:8080;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

proxy_passの値として、jenkins.confでは http://jenkins:8080, rocketchat.confでは http://rocket.chat:3000 をそれぞれ指定します。

また、共通的な部分は reverse_proxy.conf としてくくり出しておきます。

# reverse_proxy.conf
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

ここまで設定が済んだらdocker-compose upでコンテナを起動します。

それではまずGitBucketから見て行きましょう。ブラウザで https://ドメイン:8280/にアクセスし、ログイン前の画面が表示されればOKです。いつも通りログインし、右上のプルダウンから “System administration” を開き、”System settings” のBase URLを https://ドメイン名:8280 に変更して “Apply Changes” で保存します。

次にJenkinsです。ブラウザでhttps://ドメイン:8281/にアクセスします。こちらも同様にログイン画面が開きますのでログインします。「Jenkinsの管理」から「システムの設定」を開き、Jenkins URLを https://ドメイン:8281/ に、末尾のBuild Server URLも https://ドメイン:8281/ にそれぞれ変更して保存します。

続いてジョブの一覧から作成済みのジョブを選択し、「設定」を開いてGitBucketのURL欄を https://ドメイン:8280/〜 に変更します。

最後にRocket.Chatです。https://ドメイン:8282/にアクセスしてログインします。そうするとWarningダイアログが表示されてURLを変更するか確認してきますので「はい」を選択します。

これで、HTTPSで各サービスにアクセスできるようになりました。

2017/02/24追記: 変更を保存し忘れたりすると、サイトにアクセスできなくなります。というかなりました。私の場合、./gitbucket/data/gitbucket.confの base_url の値を直接編集して事無きを得ました。危ない危ない。