日2678.8.12-日 8:32

手元のノートPCに、遠くにある Linux-Kusanagi サーバーと同じ環境を構築し、Mediawiki をインストールし、Wikipedia 日本語版のクローンをつくってみた。

頻繁に途切れるネット接続に惱まされることなく、ローカルPCで開発できるようにする。

 

結構はまったのでまた嵌らないように、再現できるように手順を記録しておく。

 

最初のPC環境: NEC ノートPC LAVIE Direct HZ (PC-GN276W1AA)

Windows 10 Home

CPU Core™ i7-7500U 

SSD 500GB

メモリ 8GB

 

 

 

KUSANAGI for Vagrant のインストール

 

1.KUSANAGI for Vagrant をインストールする。

 

2. KUSANAGIの初期設定  

 

ここではまる。最初の

# yum --enablerepo=remi,remi-php56 update -y

 

で、エラーが大量に出て進まない。

これは

yum clean all

で解決。

Nginx, php7 を選択。

 

3. KUSANAGIのプロビジョニング

個別のドメインがヱブでアクセスできるようにする。WordPress もインストールできる。

 

今回はダウンロードしてきたMediaWikiをインストールするので、空の LAMP 環境を設定するだけ。

# kusanagi provision –lamp mywiki

4. MediaWiki のインストール

# cd /home/kusanagi/mywiki/DocumentRoot/
wget https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz
tar xvzf mediawiki-*.tar.gz
cd mediawiki*
mv * ../

これで、設定したドメイン名が mywiki.npn だとすると、

でアクセスできるようになる。

Mediawiki の設定+インストール画面が現れるので、最後まで進む。

 

警告: Unicode 正規化の処理に intl PECL 拡張機能を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。

Mediawiki のインストール画面の最初の方で、「警告: Unicode 正規化の処理に intl PECL 拡張機能を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。」

という警告が出る。

そのまま無視して次に進むこともできるが、この警告をなくすためには intl PECL 拡張機能 をインストールしてみる。

 

PHP intl が有効になっているかどうかを確認する。

# php -i | grep intl
intl
intl.default_locale => no value => no value
intl.error_level => 0 => 0
intl.use_exceptions => 0 => 0

このように表示されなくて、何も表示されなければ、intl は有効になっていないということ。

 

yum install icu libicu-devel

 

# php -v
PHP 7.2.8 (cli) (built: Jul 31 2018 12:48:51) ( NTS )

//現在のPHP7のバージョンに最適な intl 検索
# yum list | grep intl
php72-php-intl.x86_64                     7.2.8-1.el7.remi             @remi
intltool.noarch                           0.50.2-7.el7                 base
mintlocale.noarch                         1.4.4-1.el7                  epel
mintlocale-set-default-locale.noarch      1.4.4-1.el7                  epel
perl-libintl.x86_64                       1.20-12.el7                  base
php-aura-intl.noarch                      3.0.0-1.el7.remi             remi
php-intl.x86_64                           5.4.45-14.el7.remi           remi
php-symfony-intl.noarch                   2.8.42-1.el7.remi            remi
php-symfony3-intl.noarch                  3.4.12-1.el7.remi            remi
php-symfony4-intl.noarch                  4.0.11-1.el7.remi            remi
php54-php-intl.x86_64                     5.4.45-14.el7.remi           remi
php55-php-intl.x86_64                     5.5.38-8.el7.remi            remi
php56-php-intl.x86_64                     5.6.37-1.el7.remi            remi
php56u-intl.x86_64                        5.6.36-1.ius.centos7         ius
php70-php-intl.x86_64                     7.0.31-1.el7.remi            remi
php70u-intl.x86_64                        7.0.30-1.ius.centos7         ius
php71-php-intl.x86_64                     7.1.20-1.el7.remi            remi
php71u-intl.x86_64                        7.1.19-1.ius.centos7         ius
php72-php-intl.x86_64                     7.2.7-2.-1.el7.remi          remi
php72u-intl.x86_64                        7.2.7-2.ius.centos7          ius
php73-php-intl.x86_64                     7.3.0~alpha4-1.el7.remi      remi


//インストール
yum install php72-php-intl.x86_64

# php -i | grep intl

# updatedb
locate intl.so

/opt/remi/php72/root/usr/lib64/php/modules/intl.so

 

/opt/remi/php72/root/usr/lib64/php/modules/

の中に .so ファイルがいくつも生成されているから、現在の extension_dir を確認して、その下に全部移動する。

 

# php -i |grep extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718 => /usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718

# mv /opt/remi/php72/root/usr/lib64/php/modules/* /usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718/

# nano /etc/php7.d/php.ini

extension=intl.so   //この行を追加

 

これで再起動すれば intl が有効化されているだろう。

 

関連

CakePHP3でintl導入時につまずいた事 - Qiita
CakePHP3では動作環境にintlが無い、もしくは有効になっていないと動かせないので導入が必要。ちょっとつまずいた点をメモ書き。# PHP intlが有効かどうか確認まずこのコマンドで有効化されてるか確認。```vim...

 

関連

[PHP]pecl,phpize,extensionという単語を見て頭痛がするあなたへの処方箋 · DQNEO起業日記
<h2 id="はじめに">はじめに</h2><p>PHP Extension, pecl, phpize, php-config, *.so</p><p>これらの単語を見て頭が頭痛になったことはありませんか?pecl installがコケてm9(^Д^)プギャーってなったことはありませんか?私は...

 

ビジュアルエディタをメディアヰキ に追加

5.Visualeditor をMediaWiki に追加するために Parsoid をインストールする。

cd /opt
yum install git npm
git clone --recursive https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid/deploy
git clone https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid
cd parsoid
npm install

cp config.example.yaml config.yaml
nano config.yaml

この赤部分だけ自分のドメイン名に変えればよい。他の部分は

mwApis:
        - # This is the only required parameter,
          # the URL of you MediaWiki API endpoint.
          uri: 'http://mywiki.npn/api.php'
          domain: 'mywiki.npn' # optional

localsettings.js を設定する。

cp localsettings.example.js localsettings.js
vim localsettings.js

次の部分を編集する。

exports.setup = function(parsoidConfig) {
         // Do something dynamic with `parsoidConfig` like,
         parsoidConfig.setMwApi({
                 uri: 'http://mywiki.npn/api.php',
          });
 };

 

/etc/hosts を編集する。

nano /etc/hosts

192.168.33.10 mywiki.npn

Windows 10 のhosts ファイルも同様に編集すると、Windows のブラウザでアクセスできる。

 

C:\Windows\System32\drivers\etc\hosts

 

次に、再起動時に 起動するように parsoid.service を設定する

cd /etc/systemd/system/
nano parsoid.service

次の通り貼り付ける。

[Unit]
 Description=Mediawiki Parsoid web service on node.js
 Documentation=http://www.mediawiki.org/wiki/Parsoid
 Wants=local-fs.target network.target
 After=local-fs.target network.target
 
 [Install]
 WantedBy=multi-user.target
 
 [Service]
 Type=simple
 User=root
 Group=root
 WorkingDirectory=/opt/parsoid
 ExecStart=/usr/bin/node /opt/parsoid/bin/server.js
 KillMode=process
 Restart=on-success
 PrivateTmp=true
 StandardOutput=syslog

Parsoid service を起動する。

systemctl daemon-reload
systemctl start parsoid
systemctl enable parsoid

Parsoid の起動確認。

netstat -plntu

次のような行があれば正常に起動している。

tcp6 0 0 :::8000 :::* LISTEN 981/node

 

6.VisualEditor 本体をインストールする。

必ずしも最新版が動くとは限らない。それで嵌まるので注意。

MediaWiki のバージョンに合わせて、適合するバージョンのVisualEditor extension を選択せねばならぬ。

ここから取得するのが確実。

 

cd /home/kusanagi/mywiki/DocumentRoot/extensions
wget https://extdist.wmflabs.org/dist/extensions/VisualEditor-REL1_31-13a585a.tar.gz
tar -xzf VisualEditor-REL1_31-13a585a.tar.gz 

cd ../
nano LocalSettings.php

 

LocalSettings.php に次を追加する。

wfLoadExtension( 'VisualEditor' );
 // Enable by default for everybody
$wgDefaultUserOptions['visualeditor-enable'] = 1;

 // Optional: Set VisualEditor as the default for anonymous users
 // otherwise they will have to switch to VE
 // $wgDefaultUserOptions['visualeditor-editor'] = "visualeditor";

 // Don't allow users to disable it
$wgHiddenPrefs[] = 'visualeditor-enable';

 $wgVirtualRestConfig['modules']['parsoid'] = array(
     // URL to the Parsoid instance
     // Use port 8142 if you use the Debian package
     'url' => 'http://mywiki.npn:8000',
     // Parsoid "domain", see below (optional)
     'domain' => 'mywiki.npn',
     // Parsoid "prefix", see below (optional)
     'prefix' => 'mywiki.npn'
 );

 

全ファイルのオーナーを nginx:nginx に変更統一する。叉は kusanagi.kusanagi

chown -R kusanagi.kusanagi /home/kusanagi/mywiki/DocumentRoot

 

テスト

あらためて   http://mywiki.npn/

を開いてみる。

 

今の所、LocalSettings.php はこんな感じ。

<?php
# This file was automatically generated by the MediaWiki 1.31.0
# installer. If you make manual changes, please keep track in case you
# need to recreate them later.
#
# See includes/DefaultSettings.php for all configurable settings
# and their default values, but don't forget to make changes in _this_
# file, not there.
#
# Further documentation for configuration settings may be found at:
# https://www.mediawiki.org/wiki/Manual:Configuration_settings

# Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
        exit;
}


## Uncomment this to disable output compression
# $wgDisableOutputCompression = true;

$wgSitename = "mywiki";

## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs
## (like /w/index.php/Page_title to /wiki/Page_title) please see:
## https://www.mediawiki.org/wiki/Manual:Short_URL
$wgScriptPath = "";

## The protocol and server name to use in fully-qualified URLs
$wgServer = "http://mywiki.npn";

## The URL path to static resources (images, scripts, etc.)
$wgResourceBasePath = $wgScriptPath;

## The URL path to the logo.  Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
$wgLogo = "$wgResourceBasePath/resources/assets/daia.jpg";

## UPO means: this is also a user preference option

$wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO

$wgEmergencyContact = "mywiki@mywiki.npn";
$wgPasswordSender = "mywiki@mywiki.npn";

$wgEnotifUserTalk = true; # UPO
$wgEnotifWatchlist = true; # UPO
$wgEmailAuthentication = true;

## Database settings
$wgDBtype = "mysql";
$wgDBserver = "localhost";
$wgDBname = "enwiki2";
$wgDBuser = "mywiki";
$wgDBpassword = "mypasswdaaa";

# MySQL specific settings
$wgDBprefix = "";

# MySQL table options to use during installation or update
$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary";

## Shared memory settings
$wgMainCacheType = CACHE_ACCEL;
$wgMemCachedServers = [];

## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads = true;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";

# InstantCommons allows wiki to use images from https://commons.wikimedia.org
$wgUseInstantCommons = true;

# Periodically send a pingback to https://www.mediawiki.org/ with basic data
# about this MediaWiki instance. The Wikimedia Foundation shares this data
# with MediaWiki developers to help guide future development efforts.
$wgPingback = false;

## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
## available UTF-8 locale
$wgShellLocale = "en_US.utf8";

## Set $wgCacheDirectory to a writable directory on the web server
## to make your wiki go slightly faster. The directory should not
## be publically accessible from the web.


$wgCacheDirectory = "$IP/cache";
$wgUseFileCache = true;
$wgFileCacheDirectory = "$IP/cache";

$wgUseLocalMessageCache = true;
$wgCacheDirectory = '$IP/cache';

$wgJobRunRate  =  0.01;
$wgUseGzip = true;
$wgEnableSidebarCache = true;

$wgResourceLoaderMaxage = array(
    'versioned' => array(
        // Squid/Varnish but also any other public proxy cache between the client and MediaWiki
        'server' => 30 * 24 * 60 * 60, // 30 days
        // On the client side (e.g. in the browser cache).
        'client' => 30 * 24 * 60 * 60, // 30 days
    ),
    'unversioned' => array(
        'server' => 30 * 24 * 60 * 60, // 30 days
        'client' => 30 * 24 * 60 * 60, // 30 days
    ),
);


#開発時にキャッシュを無効にする
#$wgCachePages = false;
#$wgCacheEpoch = 'date +%Y%m%d%H%M%S';

# Site language code, should be one of the list in ./languages/data/Names.php
$wgLanguageCode = "ja";

$wgSecretKey = "3f1f2d6b93af7d3e8cc21a6b5c3eb29483db2919dfd170afc36d661a8018c7e4";

# Changing this will log out all existing sessions.
$wgAuthenticationTokenVersion = "1";

# Site upgrade key. Must be set to a string (default provided) to turn on the
# web installer while LocalSettings.php is in place
$wgUpgradeKey = "be5785e104b6d206";

## For attaching licensing metadata to pages, and displaying an
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
$wgRightsUrl = "https://creativecommons.org/licenses/by-nc-sa/4.0/";
$wgRightsText = "クリエイティブ・コモンズ 表示-非営利-継承";
$wgRightsIcon = "$wgResourceBasePath/resources/assets/licenses/cc-by-nc-sa.png";

# Path to the GNU diff3 utility. Used for conflict resolution.
$wgDiff3 = "/usr/bin/diff3";

# The following permissions were set based on your choice in the installer
$wgGroupPermissions['*']['edit'] = true;
## Default skin: you can change the default skin. Use the internal symbolic
## names, ie 'vector', 'monobook':

#if (preg_match("/(mobile|webos|opera mini)/i", $_SERVER['HTTP_USER_AGENT'])) {
#    $wgDefaultSkin = 'wptouch';
#} else {
    $wgDefaultSkin = 'vector';
#}

# Enabled skins.
# The following skins were automatically enabled:
require_once "$IP/skins/cavendishmw/cavendishmw.php";
#wfLoadSkin( 'cavendishmw' );
wfLoadSkin( 'MonoBook' );
wfLoadSkin( 'Timeless' );
wfLoadSkin( 'Vector' );
#wfLoadSkin( ‘WPtouch);

# Enabled extensions. Most of the extensions are enabled by adding
# wfLoadExtensions('ExtensionName');
# to LocalSettings.php. Check specific extension documentation for more details.
# The following extensions were automatically enabled:
wfLoadExtension( 'CategoryTree' );
wfLoadExtension( 'CheckUser' );
wfLoadExtension( 'Cite' );
wfLoadExtension( 'CiteThisPage' );
wfLoadExtension( 'ConfirmEdit' );
wfLoadExtension( 'Description2' );
wfLoadExtension( 'Gadgets' );
require_once "$IP/extensions/googleAnalytics/googleAnalytics.php";
require_once "$IP/extensions/HTMLets/HTMLets.php";
wfLoadExtension( 'ImageMap' );
wfLoadExtension( 'InputBox' );
wfLoadExtension( 'intersection' );
wfLoadExtension( 'Interwiki' );
#wfLoadExtension( 'LinkTitles' );
wfLoadExtension( 'LocalisationUpdate' );
wfLoadExtension( 'Lockdown' );
wfLoadExtension( 'Math' );
wfLoadExtension( 'MsCatSelect' );
wfLoadExtension( 'MultimediaViewer' );
wfLoadExtension( 'OATHAuth' );
wfLoadExtension( 'ParserFunctions' );
wfLoadExtension( 'PdfHandler' );
wfLoadExtension( 'Poem' );
wfLoadExtension( 'Renameuser' );
wfLoadExtension( 'ReplaceText' );
wfLoadExtension( 'SpamBlacklist' );
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
wfLoadExtension( 'TitleBlacklist' );
#wfLoadExtension( 'VisualEditor' );
wfLoadExtension( 'WikiEditor' );
wfLoadExtension( 'Scribunto' );
$wgScribuntoDefaultEngine = 'luastandalone';
wfLoadExtension( 'MassMessage' );

# End of automatically generated settings.
# Add more configuration options below.

$wgNamespacesWithSubpages[NS_MAIN] = 1;

#$wgLinkTitlesParseOnEdit = false; // 編集時に解析しない
#$wgLinkTitlesParseOnRender = true; // ページを表示したときに解析する
#$wgLinkTitlesFirstOnly = false; // リンク付けは1つだけ
#// 最初に見つけたワードにリンク付け
#$wgLinkTitlesWordStartOnly = false; // ワードの始めは区切り文字が必要
#$wgLinkTitlesWordEndOnly = false; // ワードの最後は区切り文字が必要
#$wgLinkTitlesMinimumTitleLength = 1;
#$wgLinkTitlesSmartMode = true;

wfLoadExtension( 'VisualEditor' );
 // Enable by default for everybody
$wgDefaultUserOptions['visualeditor-enable'] = 1;

 // Optional: Set VisualEditor as the default for anonymous users
 // otherwise they will have to switch to VE
 // $wgDefaultUserOptions['visualeditor-editor'] = "visualeditor";

 // Don't allow users to disable it
$wgHiddenPrefs[] = 'visualeditor-enable';

 // OPTIONAL: Enable VisualEditor's experimental code features
 #$wgDefaultUserOptions['visualeditor-enable-experimental'] = 1;

 $wgVirtualRestConfig['modules']['parsoid'] = array(
     // URL to the Parsoid instance
     // Use port 8142 if you use the Debian package
     'url' => 'http://mywiki.npn:8000',
     // Parsoid "domain", see below (optional)
     'domain' => 'mywiki.npn',
     // Parsoid "prefix", see below (optional)
     'prefix' => 'mywiki.npn'
 );

$wgShowExceptionDetails = true;
$wgShowDBErrorBacktrace = true;
$wgFileExtensions[] = 'svg';
$wgAllowTitlesInSVG = true;
$wgSVGConverter = 'rsvg';
$wgMaxShellMemory = 819200;
$wgMaxImageArea = 5e7;

 

Vagrant Kusanagi の容量を40GBから100GB に増量する

日本語版 Wikipedia のデータを全部取り込もうとするならば、ディスク容量は100GB以上は必要になる。

初期設定では40GBしかないので、これを最初から100GBに拡張しておく。ここでも嵌る。

まず、vmdk形式 から vdi形式にクローンする。

このサイトに準じて進める。

 

関連

Vagrant(Virtualbox)のディスク(ストレージ)容量を増やす方法 - Qiita
#経緯vagrantでのデータの同期にnfsを使用していましたが、途中でフリーズしてしまう現象が頻繁に起き、仕事になんねーということで、rsyncを使用してデータの同期を行うこととしました。すると、作業途中でディスクいっぱいにな...

 

次に、だいたい次のようなコマンドで拡張完了。

1438 l /dev/mapper/cl-root
1439 fdisk -l
1448 fdisk /dev/sda
1450 cat /etc/fstab
1471 lsblk
1472 df
1473 fdisk -l /dev/sda
1474 parted /dev/sda
1476 pvresize /dev/sda2
reboot
1477 pvs
1478 vgs
1479 lvs
1481 l /dev/cl/root
1482 lvextend -l +100%FREE /dev/cl/root
1483 lvdisplay -C
1484 lvs
1487 xfs_growfs /dev/mapper/cl-root

現在の状況。95GBになっている。

root@ # df
ファイルシス        タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/cl-root xfs         95G   82G   14G   86% /
devtmpfs            devtmpfs   2.4G     0  2.4G    0% /dev
tmpfs               tmpfs      2.5G     0  2.5G    0% /dev/shm
tmpfs               tmpfs      2.5G  8.6M  2.4G    1% /run
tmpfs               tmpfs      2.5G     0  2.5G    0% /sys/fs/cgroup
/dev/sda1           xfs       1014M  194M  821M   20% /boot
tmpfs               tmpfs      493M     0  493M    0% /run/user/0

 

関連

CentOS7で仮想Disk拡張後のLVM論理ボリューム拡張設定 - YOMON8.NET
AWSに仮想マシンアップロード後にEBS拡張に合わせてLVMの論理ボリューム(LV)の拡張をしたので作業メモ。 拡張前の状態 partedでパーティション切り直し LVM拡張設定 拡張前の状態 80GBのディスクがあるのに、全てのディスク領域が認識されず、14GBしか認識されていな...

Mediawiki に Wikipedia のデータを取り込む

 

7. ヰキペディアのデータをダウンロード

 

8.MWDumper のインストール

git clone https://phabricator.wikimedia.org/diffusion/MWDU/mwdumper.git
cd mwdumper
mvn compile
mvn package

 

 

9.データのインポート

そして

 

にある、このスクリプトの通りにするとよい。

コマンドラインで次々にコピペ 実行していけばよい。

# Dump SQL to disk in even sized chunks.  This takes about 80 Gb of hard drive space and 3 hours for enwiki.
# Setup the db to receive the chunks.  This takes a few seconds.
# Import the chunks.  This takes a few days for enwiki.
# Rebuild the DB.  This takes another day for enwiki.
# Run standard post import cleanup.  I haven't finished this step successfully yet but some of it can be skipped I think.

export DUMP_PREFIX=/public/datasets/public/enwiki/20130604/jawiki-20180720
export DIR_ROOT=/data/project/dump
export DIR=${DIR_ROOT}/enwiki
export EXPORT_PROCESSES=4
export IMPORT_PROCESSES=4
export DB=enwiki2
export EXPORT_FILE_SIZE=5
export EXPORT_FILE_SUFFIX_LENGTH=8
export LOG=~/log

bash -c 'sleep 1 && echo y' | mysqladmin drop ${DB} -u root
sudo rm -rf ${DIR}
rm -rf ${LOG}

sudo mkdir -p ${DIR}
sudo chown -R ${USER} ${DIR_ROOT}
mkdir -p ${LOG}

# Setup the db to receive the chunks.
mysqladmin create ${DB} --default-character-set=utf8 -u root
mysql -u root ${DB} < /srv/mediawiki/maintenance/tables.sql
mysql -u root ${DB} <<HERE
ALTER TABLE page
  CHANGE page_id page_id INTEGER UNSIGNED,
  DROP INDEX name_title,
  DROP INDEX page_random,
  DROP INDEX page_len,
  DROP INDEX page_redirect_namespace_len;
ALTER TABLE revision 
  CHANGE rev_id rev_id INTEGER UNSIGNED,
  DROP INDEX rev_page_id,
  DROP INDEX rev_timestamp,
  DROP INDEX page_timestamp,
  DROP INDEX user_timestamp,
  DROP INDEX usertext_timestamp,
  DROP INDEX page_user_timestamp;
ALTER TABLE text
  CHANGE old_id old_id INTEGER UNSIGNED;
HERE

 

そして、いよいよ巨大なデータをインポートするコマンドは:

java -server -classpath /home/kusanagi/mywiki/mwdumper/target/mwdumper-1.25.jar org.mediawiki.dumper.Dumper --output=mysql://localhost/enwiki2?user=root\&password=mypasswdxxx\&characterEncoding=UTF8 --format=sql:1.25 /home/kusanagi/mywiki/DocumentRoot/jawiki-20180720-pages-articles.xml.bz2

 

Mysql の設定ファイル編集 

これでエラーで失敗停止する場合は、 mysql の設定ファイルを次のように編集するとよい。

大型のデータを高速にインポートでいるように最適化。

Webmin で編集できる。

/etc/my.cnf.d/server.cnf

## /etc/my.cnf.d/server.cnf

[server]

# this is only for the mysqld standalone daemon
[mysqld]
server-id       = 1
sql_mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
character_set_server = utf8mb4
skip-character-set-client-handshake
max_connections = 900
thread_cache_size = 300
table_cache = 256
max_allowed_packet = 512M
query_cache_size = 128M
tmp_table_size = 32M
max_heap_table_size = 32M
thread_stack = 512K
wait_timeout = 31536000

key_buffer = 384M
sort_buffer_size = 256M
read_buffer_size = 256M
read_rnd_buffer_size = 256M
myisam_sort_buffer_size = 256M
open_files_limit = 100000

innodb_buffer_pool_size = 2G
#innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 512M
innodb_log_buffer_size = 32M
innodb_lock_wait_timeout = 50         # 50 default
# create a sepparate file for each InnoDB table
#innodb_file_format = Barracuda      #Removed: MariaDB 10.3.1  Default :Barracuda
innodb_file_per_table = 1
#innodb_large_prefix #Removed: MariaDB 10.3.1  Default ON (>= MariaDB 10.2.2)

innodb_flush_log_at_trx_commit = 2  #データの初期インポート時のみ
skip_innodb_doublewrite   #データの初期インポート時のみ
  
log-error = /var/log/mysql/mysqld.log
log-warnings = 1

slow_query_log = 1
slow_query_log_file = "/var/log/mysql/slow.log"
long_query_time = 5

#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.3 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.3]

[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 256M
write_buffer = 256M

[mysqlhotcopy]
interactive-timeout

[mysqldump]
max_allowed_packet=512M

 

/etc/my.cnf.d/mysql-clients.cnf  を編集する。

 

#/etc/my.cnf.d/mysql-clients.cnf
# These groups are read by MariaDB command-line tools
# Use it for options that affect only one utility
#

[mysql]
default-character-set = utf8mb4
no-auto-rehash

[mysql_upgrade]

[mysqladmin]

[mysqlbinlog]

[mysqlcheck]

[mysqldump]
quick
max_allowed_packet = 1000M

[mysqlimport]

[mysqlshow]

[mysqlslap]


 

これ以降はする必要があるのかよくわからない。

# Rebuild the DB
mysql -u root ${DB} <<HERE
CREATE TABLE bad_page AS 
  SELECT page_namespace, page_title, COUNT(*) AS count
  FROM page GROUP BY page_namespace, page_title
  HAVING count > 1;
UPDATE page, bad_page
  SET page.page_title = CONCAT(page.page_title, page.page_id)
  WHERE page.page_namespace = bad_page.page_namespace AND page.page_title = bad_page.page_title;
DROP TABLE bad_page;
ALTER TABLE page
  CHANGE page_id page_id INTEGER UNSIGNED AUTO_INCREMENT,
  ADD UNIQUE INDEX name_title (page_namespace,page_title),
  ADD INDEX page_random (page_random),
  ADD INDEX page_len (page_len),
  ADD INDEX page_redirect_namespace_len (page_is_redirect, page_namespace, page_len);
ALTER TABLE revision 
  CHANGE rev_id rev_id INTEGER UNSIGNED AUTO_INCREMENT,
  ADD UNIQUE INDEX rev_page_id (rev_page, rev_id),
  ADD INDEX rev_timestamp (rev_timestamp),
  ADD INDEX page_timestamp (rev_page,rev_timestamp),
  ADD INDEX user_timestamp (rev_user,rev_timestamp),
  ADD INDEX usertext_timestamp (rev_user_text,rev_timestamp),
  ADD INDEX page_user_timestamp (rev_page,rev_user,rev_timestamp);
ALTER TABLE text
  CHANGE old_id old_id INTEGER UNSIGNED AUTO_INCREMENT;
HERE

# Run standard post import cleanup
cd /srv/mediawiki
php maintenance/update.php

 

このサイトにあるように

(このサイトのコマンドをコピペすると、記号に全角文字が混じっていてエラーになるので注意 - ー ' ’ など)

 

検索エンジンのインデックスを構築するコマンドをすると、途中で止まってしまった。

$ php <Root directory of MediaWiki>/maintenance/rebuildall.php −−conf <Root directory ofMediaWiki>/LocalSettings.php

こんなエラーログで止まる。mysql の設定ファイルをいじって何度やっても同じエラー

Rebuilding index fields for 3816530 pages...
....
1910000
1910500
1911000
PHP Warning:  mysqli::query(): MySQL server has gone away in /home/kusanagi/mywiki/DocumentRoot/includes/libs/rdbms/database/DatabaseMysqli.php on line 46
PHP Warning:  mysqli::query(): Error reading result set's header in /home/kusanagi/mywiki/DocumentRoot/includes/libs/rdbms/database/DatabaseMysqli.php on line 46
[d01b2eff089723d495246bb9] [no req]   Wikimedia\Rdbms\DBQueryError from line 1457 of /home/kusanagi/mywiki/DocumentRoot/includes/libs/rdbms/database/Database.php: A connection error occured.
Query: SELECT  rev_id,rev_page,rev_text_id,rev_timestamp,rev_minor_edit,rev_deleted,rev_len,rev_parent_id,rev_sha1,rev_comment AS `rev_comment_text`,NULL AS `rev_comment_data`,NULL AS `rev_comment_cid`,rev_user,rev_user_text,NULL AS `rev_actor`,rev_content_format,rev_content_model,page_namespace,page_title,page_id,page_latest,page_is_redirect,page_len,old_text,old_flags  FROM `revision`,`page`,`text`    WHERE (page_id BETWEEN 1911000 AND 1911499) AND (page_latest = rev_id) AND (rev_text_id = old_id)
Function: RebuildTextIndex::populateSearchIndex
Error: 2006 MySQL server has gone away (localhost)

Backtrace:
#0 /home/kusanagi/mywiki/DocumentRoot/includes/libs/rdbms/database/Database.php(1427): Wikimedia\Rdbms\Database->makeQueryException(string, integer, string, string)
#1 /home/kusanagi/mywiki/DocumentRoot/includes/libs/rdbms/database/Database.php(1200): Wikimedia\Rdbms\Database->reportQueryError(string, integer, string, string, boolean)
#2 /home/kusanagi/mywiki/DocumentRoot/includes/libs/rdbms/database/Database.php(1653): Wikimedia\Rdbms\Database->query(string, string)
#3 /home/kusanagi/mywiki/DocumentRoot/maintenance/rebuildtextindex.php(106): Wikimedia\Rdbms\Database->select(array, array, array, string)
#4 /home/kusanagi/mywiki/DocumentRoot/maintenance/rebuildtextindex.php(76): RebuildTextIndex->populateSearchIndex()
#5 /home/kusanagi/mywiki/DocumentRoot/maintenance/rebuildall.php(48): RebuildTextIndex->execute()
#6 /home/kusanagi/mywiki/DocumentRoot/maintenance/doMaintenance.php(94): RebuildAll->execute()
#7 /home/kusanagi/mywiki/DocumentRoot/maintenance/rebuildall.php(67): require_once(string)
#8 {main}

 

このエラーの原因を特定する。

これは rebuildtextindex-2.php というファイル を作って、500 単位ではなく、1 個ずつ処理するようにすると、どこでエラーが発生しているのか特定できる。

 

<?php

require_once __DIR__ . '/Maintenance.php';

use Wikimedia\Rdbms\IMaintainableDatabase;
use Wikimedia\Rdbms\DatabaseSqlite;

/**
 * Maintenance script that rebuilds search index table from scratch.
 *
 * @ingroup Maintenance
 */
class RebuildTextIndex extends Maintenance {
	const RTI_CHUNK_SIZE = 1;

	/**
	 * @var IMaintainableDatabase
	 */
	private $db;

	public function __construct() {
		parent::__construct();
		$this->addDescription( 'Rebuild search index table from scratch' );
	}

	public function getDbType() {
		return Maintenance::DB_ADMIN;
	}

	public function execute() {
		// Shouldn't be needed for Postgres
		$this->db = $this->getDB( DB_MASTER );
		if ( $this->db->getType() == 'postgres' ) {
			$this->fatalError( "This script is not needed when using Postgres.\n" );
		}

		if ( $this->db->getType() == 'sqlite' ) {
			if ( !DatabaseSqlite::getFulltextSearchModule() ) {
				$this->fatalError( "Your version of SQLite module for PHP doesn't "
					. "support full-text search (FTS3).\n" );
			}
			if ( !$this->db->checkForEnabledSearch() ) {
				$this->fatalError( "Your database schema is not configured for "
					. "full-text search support. Run update.php.\n" );
			}
		}

		if ( $this->db->getType() == 'mysql' ) {
//			$this->dropMysqlTextIndex();
//			$this->clearSearchIndex();
			$this->populateSearchIndex();
//			$this->createMysqlTextIndex();
		} else {
//          $this->clearSearchIndex();
			$this->populateSearchIndex();
		}

		$this->output( "Done.\n" );
	}

	/**
	 * Populates the search index with content from all pages
	 */
	protected function populateSearchIndex() {
		$res = $this->db->select( 'page', 'MAX(page_id) AS count' );
		$s = $this->db->fetchObject( $res );
		$count = $s->count;
		$this->output( "Rebuilding index fields for {$count} pages...\n" );
		$n = 1911000;

		$revQuery = Revision::getQueryInfo( [ 'page', 'text' ] );

		while ( $n < $count ) {
			if ( $n ) {
				$this->output( $n . "\n" );
			}
			$end = $n + self::RTI_CHUNK_SIZE - 1;

			$res = $this->db->select( $revQuery['tables'], $revQuery['fields'],
				[ "page_id BETWEEN $n AND $end", 'page_latest = rev_id', 'rev_text_id = old_id' ],
				__METHOD__
			);

			foreach ( $res as $s ) {
				$title = Title::makeTitle( $s->page_namespace, $s->page_title );
				try {
					$rev = new Revision( $s );
					$content = $rev->getContent();

					$u = new SearchUpdate( $s->page_id, $title, $content );
					$u->doUpdate();
				} catch ( MWContentSerializationException $ex ) {
					$this->output( "Failed to deserialize content of revision {$s->rev_id} of page "
						. "`" . $title->getPrefixedDBkey() . "`!\n" );
				}
			}
			$n += self::RTI_CHUNK_SIZE;
		}
	}

	/**
	 * (MySQL only) Drops fulltext index before populating the table.
	 */
	private function dropMysqlTextIndex() {
		$searchindex = $this->db->tableName( 'searchindex' );
		if ( $this->db->indexExists( 'searchindex', 'si_title', __METHOD__ ) ) {
			$this->output( "Dropping index...\n" );
			$sql = "ALTER TABLE $searchindex DROP INDEX si_title, DROP INDEX si_text";
			$this->db->query( $sql, __METHOD__ );
		}
	}

	/**
	 * (MySQL only) Adds back fulltext index after populating the table.
	 */
	private function createMysqlTextIndex() {
		$searchindex = $this->db->tableName( 'searchindex' );
		$this->output( "\nRebuild the index...\n" );
		foreach ( [ 'si_title', 'si_text' ] as $field ) {
			$sql = "ALTER TABLE $searchindex ADD FULLTEXT $field ($field)";
			$this->db->query( $sql, __METHOD__ );
		}
	}

	/**
	 * Deletes everything from search index.
	 */
	private function clearSearchIndex() {
		$this->output( 'Clearing searchindex table...' );
		$this->db->delete( 'searchindex', '*', __METHOD__ );
		$this->output( "Done\n" );
	}
}

$maintClass = RebuildTextIndex::class;
require_once RUN_MAINTENANCE_IF_MAIN;

 

php rebuildtextindex-2.php

 

page というテーブルの  page_id 1911451 からエラーが発生していることが判明するので、このカラム行を削除する。

「スイーツ(笑) 」というタイトルの記事だった。これを削除する。

DELETE FROM `page` WHERE `page`.`page_id` = 1911451

phpMyAdmin で操作してもよい。

これでエラーがなくなって最後まで行けた。

 

phpMyAdmin のインストール

 

ここで phpMyAdmin を yum インストールしようとしたがエラーで進まなかった。

次の方法でやっとインストールできた。

1789 git clone https://github.com/phpmyadmin/phpmyadmin.git
     cd phpmyadmin
1790 composer update

//  composer が見つからないので新規インストールする。
1791 php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
1792 php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
1794 php -r "unlink('composer-setup.php');"
1804 php composer-setup.php --install-dir=/usr/bin --filename=composer
1805 updatedb
1809 cd phpmyadmin
1810 composer update
1812 composer create-project phpmyadmin/phpmyadmin
     mv ./phpmyadmin /home/kusanagi/mywiki/DocumentRoot/

 

これでヱブでアクセスできるようになる。

 

cd /home/kusanagi/mywiki/DocumentRoot/phpmyadmin
cp -af config.sample.inc.php config.inc.php
nano config.inc.php

config.inc.php を編集する。

ブラウザーで mywiki.npn/phpmyadmin/setup/

にアクセスし、設定ファイルを作成後、ダウンロードし、 config.inc.php にペーストする。

 

sql ファイルをインポート

次に、その他のテーブルのデータ、 sql ファイルをダウンロードしてインポート。

sql.gz を解凍。

 

gunzip ********.sql.gz

 

mysql -u root -pmypasswd enwiki2 < jawiki-20180720-category.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-categorylinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-change_tag.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-externallinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-image.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-imagelinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-iwlinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-langlinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-page_props.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-page_restrictions.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-pagelinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-protected_titles.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-templatelinks.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-wbc_entity_usage.sql
mysql -u root -pmypasswd enwiki2 < jawiki-20180720-geo_tags.sql

 

pagelinks.sql のインポートに時間がかかる。24時間以上。

 

 

こんな感じになった。

 

 

 

 

メディアヰキに特権ユーザーを追加する

このやり方だと、データーベースはまっさらな状態から築き上げるので、まだ管理者ユーザーは追加されていない状態である。

 

https://mywiki.npn/index.php?title=特別:アカウント作成

 

から第一号のアカウントを作ると、普通のユーザーになり、管理者特権はない。他のユーザーの権限を変更したりすることはできない。

 

そこで、LocalSettings.php に次の行を一時的に追加して、ログインしたユーザーならば誰でも管理者特権を得られるようにする。

 

// Implicit group for all logged-in accounts
$wgGroupPermissions['user']['move'] = true;
$wgGroupPermissions['user']['move-subpages'] = true;
$wgGroupPermissions['user']['move-rootuserpages'] = true; // can move root userpages
$wgGroupPermissions['user']['move-categorypages'] = true;
$wgGroupPermissions['user']['movefile'] = true;
$wgGroupPermissions['user']['read'] = true;
$wgGroupPermissions['user']['edit'] = true;
$wgGroupPermissions['user']['createpage'] = true;
$wgGroupPermissions['user']['createtalk'] = true;
$wgGroupPermissions['user']['writeapi'] = true;
$wgGroupPermissions['user']['upload'] = true;
$wgGroupPermissions['user']['reupload'] = true;
$wgGroupPermissions['user']['reupload-shared'] = true;
$wgGroupPermissions['user']['minoredit'] = true;
$wgGroupPermissions['user']['editmyusercss'] = true;
$wgGroupPermissions['user']['editmyuserjson'] = true;
$wgGroupPermissions['user']['editmyuserjs'] = true;
$wgGroupPermissions['user']['purge'] = true;
$wgGroupPermissions['user']['sendemail'] = true;
$wgGroupPermissions['user']['applychangetags'] = true;
$wgGroupPermissions['user']['changetags'] = true;
$wgGroupPermissions['user']['editcontentmodel'] = true;
// Implicit group for accounts that pass $wgAutoConfirmAge
$wgGroupPermissions['user']['autoconfirmed'] = true;
$wgGroupPermissions['user']['editsemiprotected'] = true;

// Users with bot privilege can have their edits hidden
// from various log pages by default
$wgGroupPermissions['user']['bot'] = true;
$wgGroupPermissions['user']['autoconfirmed'] = true;
$wgGroupPermissions['user']['editsemiprotected'] = true;
$wgGroupPermissions['user']['nominornewtalk'] = true;
$wgGroupPermissions['user']['autopatrol'] = true;
$wgGroupPermissions['user']['suppressredirect'] = true;
$wgGroupPermissions['user']['apihighlimits'] = true;
$wgGroupPermissions['user']['writeapi'] = true;

// Most extra permission abilities go to this group
$wgGroupPermissions['user']['block'] = true;
$wgGroupPermissions['user']['createaccount'] = true;
$wgGroupPermissions['user']['delete'] = true;
// can be separately configured for pages with > $wgDeleteRevisionsLimit revs
$wgGroupPermissions['user']['bigdelete'] = true;
// can view deleted history entries, but not see or restore the text
$wgGroupPermissions['user']['deletedhistory'] = true;
// can view deleted revision text
$wgGroupPermissions['user']['deletedtext'] = true;
$wgGroupPermissions['user']['undelete'] = true;
$wgGroupPermissions['user']['editinterface'] = true;
$wgGroupPermissions['user']['editusercss'] = true;
$wgGroupPermissions['user']['edituserjson'] = true;
$wgGroupPermissions['user']['edituserjs'] = true;
$wgGroupPermissions['user']['import'] = true;
$wgGroupPermissions['user']['importupload'] = true;
$wgGroupPermissions['user']['move'] = true;
$wgGroupPermissions['user']['move-subpages'] = true;
$wgGroupPermissions['user']['move-rootuserpages'] = true;
$wgGroupPermissions['user']['move-categorypages'] = true;
$wgGroupPermissions['user']['patrol'] = true;
$wgGroupPermissions['user']['autopatrol'] = true;
$wgGroupPermissions['user']['protect'] = true;
$wgGroupPermissions['user']['editprotected'] = true;
$wgGroupPermissions['user']['rollback'] = true;
$wgGroupPermissions['user']['upload'] = true;
$wgGroupPermissions['user']['reupload'] = true;
$wgGroupPermissions['user']['reupload-shared'] = true;
$wgGroupPermissions['user']['unwatchedpages'] = true;
$wgGroupPermissions['user']['autoconfirmed'] = true;
$wgGroupPermissions['user']['editsemiprotected'] = true;
$wgGroupPermissions['user']['ipblock-exempt'] = true;
$wgGroupPermissions['user']['blockemail'] = true;
$wgGroupPermissions['user']['markbotedits'] = true;
$wgGroupPermissions['user']['apihighlimits'] = true;
$wgGroupPermissions['user']['browsearchive'] = true;
$wgGroupPermissions['user']['noratelimit'] = true;
$wgGroupPermissions['user']['movefile'] = true;
$wgGroupPermissions['user']['unblockself'] = true;
$wgGroupPermissions['user']['suppressredirect'] = true;
# $wgGroupPermissions['user']['pagelang'] = true;
# $wgGroupPermissions['user']['upload_by_url'] = true;
$wgGroupPermissions['user']['mergehistory'] = true;
$wgGroupPermissions['user']['managechangetags'] = true;
$wgGroupPermissions['user']['deletechangetags'] = true;

// Permission to change users' group assignments
$wgGroupPermissions['user']['userrights'] = true;
$wgGroupPermissions['user']['noratelimit'] = true;

 

すぐに設定が反映されなかったら、再起動してみるのも良い。

 

https://mywiki.npn/index.php/特別:利用者権限

 

にアクセスし、既に作成したユーザー名を入力する。

そして、すべてのグループに所属チェックして保存する。

特権ユーザーに変身できたことを確認したら、LocalSettings.php から追加した行を削除しておく。

 

Special:NewItem 

 

 

データー充満で新システムに移行

 

検索が遅いので Elasticsearch を導入しようとして、インデックスの構築を始めたら100GBのディスク容量が一杯になって停止した。

それで再デスク容量の増加作業を兼ねて、Windows ノート PC 本体の500GBディスクを分割し、Linux デスクトップをインストールした。

約350GB を丸ごと開発環境として使えるようにする。

Linux デスクトップに移行中。

 

今後の課題

Wikipedia で使用されている Extensions をすべて追加して、少なくとも表示エラーが出ないようにする。

検索の高速化。 Mroonga か Elasticsearch か。

 

どのようなモジュール、拡張機能がインストールされているかはここでわかる。

 

https://ja.wikipedia.org/wiki/特別:バージョン情報

 

 

 

次の記事

カテゴリ別人気記事

カテゴリ別新着記事

サーバー カテゴリ最新記事

ABOUT作者

世界を旅して80余國。徒然書苦氣去。 Author

最近更新した記事

ランダムフォト

ランダムフォト