スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
ConoHa VPS移設記/後日談/Ubuntu 26.04 LTS

proxy_httpの有効化漏れと、mathjax-nodeからの卒業

移設から1か月半。Apacheのエラーログに出た1行をきっかけに、数式SVG生成サーバー(mathsvg)まわりの2つの問題を片付けた。 1つは③で有効化し損ねたモジュール、もう1つは⑬で「後日対応」としていた非推奨ライブラリ。どちらも移設時の宿題が表に出てきた形になった。

作業日: 2026-10-30 / Node.js v24.16.0 / MathJax v4

01AH01144:数式が表示されない

appw.jpの数式を含む過去記事を開いたところ、数式部分が表示されない。Apacheのエラーログには次の警告が出ていた。

/var/log/apache2/error.log
[proxy:warn] AH01144: No protocol handler was valid for the URL /mathsvg (scheme 'http'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Apacheが/mathsvgへのリクエストをhttp://のバックエンド(Node.js製のmathsvgサーバー)へ転送しようとしたものの、 HTTP転送を担うモジュールが読み込まれていないため転送できなかった、という内容だった。

原因:③で有効化したモジュールの抜け

③Apache2で有効化したのはproxyとproxy_wstunnel(WebSocket用)までで、通常のHTTP転送を担うproxy_httpが抜けていた。 RAGシステムやMNISTのWebSocketサーバーはwss://への転送なので問題なく動いており、HTTPで転送しているmathsvgだけが失敗していた。 移設直後の全体確認では、この数式表示までは確かめきれていなかった。

転送先の形式必要なモジュール該当サービス
wss:// / ws://proxy_wstunnelRAG、MNISTのWebSocketサーバー
http://proxy_httpmathsvg
webm@新サーバー
$ sudo apache2ctl -M | grep proxy # proxy_http_module が無いことを確認 $ sudo a2enmod proxy_http $ sudo apache2ctl configtest $ sudo systemctl restart apache2
解決 数式が表示されるようになった。

02続けて出たDEP0176警告

mathsvgが動き出すと、今度はNode.jsの非推奨警告がログに出るようになった。

mathsvg の出力
(node:43025) [DEP0176] DeprecationWarning: fs.F_OK is deprecated, use fs.constants.F_OK instead

エラーではなく、処理自体は動いている。fs.F_OKという古い定数の書き方が非推奨になったという通知で、Node.js 24から実行時に表示されるようになった。 ただ⑰のtfjs-nodeでは、非推奨だったAPI(util.isNullOrUndefined)がNode.js側で削除されて突然動かなくなった経験がある。今のうちに出どころを突き止めることにした。

出どころを依存関係から辿る

自分のコードではfs.F_OKを使っていなかったため、node_modules内を検索した。

webm@新サーバー
$ grep -rln "fs\.F_OK" node_modules | head node_modules/pn/fs.js $ npm ls pn node@ /home/webm/node └─┬ mathjax-node@2.1.1 └─┬ jsdom@11.12.0 └── pn@1.1.0

pnはNode.js標準ライブラリをPromise対応に包み直す古い補助ライブラリで、fsの中身を一括でコピーする作りのため、 fs.F_OKを実際に使っていなくても触れた時点で警告が出る。持ち込んでいたのは、mathjax-nodeが内部で抱える古いjsdom@11だった。

⑬の宿題 mathjax-nodeは、⑬Node.jsの棚卸しで「mathjax v3以降でNode.js対応が本体に統合され非推奨」として後日対応にしていたもの。更新も数年前から止まっており、ライブラリ側の修正は期待できない。

03mathjax本体(v4)へ移行

package.jsonにはすでにmathjax(v4系)が入っていたため、mathsvgのコードをmathjax本体のAPIに書き換えた。 Express・MongoDBによるIDチェック・レスポンスの形(id・math・name・svg・err)は変えず、呼び出し側のページは無修正で済むようにした。

初期化

mathsvg2.js(変更前)
const mjAPI = require('mathjax-node'); mjAPI.start(); mjAPI.config({ MathJax: { } });
mathsvg2.js(変更後)
const mjReady = require('mathjax').init({ loader: { load: ['input/tex', 'output/svg'] }, startup: { typeset: false }, tex: { // TeXの構文エラーを赤字のSVGにせず例外にする formatError: (jax, err) => { throw err; } }, svg: { fontCache: 'local' } });

変換処理

mathsvg2.js(変更前)
mjAPI.typeset({ math: reqMath, format: "TeX", svg: true, }, function (data) { if (!data.errors) { resObj.svg = data.svg; ... } });
mathsvg2.js(変更後)
try { const MathJax = await mjReady; const adaptor = MathJax.startup.adaptor; const node = await MathJax.tex2svgPromise(reqMath, { display: true }); // <mjx-container> の中の <svg> だけを取り出す resObj.svg = adaptor.outerHTML(adaptor.firstChild(node)); resObj.err = ''; } catch (err) { resObj.svg = ''; resObj.err = 'Request fails.'; }
ポイント内容
Promise版の変換関数v4は大型化したフォントのデータを必要に応じて読み込むため、tex2svg()ではなくtex2svgPromise()が推奨
戻り値の形mathjax-nodeはSVG文字列を返したが、本体は<mjx-container>で包んだ要素を返す。中の<svg>だけを取り出して従来と同じ形にした
エラーの扱い本体の既定ではTeXの構文エラーが赤字のSVGとして描画される。formatErrorで例外にし、従来のdata.errorsと同じくerrを返すようにした
ディスプレイ数式mathjax-nodeのformat: "TeX"はdisplay: trueに相当
フォントv4は標準フォントがNew Computer Modernに変わり、見た目が以前と少し異なる

動作確認と依存の整理

appw.jpの数式記事で表示を確認したうえで、mathjax-nodeをアンインストールした。

webm@新サーバー
$ sudo supervisorctl restart mathsvg $ npm uninstall mathjax-node $ npm ls pn node@ /home/webm/node └── (empty)
解決 mathjax-node・jsdom@11・pnがまとめて依存から外れ、DEP0176の警告も出なくなった。

04振り返り

  • モジュールの有効化は「転送先の形式」で考える:proxyだけでは転送できず、http://ならproxy_http、ws(s)://ならproxy_wstunnelが別途必要。移設時はWebSocket系の確認で満足してしまっていた
  • 非推奨警告は早めに出どころを確認する:今は警告だけでも、Node.jsのバージョンアップで削除されれば突然止まる。npm lsで依存の連鎖を辿れば、直接使っていないライブラリでも特定できる
  • ⑬の残り宿題:request・jsdom-no-contextify・http/httpsの整理は、次にNode.jsを上げる前に片付ける予定
← 番外編 FTPサーバー再検討とLet's Encrypt自動更新
ConoHa VPS移設記 後日談

『ConoHa VPS移設記 後日談 proxy_httpとmathjax-node』を公開しました。