著者アーカイブ takahashi

takahashi 著者:takahashi

Certbotで証明書の更新後に自動で特定の処理をさせる方法

無料でSSL証明書を発行してもらえるサービスであるLet’s Encryptですが、同時に更新とSSL証明書の設定の自動化を行うCertbotという仕組みを提供しているのも特徴です。

このCertbotですが、いくつかプラグインがあり、ワイルドカード(任意のサブドメインに適用できる)SSL証明書を取得しない場合、メインで使用しているWebサーバー向けのCertbotプラグインを使用すると、自分の方で細工しなくても、Webサーバーを停止することなく自動で取得時の認証や証明書の適用を行ってくれます。

ただ、ワイルドカード証明書の場合はDNS-01という、ドメインを登録しているDNSサーバーを使用した認証方法に限定されてしまうため、上記のようなWebサーバー向けのプラグインを使用することができません。

この場合、ワイルドカード証明書を取得時、もしくは更新時にSSL証明書のインストールや差し替えは行われますが、Webサーバーへの自動適用は行われません。

この状態のままだと、せっかくSSL証明書を自動で更新できても、自動でWebサーバーに読み込まれないため、”いつの間にか期限切れになってた…”なんて状況が発生してしまうことになります。

そこで、僕の場合はSSL更新時に合わせてWebサーバーを自動的に再起動できるように、スクリプトを次のようにしていました。

/usr/bin/certbot renew --force-renew >> /var/log/letsencrypt/ssl-renew.log 2>&1 && service webサーバーのサービス名 restart >> /var/log/letsencrypt/ssl-renew.log 2>&1

ただこの方法では、まれにSSL更新とWebサーバーの再起動のタイミングが悪く、Webサーバーの再起動が失敗してしまうことがありました。

SSL更新からWebサーバー再起動の間で数秒間マージンを置くことで一応はちゃんと動作するようになったのですが、あくまで固定した秒数待つだけで、SSLの更新状態のチェックなどは行っていないため、必ずしも対策できているとはいいがたい状況でした。

さてどうやればうまくできるかなーと考えていたところ、実はCertbot自体に、処理完了後に特定のコマンドを実行させることができる機能があることを知りました。

例えば、証明書取得時のコマンドに

sudo certbot certonly --manual \
-d example.com -d *.example.com -d ...  \
-m mail@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory

のようにするかと思いますが、このコマンドに

--post-hook="実行したいコマンド"

のようなオプションを付加することで、SSL取得処理終了後に指定したコマンドを実行してくれます。

例えば、証明書取得終了後にnginxを再起動させたい場合は

sudo certbot certonly --manual \
-d example.com -d *.example.com -d ...  \
-m mail@example.com \
--agree-tos \
--manual-public-ip-logging-ok \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory
--post-hook="service nginx restart"

のようにすると、SSL取得処理が終了した時点でnginxを再起動させることができます。

取得時に指定したオプションはcertbotの設定ファイルに記録されるため、2回目以降の更新時では

sudo certbot renew

とするだけでpost-hookも含めて処理してくれるようになります。

なお、このpost-hookはssl証明書の処理が完了したら、失敗・成功にかかわらず実行する、という指定になってますが、処理前に実行させたり、証明書更新が行われた後のみ実行、といった指定も可能となっているようです。

Let’s EncryptのSSL証明書更新時にサービスを再起動する – Qiita

このあたりの設定をうまく使えば、運用がより楽になりそうですね。

takahashi 著者:takahashi

LinuxでCPUやマザーボードから温度を取得する方法

Linuxでは標準で(マシンのマザーボードやCPUなどが対応していれば)簡単に温度センサーの値にアクセスできる仕組みがあるようです。

cat /sys/class/thermal/thermal_zone数字/temp

などとすると、マザーボード上に存在する何かしらの温度センサーの値を拾うことができるようです。

ただし、センサーの値が読み取れるファイルの位置やディレクトリ構造などはマシンによって異なるため、じぶんでそれっぽい場所を探す必要があります。

$ cat /sys/class/thermal/thermal_zone0/temp
27800

上記の例の場合は、27800と出ていますが、これは27.800℃を表しているようです。

自分の環境の場合は

$ cat /sys/class/thermal/thermal_zone0/temp
27800
$ cat /sys/class/thermal/thermal_zone1/temp
29800
$ cat /sys/class/thermal/thermal_zone2/temp
44000

といった形で3か所のセンサーの値を読み取ることができました。

ただ、どの値がどの部分の温度なのかはマニュアル等を見ないと知ることができないのが難点です。

CPUの温度を知る方法もありました。

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_label 
Package id 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input 
44000

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_label 
Core 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input 
42000

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_label 
Core 1
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input 
43000

こちらはlabelも用意されていたため、どの温度なのかわかりやすかったです。

なお、どのセンサーが存在しているのか、どの温度がどの部分のものなのかを正確に知りたい場合はLinux向けの温度チェックツールを使うとわかりやすそうです。

lm_sensors – Arch Linux

参考サイト:

LinuxでCPUの温度を取得する – Qiita

LinuxでCPUの温度やファンの回転数を取得する – パソコン鳥のブログ

takahashi 著者:takahashi

CentOS 7 のApache 2.4でmpmを切り替える方法

Apacheには、mpmと呼ばれる動作モードがあります。

最近のApacheでは、デフォルトで”prefork”が指定されているかと思います。

このモードでは、1アクセスごとに1つのApacheプロセスを立ち上げ、ブラウザからサイトへの要求にこたえます。

この方式では、アクセスが増えれば増えるほどApacheのプロセスが増えていくため、大量のアクセスが来るとOSの負荷が増えてしまい、サーバー全体の動作が重くなってしまいます。

一方、MPM動作モードには workerとeventとよばれるものもあります。

これらのモードを使用すると、使用されるプロセス数を節約することができるため、サーバー全体への負荷を少なくすることができます。

ただし、ノンスレッドセーフなモジュールを使用している場合などはそのモジュールは使用できなくなるとのことで、注意が必要です。

さて、このMPMの切り替えですが、OSによっては設定ファイルが分散化されていることがあります。

CentOS 7 の場合は

/etc/httpd/conf.modules.d/00-mpm.conf

にMPMの切り替えが行える記述があるので、ここを変更します。

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so


内容としては非常に親切で、コメントアウトの付け替え後、Apacheを再起動するだけでMPMの切り替えを行うことができます。

上記の例では、6行目のmpm_prefork(Preforkモード)が有効になっています。

例えば、もしworkerモードを有効にしたい場合は、12行目の

#LoadModule mpm_worker_module modules/mod_mpm_worker.so

