(20201115 作業メモ) kanaike を xubuntu 16.04 から ubuntu 20.04 へ更新

15 11月

研究室のブログを動かしているサーバーの OS 更新は何とか終了しました(以前の投稿)。その際,apache2,MySQL,phpmyadmin のインストールの件は書きました。今度は e-Learning の採点を担当しているサーバーの番です。先の投稿以降のことを書きます。

e-Learning の教材で,数式の自動採点をするための準備は,こちらの記事に書きました。STACK 3.3.3 を使った古いコードは,今回もそのまま使えそうです。

https の設定

古い記事を見ながら作業。

sudo apt install openssl

openssl はすでにインストールされていた。次に https を有効化する。

$ sudo a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2

次の default-ssl.conf は /etc/apache2/sites-available にある実際のファイル名に合わせる。

$ sudo a2ensite default-ssl.conf
Enabling site default-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2

ここで、apache2 再起動。

$ sudo /etc/init.d/apache2 restart
Restarting apache2 (via systemctl): apache2.service.

あとは、認証用のファイルの配置ですが、これは実際にサーバーを設置するときにやります。

apache と php の連携(日本語の利用)

maxima の出力を php で受けて,利用する場合,php がapache 上で動いている場合には,日本語を扱う場合に必要となる設定がありました。passthru の出力をクライアントに返すコードで日本語の出力ができません。端末で maxima を起動した場合には日本語の出力が端末上に表示されますし,またそれを端末で php から呼び出すような php コードでも maxima は日本語をちゃんと出力します。ただ同じ php コードを apache と連動させると,日本語が出力できません。下記を参考にして解決しました。

作業を記録します。/etc/apache2/envvars に追記します。

vi /etc/apache2/envvars
--
# export LANG=C (コメントアウト)
export LANG=ja_JP.UTF-8 (追記)

php の最大メモリ

以前記事に書いたのですが、動画をbase64からバイナリに戻すときにかなりのメモリーを必要とします。
/etc/php/7.4/apache2/php.ini の中の memory_limit を変更します。初期値は 128M でした。

memory_limit = 4096M

これは apache2 から呼び出されたときのみの設定値になるのかもしれない。

MathJax の設定

自分が以前書いた記事を読む。MathJax のサイトをみると、最新版(version 3)ではスクリプトを読み込むところの JavaScript の記述が異なっている。それではコンテンツへの変更が必要となるため、legacy バージョンを利用することにした。

これまでの記述:
<script type="text/javascript"
  src="https://kanaike.susi.oita-u.ac.jp/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML,local.js">
</script>

legacy バージョン(MathJax-legacy-v2.zip)が こちらに。設定は以前の記事と同じですが、再掲します。

ダウンロードしたファイルを /var/www/html/ で展開します。webフォントへのアクセスのために、その中にある fonts フォルダーに,下記のような .htaccess ファイルを置きます。

<filesMatch "\.(ttf|otf|eot|woff)$">
<ifModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</ifModule>
</filesMatch>

このファイルを apache が読めるようにするために,mod_rewite を有効にします。

a2enmod rewrite

(これは必要なのか,自信がないのですが)mod_headers を有効にします。

a2enmod headers

名称はそれぞれ環境で異なるかもしれませんが,apache の設定ファイル /etc/apache2/sites-enabled/000-default.conf を編集します。https 用(default-ssl.conf)もあわせて書き換えました。サイト全体で, .htaccess ファイルを有効にしています。

<directory /var/www/html/ >
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
</directory>

AllowOverride All のところかと思います。後は,apache を,再起動をして終了です。Edge でも上手く表示されました。

www フォルダー内のコンテンツを移動させる

これ以降は、このサーバー固有の話。一般的な話ではないので、私以外には役にたたない。必要なものだけ選択しながら、コンテンツを新しいサーバーに移動させ,修正を加える。

(1) ドキュメントルート直下に temporary、temporary2 フォルダーを作成して、所有者を www-data に変更する。

(2)author_3.0, author_3.1 を動くようにする。

採点用のコードにおいて、先に書いた php のバージョンアップに伴う修正を加える。変数の型変更に関する修正。適当に空白文字列で宣言した変数を、あとで配列として使用しようとすると、エラーとなるやつ。

phpseclib のインストール。pear の利用はもう推奨されないようだ。php と同時には、インストールされなくなっている(参照記事)。phpseclib を synaptic からインストールしようと思ったらすでに入っていた。ただし、使用方法は異なるようだ。クラス名も異なる。下記のような修正となった。コメントアウトしたほうが、以前の書き方である。

//include('Crypt/RSA.php');

include 'phpseclib/autoload.php';

//$rsa = new Crypt_RSA();

$rsa = new \phpseclib\Crypt\RSA();

権限を持つユーザーかどうかの判断をするところに関しての作業。データーベース等の準備をする。以前の author データーベース を復元し,それに関して権限をもつユーザーを作成する。認証用のコードがある /var/www/html/author フォルダーをコピーし,データベースに関する記述を更新した(パスワードなどの変更があった)。

