ホームネットワーク日記

設定したことを忘れないように書いてあります。

2021.05.18
Webページ上のMarkDown文章をHTMLに成形して表示する。

作業メモなどは、すべてMarkDownで記述し、保管しているディレクトリをApacheで公開している。 この文書をブラウザで開くと単なるテキスト表示されてしまうが、これを成形した形で表示したい。

同じようなことを考えている人はおり、それを参考にして実施したが,全く同じでは動作しなかったので修正点などをメモとしてする。

インストールのための環境を整える

composerをインストールする

markdown文書を成形するために、php-markdonwをインストールする。 インストールにあたって、依存性管理のために、まずはcomposerをインストール。

https://getcomposer.org/download/ に従い、以下のコマンドを実施。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

composer-setup.phpを実施するとphpのjson拡張が無いといわれる。 当方、CentOS-8なので、以下のパッケージをインストールした。

$ sudo dnf install -y php-json

composerを/var/lib/php/composerにインストール。

$sudo php composer-setup.php --install-dir=/var/lib/php/composer
All settings correct for using Composer
Downloading...

Composer (version 2.0.13) successfully installed to: /var/lib/php/composer/composer.phar
Use it: php /var/lib/php/composer/composer.phar

グローバルで使えるように/usr/binにシンボリックリンクを張る。これは直パスで打つなら必要のない作業。

$ sudo ln -sf /var/lib/php/composer/composer.phar /usr/bin/composer

markdown -> html化 ツールをインストール

いくつか種類はあるようだが、参考にしたページにあるphp-markdownをインストール。 インストール先は/var/lib/php/composerとした。