の先頭のコメントアウト(#)を外し、先程の6行目の

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

の先頭に#をつければOKです。

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so


この状態で

sudo apachectl configtest #設定が間違っていないかチェック
sudo systemctl restart httpd #Apache再起動

とすればMPMを切り替えることができます。

・変更前

$ sudo apachectl -V
...
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
...

・変更後

$ sudo apachectl -V
...
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
...

Server MPMの部分が切り替わっていることが確認できるかと思います。

素のApacheの場合は元の設定ファイルであるhttpd.confに統合されていたりするので、あらかじめわかりやすく別ファイルに準備されているのはありがたいですね。

takahashi 著者:takahashi

CentOS7に最新のMariaDB(10.4)をインストールする方法

MySQL互換のDBサーバーであるMariaDBは、 CentOS 7 リポジトリでも入手することができますが、リポジトリで利用できる最新パッケージがバージョン5.5となっていて、現時点で最新版の10.x系は入手することができません。

しかし、MariaDBの開発を主導するMariaDB Foundation が公式のリポジトリを公開しており、このリポジトリを使用すればCentOS 7 でもyumで最新版のmariaDBをインストールすることができます。

今回は、最新のMaridDBのインストール方法をご紹介します。

まず、MariaDB Foundationのダウンロードページへ移動します。

画像のように使用中のOS(CentOS 7)とそのバージョン(intel/AMDのCPUであればx86_64でokです。)を選択し、入手したいMariaDBのバージョンを指定します。(おすすめは[Stable]となっているバージョンです。)

すると下部にリポジトリの情報とインストールコマンドが表示されますので、CentOSに入れ込んでいきます。

まず、MariaDB 10.4のリポジトリをCent OSに登録します。

“/etc/yum.repos.d/” に、”MariaDB.repo” という名前で次の内容のファイルを作成します。

# MariaDB 10.4 CentOS repository list - created 2019-09-24 05:39 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

ここまで出来たら、次のコマンドでMariaDBをインストールします。

sudo yum install --enablerepo=MariaDB,epel MariaDB-server MariaDB-client

インストールが完了したら、次のコマンドでバージョンを確認します。

mariadb --version

ちゃんと10系のMariaDBがインストールできました。

takahashi 著者:takahashi

redisを触ってみる Pub/Sub編

前々回からご紹介しているredisですが、KVS型のDBとしての機能のほかに、もう一つredisが備えている機能があります。

メッセージ配信の仕組みである”Pub/Sub”をredisクライアント間でできる機能です。

Pub/Subとは、メッセージを受信したいユーザーが特定のチャネルを購読(Subscribe)し、配信側はそのチャンネルに対してメッセージを一斉配信(Publish)することで購読側はメッセージを受け取るという仕組みです。

Pub/Subをするために、必ずしもredisを使用する必要はありませんが、自分で実装するとそこそこ大変なのでredisのような既存の仕組みで利用できるのはとてもありがたいです。

今回はredisのPub/Sub機能を実際に試してみたいと思います。

まず、redis-cliクライアントを2つ立ち上げておきます。

片側のredis-cliで、下記のようなコマンドを実行します。

subscribe チャネル名

subscribeしたクライアントは、待機状態になります。

なお、subscribeしている間は他のredisコマンドは実行できなくなるので注意してください。

この状態で、今度はもう片側のredis-cliで下記のようにコマンドを実行します。

publish チャネル名 メッセージ

すると、先程subscribeした側のredis-cliにpublishされたメッセージがリアルタイムで受信されます。

前々回にご紹介した、redisをリモートから接続できるようにしておけば、ネットワーク経由でも送ることができます。

複数クライアントもばっちりです。

redis単体でここまでできるので、あとはプログラムとredisをつないでWebsocketあたりを使えば、簡単にリアルタイムチャットなども実装できそうですね。

・前の記事
redisを触ってみる 基本操作編

takahashi 著者:takahashi

redisを触ってみる 基本操作編

前回は、redisのインストール・起動方法についてご紹介しました。

今回は、redisを実際に操作して、値を保存する方法をご紹介したいと思います。

値の保存・呼び出し

redisはKVS(Key-Value Store)型のDBなので、データ構造としては、あるキーに対してある値が紐づく、といった概念になります。

redisで値の保存(RDBでいうinsertに相当)を行うには、先日説明したredis-cliを起動し、下記のようにコマンドを入力します。

set キー名 値

こうすると、キー名で指定された名前のキーが作成され、値で指定された値がキーと紐づけられ、redisに保存されます。

キーに保存した値を確認(RDBでいうsekectに相当)するときは

get キー名

とするだけで取得できます。

データ構造の概念が簡単だけあって、コマンドも超簡単で扱いやすいですね。

キー一覧を表示する

先程までの手順で、キーを作成して中に値を登録し、キー内に登録した値を表示するところまではできました。

ではキー名を忘れてしまった場合などに、現時点で作成済みのキーの一覧を見たい、という場合もあるかと思います。

そういう場合は下記のコマンドを実行すると作成したキーの一覧が表示されます。

keys *

ほかにも、変数の型を変更することで一つのkeyに複数の値を挿入したり、値の保存期間を指定したり、といった機能があるそうです。

SQLと比較すると、やはり簡素すぎて代替えにはならないなーという印象ですが、その分非常に扱いやすいうえ動作も軽く、速いので、一時的に値をストックしておく使い方であれば十二分に便利に使えそうです。

導入も簡単ですし、手軽に触れますので、まだredisを触ってないけど興味が出てきたかも…という方はぜひ触ってみてください。

・次の記事
redisを触ってみる Pub/Sub編

・前の記事
redisを触ってみる 初期設定編

takahashi 著者:takahashi

redisを触ってみる 初期設定編

以前にも記事で取り上げたredisですが、いろいろきっかけがありまして実際に触ってみることにしました。

redisはNoSQLなデータベースサーバーなので、redisのサーバープロセスを立ち上げる必要があります。

ということで、まずはOSにredisをインストールします。

RedHat系(CentOSなど) の場合は

sudo yum install redis #インストール
sudo systemctl start redis #起動
sudo systemctl enable redis #自動起動に登録

debian系(Ubuntuなど)の場合は

sudo apt update #パッケージリスト更新
sudo apt install redis #インストール
sudo systemctl start redis-server #起動
sudo systemctl enable redis-server #自動起動に登録

mac OSでbrewコマンドが利用できる場合は

brew install redis #インストール
redis-server #フォアグラウンドで起動

とします。

インストールが完了すると、redisサーバー本体のredis-serverとredisを操作するクライアントであるredis-cliが利用できるようになります。

同じPC内でredisのサーバーとクライアント両方を動かす場合は、redis-serverが起動しているのを確認したうえで

redis-cil

とするだけでredis操作用のプロンプトに入ることができます。

ところで、redis-cliからリモートのredis-serverに接続しようとすると

こんな感じで、はじかれてしまいます。

redisはデフォルトでlocalhostからの接続のみ受け付けているため、外部からの接続を受け付けるようにするにはLANからの接続を受け付けるように設定する必要があります。

Ubuntuの場合は

/etc/redis/redis.conf

に設定があるので、vimなどでこのファイルを編集します。

編集するのは、上の画像にあるように “bind”と書かれている行です。

デフォルトでは 127.0.0.1 つまり、localhost(サーバー自身)からの接続のみしか受け付けない設定になっています。

外部からアクセスできるようにするには、redisが稼働するサーバーマシンのLANポート(NIC)に割り振られているIPアドレスを指定します。

例えば、 サーバーマシンに192.168.11.100というIPアドレスが降られている場合は

bind 127.0.0.1 192.168.11.100 #2019/9/19 訂正 127.0.0.1をとってしまうとlocalhostからの接続ができなくなります。

とすればこのIPアドレスが振られたNIC経由でのredisへの接続を受け付けるようになります。

もし複数のNICが搭載され、複数のIPが振られている状態で両方のネットワークから接続を受け付けたい場合は

bind 192.168.11.100 192.168.1.100

のようにスペース区切りにすると複数指定できます。

また、すべてのNIC経由での接続を受け付けたい場合は

bind 0.0.0.0

とします。

設定が終わったら、Linux系の場合は

sudo systemctl restart redis-server (あるいはredis)

とします。

mac OSなどでフォアグラウンドで起動している場合はいったんredisを停止させてから起動しなおします。

この状態で再度 redis-cli コマンドでリモートにつなげると

こんな感じでリモートからでも接続できるようになります。

・次の記事
redisを触ってみる 基本操作編

takahashi 著者:takahashi

Cygwinのバージョンを確認する方法

Unixライクな環境をWindows上で再現できるCygwinですが、使用しているとインストール済みのCygwinのバージョンが知りたくなる時があります。

Cygwinはインストーラーがパッケージマネージャを兼ねているような感じになっているので、Cygwinのインストーラーからインストール済みバージョンを確認することは可能です。

しかし、インストーラーをインストール後に破棄してしまった場合で、再度インストーラーをダウンロードできないような状況では困ることがあります。

実はCygwinではパッケージマネージャだけでなく、Cygwinターミナル上からもバージョンを確認することができます。

下記のコマンドを実行します。

cygcheck -c cygwin

すると下記のような形でバージョンが出力されます。

$ cygcheck -c cygwin
Cygwin Package Information
Package              Version        Status
cygwin               2.10.0-1       OK

cygcheckコマンドはインストールされたcygwinパッケージのバージョンなどを表示することができるコマンドなのですが、Cygwin本体もCygwinのパッケージとして扱われているので、このコマンドで情報が確認できるようになっているようです。

Cygwinのバージョンのチェックが必要な場合は参考にしてみてください。

takahashi 著者:takahashi

風の強さなどをわかりやすく視覚的に表示してくれるWebサービス “Windy.com”

台風などが発生した際、自分の地域やこれから向かう場所がどういう状況なのか、またこれからどうなっていくのか、知りたくなることがあると思います。

最近、風の動きを超感覚的に見ることができるWebサービスを見つけたので、ご紹介したいと思います。

Windy.com

実際にサイトにアクセスしていただければ、白い粒子が地図上を飛び交っているのがわかるかと思います。

この粒子一つ一つの動きが風の流れであり、粒子が進む方向に、粒子の進む速さが早いほど強い風が吹いています。

左下に再生ボタンがありますが、こちらをクリックすると画面下部のプログレスバーが動いていき、現在時刻以降の、風の動きの予測を見ることができます。

内容としては日本で公開されている予測サービスとぱっと見差はないのですが、細かい風の流れを見ることができるため、例えば台風が来た際の自分の住んでいる地域への深刻度がどれぐらいなのかが、他サービスとくらべて実感しやすく、いろいろな判断材料にしやすいのではないかなと思いました。

ちなみにアプリもリリースされているので、スマートフォンからはこちらを利用すると便利そうです。

The app was not found in the store. 🙁

もうこれ以上台風はまったくもって御免ですが、まだもう少し台風シーズンが続きますので、こういったアプリを利用して、防災について考えてみるのもいいかもしれませんね。

takahashi 著者:takahashi

MySQL 8.0に更新したらownCloudがMySQLに接続できなくなった場合の対処法

先日Ubuntu(18.04)をアップデートしたところ、インストールしてあったMySQLが5系から自動で8.0に更新されました。

この状態で普段から使用しているストレージサービスをサーバー上で動作させることのできる”ownCloud”を動かしたところ…

SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developers

上のようなエラーが発生。

調べたところ、どうやらMySQL8.0ではデフォルトの文字コードが設定ファイルで未定義になっているとエラーになるようです。

ということで、/etc/mysql/my.cnfに下記のように指定を追記します。(文字コードは必要に応じて変更した方がよさそうな気がします。)

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4

ただし、これだけだと

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

といったエラーが出てしまいますので、もう一行

default_authentication_plugin=mysql_native_password

の追記が必要です。

つまり合わせると、下記の4行を追記すればOKです。

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
default_authentication_plugin=mysql_native_password

これでエラーが消えて正常に動作するようになりました。

参考: MySQL 5.7 → MySQL 8.0 に更新した&メモ – 犬ターネット