dockerで管理していたLet's encryptの証明書(TLS-SNI-01)を最新に更新した

3/15に証明書の期限が切れるということで、dockerのことはよくわからない状態からスタート

利用していたのは

  • jwilder/nginx-proxy
  • jrcs/letsencrypt-nginx-proxy-companion

調べればよく出てくる構成。この下にSSLを使うドメインがぶら下がっている

 

現状の把握

  • docker ps -a 起動しているdockerの一覧の取得

  • docker network ls docker networkの取得
  • docker-compose ps docker-composeで起動している一覧

詳細を見たいなら

  • docker inspect name コンテナの詳細
  • docker network inspect name networkの詳細

色々調べていくと「jwilder/nginx-proxy」「jrcs/letsencrypt-nginx-proxy-companion」の組み合わせは「nginxproxy_default」networkをデフォルトで使うと理解

 

docker-compose.yml を見つけて内容を確認

version: '2'
services:
  nginx-proxy:
  image: jwilder/nginx-proxy
  container_name: nginx-proxy
    ports:
    - 80:80
    - 443:443
    volumes:
    - ./certs:/etc/nginx/certs:ro
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro
   restart: always

letsencrypt-nginx-proxy-companion:
   image: jrcs/letsencrypt-nginx-proxy-companion
   container_name: nginx-letsencrypt
   volumes:
   - ./certs:/etc/nginx/certs
   - /var/run/docker.sock:/var/run/docker.sock:ro
   volumes_from:
   - nginx-proxy
   restart: always

 

nginx-letsencryptのコンテナの中に入ってみる

docker exec -it nginx-letsencrypt bash

中を探しても、certbotはない、どうやらコンテナを新しくする必要がありそうと気付き

github.com起動した後からの履歴を見てみると、TLS-SNI-01の対応したのは1.10付近と推測(HTTP-01)

1.9 released this Aug 12, 2018
1.9.1 released this Sep 30
1.10 released this Jan 8, 2019

とりあえず、先にダウンロードしておいて問題ないから

docker pull jrcs/letsencrypt-nginx-proxy-companion

docker pull jwilder/nginx-proxy

最新を取得する

 

jrcs/letsencrypt-nginx-proxy-companionに気になることが書いてあったのでDNS CAAをあらかじめ設定しておく

「Your DNS provider must answers correctly to CAA record requests.」

blog.apar.jp

後は覚悟を決めて

docke-compose.ymlのあるディレクトリに移動

cd /path/to/dir

docker-composeで起動しているサービスを停止

docker-compose stop
Stopping nginx-letsencrypt ... done
Stopping nginx-proxy ... done

docke-compose 起動

docker-compose up -d
Recreating nginx-proxy ...
Recreating nginx-proxy ... done
Recreating nginx-letsencrypt ...
Recreating nginx-letsencrypt ... done

 無事起動。ぶら下がっているサイトにアクセスも可。証明書の期限は伸びていない!?

 

docker ps -aするとnginx-letsencryptが延々とrestartingと出ている

コンテナにログインしようとしても

docker exec -it nginx-letsencrypt bash

Error response from daemon: Container 6bd1ea10cb646c4236c28086ce4e807d7850f693fdbb6946874b53b6ed16bc0f is restarting, wait until the container is running

 

codenote.net

コマンドで確認

docker logs contena_id

2019/03/08 14:13:36, Error: can't get my container ID !
Error: can't get nginx-proxy container ID !
Check that you are doing one of the following :
- Use the --volumes-from option to mount volumes from the nginx-proxy container.
- Set the NGINX_PROXY_CONTAINER env var on the letsencrypt-companion container to the name of the nginx-proxy container.
- Label the nginx-proxy container to use with 'com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy'.

こんな感じで延々とでていたので、NGINX_PROXY_CONTAINERとは?と思いググると答えが

aroundthedistance.hatenadiary.jpdocker-compose.yml

docker-compose.yml
environment:
NGINX_PROXY_CONTAINER: rg-proxy

 なるほどと思い docker-compose.ymlを下記のように変更

version: '2'
services:
  nginx-proxy:
  image: jwilder/nginx-proxy
  container_name: nginx-proxy
    ports:
    - 80:80
    - 443:443
    volumes:
    - ./certs:/etc/nginx/certs:ro
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro
   restart: always

letsencrypt-nginx-proxy-companion:
   image: jrcs/letsencrypt-nginx-proxy-companion
   container_name: nginx-letsencrypt
   volumes:
   - ./certs:/etc/nginx/certs
   - /var/run/docker.sock:/var/run/docker.sock:ro
   volumes_from:
   - nginx-proxy

   environment:
     NGINX_PROXY_CONTAINER: nginx-proxy
   restart: always

docker-compose stop

docker-compose up -d

を実行

docker下のサイトにアクセスして証明書の期限が伸びているのを確認

 

理解するのに参考になったのが

tech.quartetcom.co.jp

morizyun.github.io

 

docs.docker.jp

nagiosとslackの連動設定 携帯メールの余分なデータを削除

利用する物 slack webhook URL https://api.slack.com/incoming-webhooks

nagios の commands.cfg への記述

define command {
     command_name notify-service-by-slack
     command_line $USER1$/slack_service_notify.sh "$NOTIFICATIONTYPE$" "$HOSTNAME$" "$HOSTADDRESS$" "$SERVICEDESC$" "$SERVICESTATE$" "$SERVICEOUTPUT$" "$LONGDATETIME$"
}

define command {
     command_name notify-host-by-slack
     command_line $USER1$/slack_host_notify.sh "$NOTIFICATIONTYPE$" "$HOSTNAME$" "$HOSTADDRESS$" "$HOSTSTATE$" "$HOSTOUTPUT$" "$LONGDATETIME$"
}