(3)temporary フォルダーの中身を定期的に削除する設定(参考サイト)。以前は gnome の GUI プログラムを利用していたが、検索に引っかからなくなっていた。公式から落ちたようだ。そのため直接設定を記述する。

/etc/crontab を /etc/cron.d/ へ、適当な名前をつけてコピーする。拡張子無しのファイル名を付ける。

sudo cp ./crontab ./cron.d/newName

もともとファイルに記述されていた命令のリストを削除して(多分削除しないと二重になると思う)、例を参考に実行したいファイル(ここでは php ファイル)を指定する。参考サイトに注意点が多々ある。/bin/bash となっていることの確認や、スペースとタブの使い方が厳密であることなどである。下記は毎日12時ちょうどに実行する指定である。

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
0 0	* * *	root	php /var/www/html/xxx/xxxxx.php

(4)flash のコンテンツを動かすための設定。

nkf のインストール。synaptic から。

tex 関係。このサイトを参考にしてインストール。下記を synaptic からインストールした。

texlive-lang-cjk
texlive-fonts-recommended
texlive-fonts-extra
xdvik-ja

imagemagick を synaptic からインストール。ps, eps, png の取り扱いに関する設定をする(過去記事)。

しかし結局 flash のアプリは JavaScript で書き換えてしまったが,imagemagick を利用することには変わりないので上記の ps, eps, png の取り扱いに関する設定は必要である。imagemagick のバージョンによって設定ファイルの記述が異なる。

(5)オーサリングツールなど

MathJax の初期設定が異なる。今までは,このように設定していた。

MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\\\(','\\\\)']],
  processEscapes: true}
});

今回は,下記のように修正。バックスラッシュが2個減った。

MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']],
  processEscapes: true}
});

この修正が必要になった原因は何だろうか?後日,index.html から index.php へ最終的に格納したときに,再びバックスラッシュ4本に戻した。

ffmpeg のインストール。synaptic からインストールした。

NLmark では,暗号に関する修正は出てこなかった。正解の復号などは phpSimpleQuestion で終わっている。

以前からあったようだが,NLmark で解答一覧の表示用に JQuery EasyUI のグリッドを使っているが、動画で回答するような教材の場合に、そのグリッドに動画を埋め込むとき,(たぶん)大きなデータの埋め込みの際にエラーが生じて,グリッドが表示できていなかった。下記のように書いていた。a_ary の中に表示データが入っている。

dgrid_json = {"total":a_ary.length, "rows":a_ary};
$('#dg').datagrid({data : dgrid_json});

JQuery EasyUI を新しいバージョンに変更しても,そこは変わらなかった(表示に他の不具合が生じて元のバージョンに戻した)。それで,とりあえず一行のデータのみでグリッドを作成し,後は一つずつ追加するように変更した。これで表示は上手くいった。

dgrid_json = {"total":1, "rows":[a_ary[0]]};
$('#dg').datagrid({data : dgrid_json});

for (var i = 1; i < a_ary.length; i = i + 1) {
	$('#dg').datagrid('appendRow',a_ary[i]);
}

その際に気づいたことだが,NLsheet と NLmark で表示される回答が異なるようだ。NLsheet は個々人の最終回答を検索して,あてはまる回答を表示してくる。空白の回答も表示される。NLmark は回答種を表示する。回答が空白であるときには表示されない。動画で回答する教材では,NLmark も回答種ではなく個々人の回答なので,NLsheet で表示される回答者が NLmark には現れない場合があることに気づいた。

(20210401)

最終的な更新。e-Learning の採点サーバーを入れ替える作業。残った作業はサーバー証明書の配置と,データベースの移動である。他には,コードに書き込まれたサーバーアドレスの修正など。

サーバー証明書をどこに配置するかは,default-ssl.conf の記述に従った。仮に置かれているオレオレ証明書と同じ場所に配置した。

データーベースの移動は,phpmyadmin を使用した。MySQL のユーザーアカウントなどのシステム関連以外を選んでエクスポートした。これは比較的短時間で終了した。2GB程度の大きさである。次に,ubuntu20 側のデータベースの内容を,システム関連以外を削除する。その後,インポート。こちらは1時間以上かかる。しかしトラブルは今のところ見つかっていない。phpmyadmin の処理時間を長く設定していたのが効いている。

他に気づいた点としては,ubuntu20 のブートの際に,サーバー証明書を読むためのkeyを要求するようになっていた。打ち込んではみるが上手く行かない。間に合わないのかもしれないが失敗してしまう。結局起動したあとで,apache2 をリスタートして,その際にkeyを打ち込んでいる。

(20241031)
apache のバージョンを返さないように設定を変更する。/etc/apache2/conf-available/security.conf において

ServerTokens Prod
ServerSignature Off

上記へ変更する。