2026/06/04(木)さくらのレンタルサーバでホスティングしていたサイトの大部分を自宅サーバーに移行した
今日は遂に運営サイトの大半をさくらのレンタルサーバーから自宅サーバーへ移行することに成功した。
自宅サーバーでの個人サイト運営は中学時代からの夢だったので、悲願が叶ったようでちょっと嬉しい。
- 移行したサイトなど
- やったこと
- トラブルシューティング
cgi-binを含むパスが/usr/lib/にマップされた- ダンプ取り込み時に
ERROR 1273 (HY000) at line 30: Unknown collation: 'utf8mb4_0900_ai_ciが出る - MySQLを叩くCGI実行時に
Exception while creating PDO object:SQLSTATE[HY000] [2002] Connection refusedが出る - CGI実行時に
End of script output before headers: hoge.cgi,が出る .htaccess: Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration- nginx -> Apache2のリバプロ環境でMatomoが無限リダイレクトしたり、エラーログを吐きまくる
- 504エラーが出たり、やたらめったら凄く重い
- あとがき
移行したサイトなど
次のサイトやサービスを移行した。
- lycolia.info -
lycolia.info- エントランスページ、LPみたいなもん
- Lycolog -
blog.lycolia.info- このブログ。このブログは2019年より前のログがないが、実はこのサイトは元からブログとして発祥している。当時はブログという概念はなく、日記サイトだった
- Webツール置き場 -
tool.lycolia.info- 適当に作った便利ツールを置いている
- ECO-Wiki (lycolia) -
eco.lycolia.info- 最近一言BBSへの書き込みがないのが気がかりなWiki。実はアクセスは落ちてない
- アクセス解析 Matomo
- TinyTinyRSS
やったこと
さくらのレンタルサーバから自宅サーバーへファイルを移設し、権限を設定
# サイト単位にtarballに固める
tar -cf hoge.tar hoge
# Windows上のRLoginを使って、NASとしてマウントしている自宅サーバーに転送
cp hoge.tar <ホスティングファイル置き場>
tar -xf hoge.tar hoge
# Apacheから見えるように
chown -R www-data:www-data <ホスティングファイル置き場>/hoge
# www-dataに属するユーザーがいじれるように
chmod -R g+rxw <ホスティングファイル置き場>/hoge
cgi-binフォルダを使っているスクリプトの対策
ヘッダーモジュールの有効化
使ってるやつがいたので有効化。
sudo a2enmod headers
さくらのレンタルサーバのMySQLからDBをダンプし、自宅サーバーのMariaDBに取り込み
sudo mysql -u <ユーザー名>
CREATE DATABASE <DB名>;
exit
# 照合順序をMariaDB方式に変換
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' ~/hoge.sql
sudo mysql <DB名> < ~/hoge.sql
nginxとApache2の設定を追加
nginx -> Apache2の構成にしているので、これの設定。基本的にレンサバでホスティングしていたものはApacheの上にのせておくと色々と楽だ。.htaccessは神だし、静的ファイルやCGIのホスティングをする場合、Apacheは取り回しがとても良い。
/etc/nginx/conf.d/にサイトごとのリバプロの設定を置く。一例としてはこんな感じserver { listen 443 ssl; listen [::]:443 ssl; server_name eco.lycolia.info; client_max_body_size 100M; ssl_certificate /etc/letsencrypt/live/lycolia.info/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/lycolia.info/privkey.pem; location / { proxy_pass http://apache/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }/etc/apache2/sites-enabled/にもサイトごとの設定を書く。一例としてはこんな感じ<VirtualHost *:8080> ServerName eco.lycolia.info ServerAdmin webmaster@localhost DocumentRoot /var/www/path/to # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/eco-error.log CustomLog ${APACHE_LOG_DIR}/eco-access.log combined </VirtualHost>
このリバプロの設定の意味合いについては過去に書いたnginxからApache2のバーチャルホストにいい感じにリバプロする方法、nginxからApache2へセキュアにリバプロしたときに真のクライアントIPを取得できるようにするを参照。
SSIの有効化
今時SSIを使ってる人なんてまずいないと思うが、令和最新版ということで…。
やり方
- SSIモジュールを有効化する
sudo a2enmod include /etc/apache2/apache2.confを開き、全域でSSIを有効化。ついでにDirectoryIndexにも入れとく。SSIの設定はDirectoryディレクティブの中でないと効かない<Directory /var/www/> AllowOverride All DirectoryIndex index.php index.cgi index.shtml index.html index.txt # Optionsに+Includesの部分を追加する Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch +Includes AddHandler cgi-script .cgi Require all granted </Directory>
.shtmlの場合にSSIを許可するように管理しているのは恐らく/etc/apache2/mods-enabled/mime.confだと思われる。ここでMIME-TYPEも付与していると思われる。
バーチャルホストやんいやパス単位にしたい場合は適当なDirectoryディレクティブにOptions +Includesを書けば機能する。
余談だがSSIはエントランスページの更新日時を出すのに使っていて、過去に記事のネタにしたこともある。
アプリケーションのDBの向き先を変更
移設したMatomoとTTRSSは共にMySQLを使っていたためMySQLの接続情報を書き換えた。
DBの接続先はlocalhostでなく、127.0.0.1でないと上手くいかなかった。::1も通らなかったため、恐らくIPv6でListenしていないのだと思う。
Matomoの設定
- 無限リダイレクト抑制のため
config/config.ini.phpのeneralセクションにassume_secure_protocol = 1を追加する。詳細はトラブルシューティングの該当項目参照 - gd2以上を入れろと言われるので使っているPHPのバージョンにあったものを入れる
sudo apt install php8.3-gd - MySQLの
max_allowed_packetが少なすぎると言われるので/etc/mysql/my.cnfを開きmysqldセクションに設定を足す[mysqld] + max_allowed_packet=64MB
ドメインの切り替え
- Value-DomainのDNS管理画面を開き、移設したドメインを全て自宅サーバーに向けた
- 移設前はAレコードとMXレコードのIPが同一だが、今回からAレコードとMXレコードのIPが変わるので分離した。これで合っているのか怪しいが一応メールが届くことは確認している
+mx mx.lycolia.info. 10 +a mx 133.167.8.98 +aaaa mx 2403:3a00:101:13:133:167:8:98 mx lycolia.info. 10 -a 133.167.8.98 -aaaa 2403:3a00:101:13:133:167:8:98 +aaaa @ 2400:4153:8f01:c800:c14b:3f7a:2b54:353a +a @ 133.167.8.98 - 今回移設したドメインを対象にvalue-domain-dns-utilの
vd-ddns-v4.plでDDNSを行う設定を追加
トラブルシューティング
cgi-binを含むパスが/usr/lib/にマップされた
例えば/var/www/html/hoge/cgi-bin/mgcount/mgcount.cgiを実行すると/usr/lib/cgi-bin/mgcountを叩こうとしてコケる問題と出会った。
実際に出たログの一例としては以下のような状態だった(IPはマスクしているが他はそのまま)
[Wed Jun 03 21:02:12.751027 2026] [cgid:error] [pid 865047] [client xxxx:xxxx:xxxx:xxxx:xx:xxxx:x:x:x] AH01264: script not found or unable to stat: /usr/lib/cgi-bin/mgcount, referer: https://lycolia.info/index.shtml
これはどうも規定ではcgi-binが入ったパスを/usr/lib/cgi-bin/にバインドする振る舞いがあるらしく、sites-enabled/の設定に次の記述をすることで正しいパスを呼び出すことができるようになった。
<VirtualHost *:8080>
ServerName hoge.lycolia.info
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/hoge
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/hoge-error.log
CustomLog ${APACHE_LOG_DIR}/hoge-access.log combined
# ScriptAliasで既存のバインドを上書きする
ScriptAlias /cgi-bin/ /var/www/html/hoge/cgi-bin/
</VirtualHost>
ダンプ取り込み時にERROR 1273 (HY000) at line 30: Unknown collation: 'utf8mb4_0900_ai_ciが出る
MySQLとMariaDBで照合順序の名前が違うらしいのでダンプファイルをMariaDB流で置換する。
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' ~/hoge.sql
MySQLを叩くCGI実行時にException while creating PDO object:SQLSTATE[HY000] [2002] Connection refusedが出る
DBに繋がっていないのが原因。ポート番号やIDPWなどに間違いがなく、ローカルDBに繋ぐ場合、DBの接続先をlocalhostでなく、127.0.0.1にすれば直る。
CGI実行時にEnd of script output before headers: hoge.cgi,が出る
これはHeaderを吐く前にエラーが標準出力されているので出るエラーと思われる。昔PHPやってた人にはお馴染みのやつ。
Shebangに書かれているパスにPerlがないのが原因なのでShebangのパスを見てそこにシンボリックリンクを張っておく。
sudo ln -s /usr/bin/perl /usr/local/bin/perl
.htaccess: Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration
ヘッダーモジュールを有効化する。
sudo a2enmod headers
nginx -> Apache2のリバプロ環境でMatomoが無限リダイレクトしたり、エラーログを吐きまくる
一般的に内部リバプロはhttpで送るが、これが原因。
Matomoはhttpリクエストをhttpsにリダイレクトするが、リバプロがhttpでリクエストしてくるため無限ループになって発生する。MatomoのGitHubリポジトリのIssueに山ほどある問題。
解消法としては以下の様にconfig/config.ini.phpのGeneralセクションでassume_secure_protocol = 1を設定すればよい。
[General]
+assume_secure_protocol = 1
504エラーが出たり、やたらめったら凄く重い
アクセスが集中してるときにMatomoがDBエラーを吐いてるとAMD Ryzen 5 8500Gでメモリ32GBのNVMe SSDを積んだマシンですら504が出る程度には重かった。
エラーを潰したら平和になった。
あとがき
2017年から自宅サーバーをマイペースに運用しており、初期はSSHDを立てただけの簡易NASやシンクラ環境として使っていたが、去年からMastodonの運用をはじめ、中学のころの夢だった鯖缶になることができた。そして更に今回、死活監視用に確保しているサイト(未構築)を除き、全てのサイトを自鯖に移行できたので、まさに中学生のころに夢見た、Webサイトを運用する鯖缶になることができ、感激もひとしおだ。
移設作業中は通信トラフィックやディスクI/Oが一気に跳ね上がったりだとか、CPUやメモリも結構頑張っていて、運用しているMastodonがやたら重くなったのが印象的だった。
何せこのブログだけでファイル数15,197の容量13GBもあるのだから無理もない。
あと移設作業中にadiaryのOGPが出なくてなんでだ?と思ったら、HTTPSの判定処理に漏れがあり、HTTPでURLが出ていたので、リバプロのヘッダもみるように改修した。実装上、リバプロしていない場合に子のヘッダが送られてきてもHTTPSになってしまうが、困るのはそんな不正な要求を送った本人なので、特に問題ないだろう。
さて、ここまで来たら次は以前も話に出した、Anubisを導入してWAFを掛けたり、現在日々増強中の監視体制の強化を続けていくなどして、自作サーバーライフを楽しんでいきたいところだ。
振り返ってみたら2025/08/21から今日までの間になんと三回も言及しており、これで四回目らしい。草。
特に意味はないが、過去にあったAnubisへの言及を以下にまとめてみた。
- 2026/05/26 直近でやりたいことリスト
- 2026/05/30 このブログにやってくる海外IPのBOTの挙動を軽く調べた
- 2025/08/21 Ubuntu実機IPv6シングルスタック環境にMastodonを入れてみた
なんと言うか一年くらい塩漬けにしていたプロジェクトが最近はじわじわ進んでいる気がしていて、非常に清々しい。
そういえばadiaryをサーバーモードで動かすと早いという話があるので、そっちも試してみたいところだ。これは最近記事の増加に伴い中々重くなってきているのを感じているからだ。
やりたい事がたくさん湧いてくるのは充実していてとても良い。
2026/05/30(土)このブログにやってくる海外IPのBOTの挙動を軽く調べた
アクセス解析にノイズが出て鬱陶しいので、海外IPのUAを幾らか調べてみたまとめ。
今年の1月末付近と、5月末に調査を実施している。
集計条件
https://blog.lycolia.info/配下にHTTPリクエストが来た時で、そのURLにファイルが存在しない場合に、海外IP判定が出たものについて次の基準で集計している。
- 2026-01-29 19:30:25 -> 2026-02-03 07:23:22
- UAに次を含まない
bot | curl | wget | google | bing | mastodon | misskey | pleroma | akkoma | lemmy | activitypub | hatena | github | tumblr
- 日本、韓国、台湾のIP以外
- UAに次を含まない
- 2026-05-25 20:15:52 -> 2026-05-29 23:19:00
- UAに次を含まない
bot | curl | wget | google | bing | mastodon | misskey | pleroma | akkoma | lemmy | activitypub | hatena | github | tumblr | meta
- 日本のIP以外
- UAに次を含まない
IPの国判定にはその月のDBIP-City.mmdbを使用した。
2026-01-29 19:30:25 -> 2026-02-03 07:23:22
UA別
meta-externalagent/1.1はFacebookやInstagramのOGP収集クローラーらしいが、異常にアクセスが多い。無害なので5月のログでは許可しているBaiduspiderは百度のクローラー、個人的にいい印象はない。NULL、UA未設定。まともなアクセスでない可能性が高い。PHPのfile_get_contents()だとデフォは空。curlはcurl/8.19.0みたいなのがデフォルトで入る。FaradayはRubyのHTTPクライアントらしいTwingly Recon-Sjostromは何かしらのフィードリーダーの可能性がある
| UserAgent | 件数 |
|---|---|
| meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler) | 975 |
| Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) | 490 |
| NULL | 273 |
| Faraday v1.10.4 | 104 |
| Chrome Privacy Preserving Prefetch Proxy | 58 |
| Apache-HttpClient/4.5.2 (Java/1.8.0_161) | 40 |
| Apache-HttpClient/4.5.2 (Java/1.8.0_151) | 40 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36 | 21 |
| Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 | 20 |
| node | 19 |
| Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 | 18 |
| Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 | 17 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36 | 12 |
| Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 | 11 |
| facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) | 10 |
| Twingly Recon-Sjostrom/1.0 (+https://app.twingly.com/public-docs/crawler) | 10 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F | 10 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 | 8 |
| Mozilla/5.0 (compatible; crawler) | 7 |
| NotionEmbedder | 6 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 | 6 |
| python-requests/2.32.4 | 5 |
| Python/3.9 aiohttp/3.10.6 | 5 |
| Go-http-client/2.0 | 5 |
| Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0 | 3 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 | 3 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 | 3 |
| Go-http-client/1.1 | 3 |
| Fedineko (crabo/0.3.1; +https://fedineko.org/about) | 3 |
| python-httpx/0.28.1 | 2 |
| imgproxy/3.30.0 | 2 |
| Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user) | 2 |
| Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 | 2 |
| Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:114.0) Gecko/20100101 Firefox/114.0 | 2 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 | 2 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 | 2 |
| ALittle Client | 2 |
| undici | 1 |
| ktor-client | 1 |
| aria2/1.36.0 | 1 |
| Python/3.11 aiohttp/3.13.3 | 1 |
| Mozilla/5.0 (compatible; VulnScanner/1.0; +https://example.com/) | 1 |
| Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0 | 1 |
| Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:128.3) Gecko/20100101 Firefox/128.3 | 1 |
| Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:79.0) Gecko/20100101 Firefox/79.0 | 1 |
| Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0 | 1 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 | 1 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 | 1 |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 | 1 |
| Mozilla/5.0 (X11; Linux i686; rv:1.9.7.20) Gecko/5137-01-18 15:15:18.309540 Firefox/6.0 | 1 |
| Mozilla/5.0 | 1 |
| More Internet Explorer 8.0 user agents strings -->> | 1 |
| Iframely/1.3.1 (+https://iframely.com/docs/about) Atlassian | 1 |
| BaiduSpider | 1 |
国別
アメリカが最多で、中国、インドと続いた。
| 国 | 件数 |
|---|---|
| US | 1,329 |
| CN | 575 |
| IN | 125 |
| VN | 67 |
| JM | 19 |
| BR | 15 |
| SG | 14 |
| IE | 9 |
| CA | 8 |
| MX | 6 |
| IQ | 6 |
| NL | 5 |
| BD | 5 |
| UA | 3 |
| AR | 3 |
| ZA | 2 |
| PL | 2 |
| GB | 2 |
| FR | 2 |
| EE | 2 |
| DE | 2 |
| TR | 1 |
| TN | 1 |
| TM | 1 |
| SE | 1 |
| PY | 1 |
| PT | 1 |
| ID | 1 |
| HK | 1 |
| GE | 1 |
| ES | 1 |
| DZ | 1 |
| CO | 1 |
| CL | 1 |
| BH | 1 |
| BE | 1 |
| AT | 1 |
| AD | 1 |
UAがNULLの国別
アメリカにNULLのUAが多く、意外と中国にはなかった。偽装UAであれ設定してるだけまともといえる。
| 国 | 件数 |
|---|---|
| US | 143 |
| IN | 124 |
| IE | 4 |
| SG | 2 |
アクセス先URL
ほとんどが公開URLへのアクセスで有害なURLへのアクセスは思ったよりなかった。
| URL | 件数 |
|---|---|
| 無害なURL | 1,196 |
| 有害なURL | 467 |
2026-05-25 20:15:52 -> 2026-05-29 23:19:00
UA別
metaを弾くようにした結果NULLがトップに上がってきたBaiduspiderが来なくなったFaradayがrururu.appからのクロールであることが判明した(rururu.appに出た瞬間にログを確認したところ、これしかいなかったため)- Fediverse系のUAが増えた気がする
| UserAgent | 件数 |
|---|---|
| NULL | 801 |
| python-httpx/0.28.1 | 109 |
| Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) | 105 |
| Faraday v2.14.2 | 99 |
| amazon-Quick-on-behalf-of-e1871480 | 85 |
| Chrome Privacy Preserving Prefetch Proxy | 62 |
| Mozilla/5.0 three-stage-hot-model-probe/2.0 | 45 |
| Go-http-client/2.0 | 35 |
| Apache-HttpClient/4.5.2 (Java/1.8.0_161) | 20 |
| facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) | 18 |
| Twingly Recon-Sjostrom/1.0 (+https://app.twingly.com/public-docs/crawler) | 14 |
| Python/3.12 aiohttp/3.13.3 | 6 |
| Mozilla/5.0 | 6 |
| Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.86 Safari/537.36 | 4 |
| fediway-ingest/0.1 | 3 |
| Mozilla/5.0 (compatible; NuxtFyi/0.1; +https://nuxt.fyi) | 3 |
| ALittle Client | 3 |
| facebookexternalhit/1.1 | 2 |
| Ruby | 2 |
| Python/3.11 aiohttp/3.9.5 | 2 |
| PubkyWebIndex/0.1 (+https://pubky.app) | 2 |
| Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +claude-user@anthropic.com) | 2 |
| Mozilla/5.0 (compatible; LinkRing/1.0; +https://linkring.lol) | 2 |
| Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 | 2 |
| Iframely/1.3.1 (+https://iframely.com/docs/about) Atlassian | 2 |
| Amethyst/1.08.0 | 2 |
| Amethyst/0.94.3 | 2 |
| python-httpx/0.27.2 | 1 |
| git/2.34.1 | 1 |
| SubstackContentFetch/1.0 (https://substack.com/) | 1 |
| Python/3.9 aiohttp/3.13.5 | 1 |
| Python/3.12 aiohttp/3.13.5 | 1 |
| Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app) Chrome/W.X.Y.Z Safari/537.36 | 1 |
| Mozilla/5.0 (compatible; crawler) | 1 |
| Mozilla/5.0 (compatible; InternetMeasurement/1.0; +https://internet-measurement.com/) | 1 |
| Mozilla/5.0 (compatible; ClarityPlatformCrawler/1.0; +https://clarity.microsoft.com) | 1 |
| Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/) | 1 |
| Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 | 1 |
| Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 | 1 |
| Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 | 1 |
| Java/25.0.3 | 1 |
| Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity | 1 |
国別
前回15件しかなかったブラジルが425件に増えてトップに躍り出た。ブラジルに何があるんだ…。AWSのデータセンター?
そしてアメリカ、カナダ、中国、台湾と次ぐ。アメリカはAWSとかが多い気がする。カナダは知らん。中国は多分人間が来ている気がしているがよくわかっていない。台湾は今回ログの範囲に含めたため初登場。韓国からのアクセスはなかったようだ。
| 国 | 件数 |
|---|---|
| BR | 425 |
| US | 358 |
| CA | 282 |
| CN | 276 |
| TW | 62 |
| SE | 16 |
| SG | 8 |
| NL | 4 |
| GB | 4 |
| DE | 4 |
| UA | 2 |
| SI | 2 |
| RU | 2 |
| MG | 2 |
| BE | 2 |
| VN | 1 |
| LU | 1 |
| BD | 1 |
| AD | 1 |
UAがNULLの国別
ブラジルからのアクセスに悪質なものが多かったことが推測できる。
| 国 | 件数 |
|---|---|
| BR | 424 |
| CA | 282 |
| US | 94 |
| UA | 1 |
アクセス先URL
圧倒的に有害なアクセスが増えていた。
| URL | 件数 |
|---|---|
| 無害なURL | 207 |
| 有害なURL | 1,075 |
集計クエリ
事後分析するためにデータをSQLiteに保存していたので、そのクエリ。実は1月のデータはTSVだったので、地味にコンバートに苦労したが、SQLiteクライアントがTSVからのインポートをサポートしていたので、引っかかったのはTSVのタイムスタンプがSat May 30 00:50:56 2026だったのを、DBのタイムスタンプのYYYY-MM-DD HH:mm:ssに変えるくらいだった。これはLLMに変換SQLを出してもらって良しなにしてもらった。
集計テーブルのDDL
CREATE TABLE "deny_log" (
"id" INTEGER,
"url" TEXT,
"country" TEXT,
"remote_addr" TEXT,
"user_agent" TEXT,
"timestamp" TEXT,
PRIMARY KEY("id" AUTOINCREMENT)
)
UA別
SELECT
T.UA,
COUNT(T.UA)
FROM
(
SELECT
CASE
WHEN user_agent IS NULL
THEN "NULL"
ELSE user_agent
END AS UA
FROM
deny_log
WHERE
timestamp < '2026-05-20'
) T
GROUP BY
UA
ORDER BY
COUNT(T.UA) DESC
国別
SELECT
country,
COUNT(country)
FROM
deny_log
WHERE
timestamp < '2026-05-20'
GROUP BY
country
ORDER BY
COUNT(country) DESC
UAがNULLの国別
SELECT
country,
COUNT(country)
FROM
deny_log
WHERE
timestamp < '2026-05-20'
AND user_agent IS NULL
GROUP BY
country
ORDER BY
COUNT(country) DESC
アクセス先URL
URLの善悪分類はエクセルを使って手動。
無害=robot.txtや記事URLなどの公開URL、有害=管理画面や何かのスクリプトのURLを叩いているもの。
SELECT
url,
COUNT(url)
FROM
deny_log
WHERE
timestamp < '2026-05-20'
AND (
url != '/'
AND url NOT LIKE '/0%'
)
GROUP BY
url
ORDER BY
COUNT(url) DESC
あとがき
元々はアクセス解析に出ないようにブロックするために集計していたが(robot.txtが尊重されるとか思ってないので)、善良なBOTの大半が海外IPで対応が面倒なのでいったんブロックはやめることにした。
将来的にはAnubis辺りを導入してWAFを掛けることで対応したいと思う。
あとこれをやってて思ったこととしてUAの中に自分が何者かを入れてくれてるクライアントは凄く親切だなと思った。
2026/05/26(火)直近でやりたいことリスト
投稿日:
やりたいことが多すぎて消化が追い付かない!
サイト運営周り
自作サーバー近隣
- 監視周りの整備
- OpenWrtのメトリクス集め
- データソースのセットアップはしたものの整備されてないGrafanaのダッシュボード整理
- 発報体制の整備
- 外形監視とステータスページの導入
- 自宅サーバーのリプレース
- Ubuntu -> Debian
- WAF(Anubis)の導入
- Claudflareより自由ソフトウェアだろ!
- かわいいし!
CMS開発回り
まずは何が欲しいのかの要件整理からしていかないといけない奴ら。
- adiary代替CMSの作成
- adiaryの基本機能は保ったままプラガブルでメンテナンスがしやすいCMSの作成
- MCP対応もしたい
- パフォーマンスはadiaryほどギチギチに詰めない予定
- CGI動作
- Markdown parserの全面刷新
- Wikiの作成
- 上記CMSの基盤を転用して整備したい
- PukiwikiがMarkdownで書けず、既存の改造品もしっくりこないため
- ブログには日々のログを、Wikiにはあとで見返す情報の集約を、というので役割分担をしたい
書きたいけど書けてない日記のネタを書く
全部書くかどうかはわからないが書いてないと忘れてしまいそうなのと、発生日が不明だと日付ベースで管理している行動メモから引き出せないのでメモっておく。
| ネタの発生日 | 内容 |
|---|---|
| 2025-10-25 | ゾンビランドサガ現地鑑賞 |
| 2025-10-31 | ゾンビランドサガ マンホール巡礼 |
| 2025-11-15 | 神戸→川崎のスーパー映画館はしご、チネチッタ突貫記 |
| 2025-11-21 | 伊万里湾大花火大会2025+マンホール回収 |
| 2025-11-29 | 去年、香川漆器を修理に出した話の続き、修理を受け取ってきたときの旅行記 |
| 2026-05-02 | 超かぐや姫!を観に高知に行った話 |
| 2026-05-02 | 超かぐや姫!感想2 |
| 2026-05-23 | 須磨浦山上遊園に行った話 |
ゾンサガの鑑賞録も書いてないが、これについては書くかどうかがとても怪しい。
旅行回り
それ以前にやりたいことが多すぎるため、いずれも優先度は低い。
- 姫路市立水族館でナマコを触りたい
- ナマコ触れる場所では恐らく三宮から最も近く、他だと和歌山や豊岡、玉野になってくる
- 冬雨文庫に行ってみる
- 岡山市・オランダ通りの古書店「よつば文庫」
- 鷲羽山ハイランドでバンジージャンプをする
2026/04/24(金)このサイトがブログである必要性について考えてみた その2
前回このサイトがブログである必要性について考えてみた訳だが、やはり過去の情報を引いたり更新しようとしたときにブログだと都合が悪いことも思った。
例えば私のブログにはセットアップ方法を書いた記事が、かなりの数あるが、時系列で並んでいるため探しづらい。
Ubuntuのセットアップ方法を読んだ後に、そこに書いていなかったSSHやGPGの設定方法を見ようとすると探すのが大変だ。一応現状でも相当量のタグをつけて記事を当てやすくしているが、当てやすくはあるもののタグを選ぶのが手間というのもある。
Wikiであれば階層構造にして似たものを寄せておけるから、その手間は少ないし、過去の記事を更新しても違和感は少ないと思う。
ただ読み物としてみたときに都合がいいのはブログだし、悩ましいところでもある。
似たことを考えている人は他にもいるようで、ググったら以下の記事がヒットした。
読んでいて思ったこととしてはブログに向くものはブログへ、Wikiに向くものはWikiに置くのがよいのではないかと思えてきた。
例えばマニュアルみたいなやつはWiki、日記や旅行記のようなものはブログというのは一つありかもしれない。その場合レシピもWikiだろう。
adiaryに思うところがあるところや、PukiwikiもMarkdownに対応していないし、他に思うところがないわけでもないので、一度これらを自前で作ってみてやるのも一つかもしれないなと思った。いや、ブログを自作することについては実は去年から構想だけはある。
一度落ち着いたタイミングで、この辺りも考えていきたいなと思うが、その境界も結構難しいとは思う。ブログでもやろうと思えばできるわけだし…。
例えばインデックス用の記事を置いてそこからぶら下げるというのは、記事の到達容易性を高めるための方策として一つあるだろうから、中々悩みどころではある。
実際記事とページが混在したブログは普通にあるし、WordPressにもその機能はある。adiaryにも実はある。
2026/04/20(月)このサイトがブログである必要性について考えてみた
このブログでは過去記事の更新を割とよくするし、個人的にタグなどを基に過去記事を引っかけて調べ物をすることがあるのだが、それならMECEな構成にしやすいWikiのほうがよく、ブログである必要はないのではないか?という疑問が、ふと浮かんだが、やっぱりブログでいいなと思った話。
確かにWikiにすれば階層構造にして、インデックスを張ることでブログと比べてMECE性を高めることができそうだし、一般的には履歴管理もできる。adiaryには履歴管理機能がないため、履歴管理ができるのはうれしい。
しかし逆説的に言えばブログはMECEでないことが売りではないかとも思った。Amazonの怪しい中華製品ではないが2026年版、2025年版だとか、Ubuntu 24, Ubuntu 22といった記事はスナップショット、つまり年輪として機能する。
Wikiの履歴で過去を探索するのは一般的に検索機能がなく、追いづらいし、見づらい。そう考えたときにMECEでないからこそ、過去のログとして機能させやすいのはブログではないかと思った。
もちろん、その代償として似た記事が多いと過去ログが追いづらいとか、情報が分散して追いづらい、流れる、ストック型ではなくフロー型に近いなどの欠点もある。
別にWikiでも2026年版、2025年版だとか、Ubuntu 24, Ubuntu 22といった記事は作れるので、Wikiでもいい気がするが、今のところはブログでいいかなと思った。そもそも編集者が一人しかいないサイトでWikiを採用している例は私の知る限り少ないし、標準化などを考慮の外に追いやったフリースタイルでやるのは構造に縛られづらいブログは最も向いているだろう。Wikiはツリー構造を変えようと思たっと気に大変だが、ブログにはそもそもツリーがない。
というわけで、深く考えるものでもないし、ブログでいいかというところに落ち着いた。
あとがき
Mastodonのほうもブログに近い運用をしており、それなりにタグを張って過去を見れるように管理していて、フロー性が高いものはMastodon、ストック性が高いものはブログという感じで書く先を分けていたりする。結果として、Mastodonで書いたことをブログにまとめてあげていることもしばしばあるので、この運用はうまく回っていると思う。
例えばMastodonは2025年8月20日に開始し、既に8,093投稿もあるが、このブログは2019年1月12日から起算して626記事[1]しかない。
これはMastodonだと開始日から今日までの一日平均の投稿数が33.30だが、ブログだと0.23になる。投稿頻度が昔と今で異なるので、ブログもMastodon同様に2025年8月20日から起算すると0.51投稿にまで増えるが、それでも投稿頻度には65.29倍ほどの差がある。
このことから、このブログはMastodonと比べたときに65.29倍ほどストック性が高いと言えるかもしれない。
- CMSの度重なるマイグレーションで吹き飛んだ記事数も考慮すると実際はもう少しあると思うが、それを考慮しても、なお少ないのは間違いない。 ↩