---

contacts.cfg に上記の追加 (notify-host-by-slack,notify-service-by-slak)
host_notification_commands notify-host-by-epager,notify-host-by-slack
service_notification_commands notify-service-by-epager,notify-service-by-slack

---

プログラム URL /usr/lib64/nagios/plugins/ に設置

https://github.com/obaarne/Nagios2Slack/blob/master/slack_host_notify.sh
https://github.com/obaarne/Nagios2Slack/blob/master/slack_service_notify.sh

vi等で開いて

SLACK_URL=

を自分のwebhook アドレスに変更して保存

 

動作確認:

slack_host_notify.sh

slack_service_notify.sh

を実行して該当チャンネルに書き込まれると成功

 

参考:

github.com 

exchange.nagios.org

 

携帯メール(notify-*-by-epager)で余分なデータを削除

notify-host-by-epager ホスト関連の通知

 define command{
     command_name notify-host-by-epager
     command_line /usr/bin/printf "%b" "Host '$HOSTALIAS$' is $HOSTSTATE$\nInfo: $HOSTOUTPUT$\nTime: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$ alert - Host $HOSTNAME$ is $HOSTSTATE$" $CONTACTPAGER$
}

これを

define command{
     command_name notify-host-by-epager
     command_line /usr/bin/printf "%b" "'$HOSTALIAS$' is $HOSTSTATE$\n$HOSTOUTPUT$\n$LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$ alert - Host $HOSTNAME$ is $HOSTSTATE$" $CONTACTPAGER$
}

削るデータは

Host

Time:

 

notify-service-by-epager サービス関連の通知

define command{
     command_name notify-service-by-epager
     command_line /usr/bin/printf "%b" "Service: $SERVICEDESC$\nHost: $HOSTNAME$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\nInfo: $SERVICEOUTPUT$\nDate: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" $CONTACTPAGER$
}

これを

define command{
     command_name notify-service-by-epager
     command_line /usr/bin/printf "%b" "$SERVICEDESC$\n$HOSTNAME$\n$HOSTADDRESS$\n$SERVICESTATE$\n$SERVICEOUTPUT$\n$LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" $CONTACTPAGER$
}

削るデータは先頭の

Service:

Host:

Address:

Info:

Date:

 

以上

eAccelerator と monit

monit web管理画面はdelayしたぶんだけ502返すからmonit -vIでCUIで動作確認するしかない。設定が起動時にdisableになったりとか高負荷だとはまるところおおい

monitでapacheが1900M使ったらstop&startする設定

check process apache with pidfile /usr/local/apache2/logs/httpd.pid
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if totalmem > 1900 Mb for 3 cycles then restart

stop&startするとeAcceleratorの共有メモリ(コンパイル済みPHP)は破棄される


eAcceleratorのcontrol.phpを見ていて気付いたのだけど
eAcceleratorの共有メモリは MaxRequestsPerChild の数が来てもクリアされない
apacheのプロセスがでかくなるような環境では早めに殺してしまうほうがよい
MaxRequestsPerChild 100とか

結論:monitいらないかも?

Amazon Product APIでかえってきたデータを整形する

文字コードはutf8 tr($zen, $han)の中はEUC出ないとダメ(ハマッタ)

use Jcode;
use Encode;

my $zen = '0-9 ()';
my $han = '0-9 ';
Encode::from_to($zen, 'utf-8','euc-jp');
Encode::from_to($han, 'utf-8','euc-jp');

my $title= "デッドマン・ワンダーランド (10)";
$title = jcode($title)->tr($zen, $han, 'd')->utf8;
print "TITLE:$title\n";

デッドマン・ワンダーランド 10

hosts.allowでIP弾く

ruからqpopperにアクセスきまくりでpopperが死ぬので下記のように記述
/etc/inetd/restart

ALL: 92.241.168.106 : deny

確認は tcpdmatch で

# /usr/sbin/tcpdmatch in.qpopper 92.241.168.106
client: address 92.241.168.106
server: process in.qpopper
matched: /etc/hosts.allow line 19
option: deny
access: denied

child pid ????? exit signal File size limit exceeded (25)

[Mon Oct 19 04:02:05 2009] [notice] child pid 16503 exit signal File size limit exceeded (25)
[Mon Oct 19 04:02:05 2009] [notice] child pid 16507 exit signal File size limit exceeded (25)
[Mon Oct 19 04:02:05 2009] [notice] child pid 16509 exit signal File size limit exceeded (25)

こんなわかりやすいエラーがずっと出ていた。(ログ2G超えたらアクセス不能)
そのときのmuninの
apache_accesses_day
apache_volume-day
netstat-day
のグラフ


netstatでは接続がきてるのに接続できてない様子がよくわかる

対策方法は画像をログに取らないで回避(httpd.conf)

SetEnvIf Request_URI "\.(png)|(jpg)|(gif)$" no-log
CustomLog /home/www/logs/access_log combined env=!no-log

SetEnvIf入っててよかった

check_rbl覚書

https://trac.id.ethz.ch/projects/nagios_plugins/wiki/check_rbl


管理サーバーのIPをcheck_rblで監視していたら11時くらいから bl.spamcop.net に登録されたらしく通知が来始める。13時より打ち合わせなのでとりあえず「Acknowledge this service problem」を発行して放置


spamcop 解除とかで調べると
登録して24時間以内に本登録がなければ自働解除されるようなので、そのまま放置することに
本日11時、nagiosの通知が来て24時間後に解除されたようでRecoveryメールが来て一見落着