$ cd /var/lib/php/composer
$ sudo composer require michelf/php-markdown
Using version ^1.9 for michelf/php-markdown
./composer.json has been updated
Running composer update michelf/php-markdown
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking michelf/php-markdown (1.9.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading michelf/php-markdown (1.9.0)
  - Installing michelf/php-markdown (1.9.0): Extracting archive
Generating autoload files

markdownを保存しているディレクトリの.htaccessに以下を追加する。
AddTypeにより、拡張子".md"の場合に、コンテンツタイプとして"text/markdown"を追加し、 Actionディレクティブにより、"text/markdown"に対して、指定したファイルを実行する。
Actionで指定したmd.phpは、phpが動作するディレクトリに置き、ドキュメントルートからのパスで指定する。

AddType text/markdown md
Action text/markdown /Memo/md.php

md.phpを上記の場所に設置する。内容は以下のとおり。

<?php
set_include_path(get_include_path().PATH_SEPARATOR."/var/lib/php/composer/vendor/");
require 'autoload.php';
use Michelf\MarkdownExtra;
  
if ( isset($_SERVER['PATH_TRANSLATED']) ) {
  $file = realpath($_SERVER['PATH_TRANSLATED']);
  $ext = substr($file, strrpos($file, '.') + 1);
  $title = $_SERVER['REQUEST_URI'];
}
    
if ( $file and is_readable($file) and strtolower($ext) === 'md')
  $body = MarkdownExtra::defaultTransform(file_get_contents($file));
else
  $body = '<p>cannot read file</p>';
  
header('Content-Type: text/html;');
echo '<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="/css/markdown.css" title="MarkDown Style" />
  <title>'.$title.'</title>
</head>
<body>
' .
$body
. '  </body>
</html>';
?>

include_pathは、php.iniに記述しても良いが、md.phpに記述することとした。 include_pathは、composerのautoload.phpがある場所を、URLではなくローカルディレクトリのパスで指定する。 composerでインストールしたパッケージは、autoload.phpをrequireすることで使用できる。

useでMarkdownExtraではなく、Markdownとすると、TraditionalなMarkdown記法となる。 あえてTraditionalなフォーマットを指定する理由がないので、MarkdownExtraを使用した。
MarkdownExtraでは、テーブルタグも利用できる。

stylesheetをlinkタグで指定しておき、自分の見やすいようにcssで成形する。

2020.09.10
smokepingを設定する

dockerをインストールできたので、smokepingをdocker上に構築してみる

Docker Imageの取得

dockerのイメージを取得する。-pオプションにより、smokepingの内部ポート80に対して、外部のポート番号1888を接続している。

$ sudo docker run -it --name smokeping -p 1880:80 -e TZ=Asia/Tokyo -d dperson/smokeping
fa9d04d50cb41fe7886f1ae03b3239074df5a94319237965029f168584c7e45c

コンテナIDを確認

コンテナに対する操作は、コンテナIDを使用する。コンテナIDを確認するためには以下のコマンドを使用。

$ sudo docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
    fa9d04d50cb4        dperson/smokeping   "smokeping.sh"      17 minutes ago      Up 17 minutes       0.0.0.0:1880->80/tcp   smokeping

監視ターゲットの追加

監視ターゲットとして、googleのDNSを設定してみる。

$ sudo docker exec -it smokeping smokeping.sh -t "Google;DNS1;8.8.8.8"
Service already running, reloading configuration
HUP signal sent to the running SmokePing process, exiting.

ターゲットファイルを直接編集する場合は、一度ホスト側にファイルを持ってきてから編集する。

Targetファイルを複製する

$ sudo docker cp fa9d04d50cb4:/etc/smokeping/config.d/Targets ~

編集後したら元に戻す

$ sudo docker cp ~/Targets fa9d04d50cb4:/etc/smokeping/config.d/

コンテナ上に反映されていることを確認する

$ sudo docker exec -it fa9d04d50cb4 /bin/cat /etc/smokeping/config.d/Targets

コンテナの再起動

設定を反映させるために、コンテナを再起動する

$sudo docker restart fa9d04d50cb4

自動起動の設定

サーバ再起動時等にコンテナを再起動するように設定する。alwaysはコンテナが停止した場合は自動再起動。その他のオプションは以下の通り。

sudo docker update --restart=always smokeping
オプション 意味
no コンテナを自動的に再起動しない
on-failure エラー発生時にコンテナを再起動する
always コンテナが停止すると常に再起動
unless-stopped 手動でコンテナを停止した場合は再起動しない

設定がされたことを確認するには、docker inspectを使用する。

sudo docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' fa9d04d50cb4
always
2020.05.15
サーバ証明書の適用

Underconstraction

今どきはSSL証明書がほぼ必須となっているので、lets encryptを使ってサーバ証明書を作成した。

まずは、証明書の取得・更新を行うためのスクリプトであるcertbotを取得する。 上記のページからディストリビューションとサーバ種別を指定すると取得するための方法を示すpageが表示される。 Cent-OS 8では以下のように、wgetして適当なディレクトリに移動し、パーミッション/オーナを設定する。

# wget https://dl.eff.org/certbot-auto
--2020-05-15 11:51:11--  https://dl.eff.org/certbot-auto
dl.eff.org (dl.eff.org) をDNSに問いあわせています... 151.101.64.201, 151.101.0.201, 151.101.128.201, ...
dl.eff.org (dl.eff.org)|151.101.64.201|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 79712 (78K) [application/octet-stream]
`certbot-auto' に保存中
certbot-auto                  100%[=================================================>]  77.84K  --.-KB/s 時間 0.01s
2020-05-15 11:51:11 (6.88 MB/s) - `certbot-auto' へ保存完了 [79712/79712]
# mv certbot-auto /usr/local/bin/certbot-auto
# chown root /usr/local/bin/certbot-auto
# chmod 0755 /usr/local/bin/certbot-auto
2020.05.14
nginxでリバースプロキシを構築する

今までは、poundApacheでWebを構成していたが、今どきはnginxだろうとリバプロを変更してみた。

nginxのインストール

インストールは普通にパッケージから。

$ sudo dnf -y install nginx

リバースプロキシー設定

'/etc/nginx/nginx.conf'のserver定義はすべてコメントアウトし、'/etc/nginx/conf.d'に'virtual.conf'を作成。 以下の設定は、外部からは、www.example.comとwww.foo.example.netというfqdnでアクセスし、実態としては、 bar.example.netというサーバ上のポートベースのバーチャルホストに振り分ける。

server {
    server_name     www.example.com;

    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-Server      $host;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
            proxy_pass    http://bar.example.net:8888/;
    }
}
server {
    server_name     www.foo.example.net;

    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-Server      $host;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
            proxy_pass    http://bar.example.net:8080/;
    }
}

リロードによる反映と、自動起動の設定を行う。

# systemctl reload nginx
# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

Apacheのログを変更する

リモートアドレスをログに残すように`/etc/httpd/conf/httpd.conf`のLogFormatを下記に変更する。

  • before
  •     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        
  • After
  •     LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined