メニューを開く

2019/11/24

Apache ~ .htaccess設定方法と使い方 キャッシュ制御~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、キャッシュ制御について記事を書きます。
キャッシュ制御
  • mod_expiresモジュール
  • FileETagディレクティブ

Webページの表示速度を向上させる方法のひとつとして、ブラウザのキャッシュ制御があります。キャッシュを制御することで、応答時間の短縮やサーバーリソースが節約出来たりします。PageSpeed Insightsブラウザのキャッシュを活用する方法が記載されていますので参考にして下さい。

mod_expiresモジュール
このモジュールで、サーバーの応答のExpiresヘッダとCache-Controlヘッダのmax-ageディレクティブの設定を制御することができます。元のファイルが作成された時刻もしくは、クライアントのアクセス時刻のどちらかに基づいて有効期限を設定することができます。

Expiresヘッダの設定
記述例
<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access time plus 10 minutes"
  ExpiresByType text/html "access time plus 10 seconds"
  ExpiresByType image/jpg "access time plus 7 days"
                        ...
  ExpiresByType text/css "access time plus 1 month"
                        ...
</ifModule>
ExpiresActiveディレクティブ
ExpiresとCache-Controlヘッダを有効にするか無効にするかを決めます。Offに設定された場合には、ヘッダは生成されません。Onに設定された場合には、ヘッダはExpiresByTypeディレクティブとExpiresDefaultディレクティブの基準に従い文書にヘッダを追加します。ExpiresとCache-Controlヘッダの存在を保証する訳でなく、基準が満たされない場合にはヘッダは追加されません。

ExpiresDefaultディレクティブ
全てのドキュメントに対して、デフォルトの有効期限を設定できます。また、ExpiresByTypeディレクティブを使うことでタイプ毎に上書きすることができます。
構文
ExpiresDefault <code>seconds
<code> :基準時刻をファイルの最終修正時刻(M)にするか、クライアントのアクセス時間(A)にするかを指定
second  :有効期限の日時を設定するための基準時刻に追加する秒数を設定
             ExpiresActive On
             ExpiresDefault A2592000
FilesMatchディレクティブを使用することで拡張子を指定することができます。
<FilesMatch "\.(jpg|png|js|css|)(\.gz)?$">
  ExpiresDefault A2592000
</FilesMatch>

ExpiresByTypeディレクティブ
指定したタイプのドキュメントに対して生成されるExpiresヘッダとCache-Controlヘッダのmax-ageディレクティブの値を定義できます。
構文
ExpiresByType MIME-type <code>seconds
MIME-type:キャッシュしたいファイルの種類を指定
<code> :基準時刻をファイルの最終修正時刻(M)にするか、クライアントのアクセス時間(A)にするかを指定
second:有効期限の日時を設定するための基準時刻に追加する秒数を設定
Cache-Control:max-ageは期限切れの時刻からリクエスト時刻を引いた秒数で設定する。
ExpiresActive On
#pngファイルはアクセス日時から1ヶ月間有効
ExpiresByType image/gif A2592000
#HTMLファイルは最終更新日時から1週間有効
ExpiresByType text/html M604600

代替期間指定構文
ExpiresDefaultディレクティブとExpiresByTypeディレクティブは、下記の構文で定義できます。
構文
ExpiresDefault "<base> [plus] {<num> <type>}*"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"
base
 access:基準時刻をクライアントのドキュメントへのアクセス時刻にする
 now:'access’と同じ
 modification:基準時刻をファイルの最終更新時刻にする
plus
 plusキーワードは省略可能
num
 整数値
Type
 years
 months
 weeks
 days
 hours
 minutes
 seconds

Cache-Controlヘッダ 
Cache-Controlヘッダのmax-ageディレクティブを使いリソースの有効期限を設定することもできます。Headerディレクティブの引数にsetを指定することで応答ヘッダを設定します。Apacheモジュールmod_headers参照。
引数に空白文字が含まれている場合には、引数をダブルクォーテーションで囲む必要があります。
Header set header [value]
Cache-Controlヘッダは、HTTP/1.1仕様の1部として定義され、レスポンス、キャッシュ、ポリシーの設定に使用されていたヘッダーよりも優先されます。古いブラウザの中には対応しないものも存在します。
Cache-ControlとExpiresの両方を記述した場合には、Cache-Controlの設定が優先されます。
ExpiresActive On
Header set Connection keep-alive
<FilesMatch "\.(jpg|jpeg|png)$">
  Header set Cache-Control "max-age=2592000,public"
</FilesMatch>
<FilesMatch "\.(js|css)$">
  Header set Cache-Control "max-age=1209600,private"
</FilesMatch>
<FilesMatch "\.(html)$">
  Header set Cache-Control "max-age=600,must-revalidate"
</FilesMatch> 
public:どのキャッシュでもレスポンスを保存することを示す
private:レスポンスが1人のユーザーのものであり、キャッシュを共有保存しないことを示し、ブラウザのプライベートキャッシュはレスポンスを保存できます
must-revalidate:キャッシュに記録されているコンテンツが有効か否かをWebサーバーに必ず問い合わせます
no-cache:キャッシュしたものが有効か否かサーバーでの確認なしにキャッシュを利用しない
no-store:キャッシュしない

キャッシュを解除する方法
キャッシュの設定を行うと、有効期間内はブラウザのキャッシュを読み込むようになり、JavaScriptやCSSファイルを更新しても反映されないということが起こります。

クエリ文字列を付加する
キャッシュを有効にしながら、新しいファイルを強制的に読み込ませる方法の1つは、?で始まる適当なクエリ文字列をファイル名の末尾に加えます。こうすることで、ブラウザはそのクエリ付きのURLをまだ取得出来ていないファイルと認識して、キャッシュを読み込まずにサーバーからファイルを取得します。
<link rel="stylesheet" href="../css/style.css?20191124" type="text/css">
<script type="text/javascript" src="../js/base.js?date=20191124"></script>
<img src="image/gazou.jpg?20191124" alt="">
通常クエリ文字列を加える場合は、“?”の後に“name=value”の形式で付与しますが、キャッシュを解除する場合には、“name=value”の形式にする必要はありません。
PHPの場合には、filemtime()(../php/php_basic_04.php#filemtime)を使用すると便利です。
<?php
echo '<link rel="stylesheet" href="../css/style.css?' . filemtime('../css/style.css') . '">';
?>

URLを変更する
URLを変更するとブラウザはキャッシュは読み込まずにリソースを強制的に再取得します。実際のURLを変更するのではなく、HTMLの読み込み側のURLを変更します。例えば、style.cssをstyle.3210.cssに変更します。
<link rel="stylesheet" href="css/style.3210.css">
あわせて、.htaccessに下記のように“ファイル名.数値.拡張子”を“ファイル名.拡張子”にする修正を加えることで正しいcssファイルを読み込むようにする必要があります。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L] 

キャッシュさせない
Apacheからブラウザに強制的にキャッシュさせないようにするには、How To Prevent HTTP File Caching With .htaccessを参考に.htaccessを修正します。

FileETagディレクティブ
ETagは、サーバー上に存在するファイルとブラウザのキャッシュ内のファイルが一致するを判断するためのタグのことで、ブラウザからIf-None-Matchタグにこの値が付けられ、サーバー側でこの値とETagの値が異なればレスポンスコード200(OK)でコンテンツが送信され、同一なら304(変更なし)として処理されキャッシュを使用することでキャッシュの効率化、回線の帯域の節約ができます。

FileETagディレクティブは、ETag応答ヘッダフィールドを作成する時に使用するファイルの属性を設定します。詳細は、Apache コア機能 FileETag ディレクティブを参照して下さい。

負荷分散のためにWebサーバーが複数台ある場合には、ファイルが同一でもinodeがサーバー毎に異なるため200を返す可能性があり、inodeを使わないようにしたり、検証をしないように設定したほうが良いこともあるそうです。詳しくは、ブラウザキャッシュでパフォーマンス向上―負荷分散装置の落とし穴に注意-を参照して下さい。

Headerディレクティブを使用して、ETag応答ヘッダを削除する方法は、Apache モジュール mod_headers Header ディレクティブを参考に下記のように記述します。
Header unset ETag
FileETag None

Apache1.3.23以降では、サーバー側でETagをつけないことでETag比較を行わなく出来るそうです。
 FileETag None 

2019/09/07

Apache ~ .htaccess設定方法と使い方 エラーページ制御~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、エラーページ制御の使い方について記事を書きます。
エラーページ制御
  • エラーページの変更
エラーページの変更
ErrorDocumentディレクティブを使うことで、エラー発生時の表示方法を変更することができます。
  1. Apache標準のエラーメッセージを表示 
  2. 自分で作成したエラーメッセージを表示
  3. 自サーバー内のURL-pathへリダイレクトし、問題やエラーの処理
  4. 外部のURLへリダイレクトし、問題やエラーの処理
ErrorDocument error-code document
ErrorDocumentディレクティブは、HTTPのレスポンスコード、メッセージまたはURLを指定することで設定します。

1.Apache標準のエラーメッセージを表示
デフォルト設定なので、設定する必要はありませんが、”default”を設定することでApacheにハードコードされているメッセージを指定することができます。
ErrorDocument 404 /cgi-bin/err_urls.pl

<Directory /web/documents>
  ErrorDocument 404 default
</Directory>

2.自分で作成したエラーメッセージを表示
自分で作成したエラーメッセージを表示する場合は、documentに作成したメッセージをダブルクォートで括って指定します。
ErrorDocument 404 "Sorry, page not found."

3.自サーバー内のURL-pathへリダイレクトし、問題やエラーの処理
自サーバー内ので問題やエラーを処理する場合は、スラッシュで始まるドキュメントルートからの相対パスを指定します。
ErrorDocument 404 /page_not_found.html

4.外部のURLへリダイレクトし、問題やエラーの処理
httpなどで始まるURLを指定することで、外部URLで問題やエラーを処理することができます。
ErrorDocument 404 http://sample.exanple.com/cgi-bin/page_not_found
 

2019/06/08

ホームサーバー ~libcryptの古いバージョンへの依存~

ホームサーバーで、運用しているWordPressブログサイト、MataKitena BlogがFedora30へのアップグレードで、またまた起動できなくなったトラブル対応の続きです。今回も、またWebサーバーのapacheを起動させてみたら...何やらライブラリに存在しないものがあると、エラーメッセージを出力して異常終了していました。その解決策をここに残しておきます。

WordPressブログが起動できない原因は

今回も、WordPressブログがどうして起動できないのか調べて分かったことは、データベースであるMySQLは起動出来ているということ。そして、Webサーバーのapacheを起動させてみたら...何やらライブラリに存在しないものがあると、エラーメッセージを出力して異常終了しているようです。これで、原因がはっきりしました。libcrypt.so.1が存在しないので、Webサーバーが異常終了してしまいWordPressブログが起動出来ないのです。
出力されたエラーメッセージの一部
...error while loading shared libraries:libcrypt.so.1: cannot open shared object file: No such file or directory...

対応方法は...

今回の原因は、今使っているミドルウェアなどの中に、libcryptの古いバージョンに依存しているものが存在するためです。Fedora30には、このライブラリの更新されたバージョンが含まれていますが、とりあえずlibcryptの古いバージョンに依存したミドルウェアなどを実行させるために、パッケージをダウングレードさせることも可能ですが、他のミドルウェアなども不安定になってしまう可能性があるので、libcryptx-compatと呼ばれるパッケージをインストールすることにしました。
libcryptx-compatのインストール方法
sudo dnf install libxcrypt-compat 

2019/06/02

ホームサーバー 〜Fedora30 grubブートメニューが表示されない〜

Fedora29からFedora30へのアップグレード時、grubブートメニューが表示されずOSが起動出来なくなった件について対応が完了しましたので、記事に対処方法をまとめておきたいと思います。Fedora29へのアップグレード以降、トラブルが続いているホームサーバー、今回のアップグレードでも、またトラブルが発生しました。

トラブルの概要

Fedora29のアップデート完了後、Fedora30へのアップグレードを開始...ダウンロードが完了し、再起動後にインストールが始まるというメッセージを確認して、直ぐに再起動を実施しました。いつものgrubブートメニューが表示されて、アップグレードが完了と思っていたのですが。こんなメッセージと共に、grubプロンプトというものが表示されました。
    Minimal BASH-like line editing is supported. For the first word,
    TAB lists possible command completions. Anywhere else TAB lists
    possible device or file completions. ESC at any time exits.

grub>
この場合は、grubブートメニューを表示するためのGRUB2は正常に起動している状態で、モジュール や/ boot/grub/ディレクトリに格納されている他のモジュールをロードしたが、grub.cfgファイルが見つからなかったことを意味するそうです。他にも、grub rescueプロンプトというものを表示する場合もあるそうです。こちらの場合には、normal.mod が見つからなかったことを意味するそうで、どちらの場合も、ブートに関連するファイルが存在しないことを意味します。
参考までに、トラブル発生時、キーボードの認識がJISキーボードでなく、USキーボードになっていて思ったように文字入力ができない事象も発生していました。同じ事象の場合には、USキーボードの配列を参照しながら文字入力することで対処できます。

どんな対処方法があるの

大きくは、3通りほど存在するようです。1つは、OSのLiveDVDやLiveUSBから起動して環境を修復する方法。もう1つは、grubコマンドを使用して、応急処置を施しOSを起動。その後、恒久的な対処を実施する方法。そして最終手段、GRUB2のレスキューディスク(いくつか種類がありました。)を使って環境を修復する方法。今回は、この3通りのうち、grubコマンドを使用して、応急処置を施しOSを起動。その後、恒久対処を実施する方法でしか対処することができませんでしたので、こちらの方法を記事にしています。
他の2つの方法で対処することができなかったのは、USBブートがサポートされていない古いパソコンで、DVDRAMを搭載しているにも関わらず、CDは認識できるがDVDを認識できないという特殊な環境であるからです。

実際の対処は

インターネットで、たくさんの情報を参考にしましたがGRUBのバージョン、利用している環境(ディスク構成やUEFI、複数OSのマルチブートなど)で実行コマンドやパラメータを変える必要がありますので、本記事を参考にすることはできると思いますが、注意しながら、自分自身で判断して対処を実施して下さい。

まずは、lsコマンドでドライブの構成やパーティションなどを確認します。
最初は、ドライブの構成からです。
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1)

参考
hd0,1:sda1 hd1,0:sdb1
hd0,2:sda2 hd1,1:sdb2
gpt:Globally Unique Identifiers Partition Table
msdos:MS-DOS Master Boot Record
次に、パーティションの構成です。
最後にスラッシュをつけるのを忘れないように...
/bootパーティション。本来のgrub.cfgファイルの格納ディレクトリgrubとかgrub2を含んだパーティションを探します。
grub> ls (hd0,1)/
... grub2 ...
searchコマンドで検索する方法もあります。
バックアップを作成してりすると複数見つかる場合もあります...
grub> search --file /grub2/grub.cfg
hd0,msdos1
見つかりましたので、rootを設定します。
set root=(hd0,msdos1)
grub.cfgファイルを読み込みます。
自分で作成しておいたバックアップファイルを読み込ませたい場合には、バックアップファイルを指定することもできます。
configfile /grub2/grub.cfg
ドライブ上のGRUBからメニューが表示され、起動するOSを選択することで起動することができました...慌てないでください。まだ、恒久対処を実施していません。
恒久対処として、GRUBの修復を行います。
grub-installコマンドで指定するのは、パーティションでなく、ドライブのブートセクタなので注意してください。再起動したら、恒久対処の完了です。
# sudo update-grub
Generating grub configuration file ...
 ~
done
# grub-install /dev/sda
Installing for i386-pc platform...
 ~
Installation finished. No error reported.

2019/05/18

Apache ~ .htaccess設定方法と使い方 セキュリティ関連~

.htaccessファイルは、分散設定ファイルとも呼ばれ、Webサーバーの挙動を設定することができるファイルのひとつで、WebサーバーとしてApacheが使用されていて、管理者が.htaccessファイルの設置を許可していれば使用することができます。

設定方法


Apacheは、http.confにディレクティブという命令を記述することで設定しますが、http.confは管理者にしか編集できなくなっています。それに対して、.htaccessファイルは各ユーザーがディレクトリ単位に設定することができます。ファイルの構文は、主設定ファイルのhttp.confファイルと同じです。
注意事項
  • 基本的に、http.confファイルにアクセスできない場合以外は極力使用しない
  • FTPで転送する場合、ASCIIモードまたは、テキストモードを使用する
  • Windowsで編集する場合、一旦htaccess.txtなどに置き換え、サーバーに配置後にリネームする
  • 設置されたディレクトリと配下ディレクトリ全てに影響する
  • 構文誤りや管理者が許可していないディレクティブを使用した場合、該当ディレクトリ配下のファイルアクセスが、500 Internal Server Errorになる
  • 最終行には、改行を入れる

使い方

いろんな使い方ができるみたいですが。ざっくりとですが、こんなことができるみたいです。勉強しながら少しずつ記事にしていきたいと思っています。

使い方概要
  • セキュリティ関連
  • エラーページ制御
  • キャッシュ制御
  • ページ表示の高速化
  • 多言語対応
今回は、セキュリティ関連の使い方について記事を書きます。
セキュリティ関連
  • ディレクトリの内容を表示させない
  • ファイルへのアクセス制限
  • ディレクトリへのアクセス制限
  • パスワード(ベーシック)認証
  • DirectoryIndex

ディレクトリの内容を表示させない 
URIにスラッシュで終わるアクセスがあった場合、index.htmlなどのデフォルトで表示するファイルがない時、ディレクトリのファイル一覧が表示されてしまいます。
Optionsディレクティブを使用することで、ディレクトリのファイル一覧を表示させないように設定できます。
Options -Indexes
Optionsディレクティブは、どのサーバー機能を特定のディレクトリで使用可能とするかを制御します。⁺は元の設定に追加、‐は元の設定から削除します。上位ディレクトリで指定した設定は原則として下位ディレクトリまで適用される。下位ディレクトリで、Optionsディレクティブ設定をした場合、⁺は設定を有効に、‐は設定を無効に、そして±を省略した場合には新規に設定が適用されます。

Optionsディレクティブに指定できる値
All :MultiViewsを除いて全ての機能が有効になる
ExecCGI :mod_cgiによるCGIスクリプトの実行を許可する
FollowSymLinks :ディレクトリ内でシンボリックリンクをたどれる
Includes :mod_includeが提供するSSIを有効にする
IncludesNOEXEC :SSIを有効にするが、#exec、#execCGIは無効になる
Indexes :URLがディレクトリにマップするリクエストでDirectoryIndexで指定したファイルがディレクトリ内に存在しなければmod_autoindexがディレクトリ内の一覧を返す
MultiViews :mod_negotiationによるコンテントネゴシエーションされた言語ネゴシエーション機能を有効にする
SymLinksIfOwnerMatch :シンボリック先のファイルまたはディレクトリが、シンボリックの所有ユーザーIDと同じ場合にだけ、シンボリックリンクをたどれる
None : 全ての機能を無効にする
レンタルサーバーによっては、管理者によってOptionsディレクティブが使えないように制限されている場合があります。その場合には、次のようにすることでディレクトリ一覧を表示ができないようにできます。
IndexIgnore *
ファイルへのアクセス制限
FilesディレクティブやFilesMatchディレクティブで特定のファイルにアクセスできないようにアクセスを制限することができます。Filesディレクティブのブロック内に記述した設定をfilenameで指定したファイルにのみ適用します。ファイル名またワイルドカード文字列で指定することができます。下記の例は、Filesディレクティブを用いて、特定のIPアドレス(10.10.10.*)のみfilenameで指定したファイルへの全アクセスを許可する例です。
<Files filename> Order Deny,Allow Deny from all Allow from 10.10.10.*</Files>
FilesMatchディレクティブのブロック内に記述した設定を正規表現に一致するファイル名に適用します。下記の例は、FilesMatchディレクティブを用いて、.htaccessまたは.htpasswdファイルへの全アクセスを拒否する例です。
<FilesMatch "^\.(htaccess|htpasswd)$"> deny from all</FilesMatch>
ディレクトリへのアクセス制限
ディレクトリへのアクセス制限を行うには、deny from allと記載した.htaccessファイルを制限したい特定ディレクトリに配置します。下記の例は、特定ディレクトリへの全アクセスを拒否する例です。
 deny from all
パスワード(ベーシック)認証
パスワード認証を行うには、.htaccessファイルの他に.htpasswdファイルという、ユーザー名とパスワードを記載したファイルを用意します。特に指定をしなければ、.htaccessファイルを配置した特定ディレクトリ配下の全ファイルが認証対象になります。下記の例は、特定のファイル(pw-login.phpファイル)にのみパスワード認証を設定し、/home/XXXディレクトリに配置した.htpasswdファイルのユーザーIDとパスワードが一致すれば記述されているユーザーを許可する例です。
<Files pw-login.php> AuthType Basic AuthUserFile /home/XXX/.htpasswd AuthGroupFile /dev/null AuthName "Login Passwd Input" Require valid-user</Files>
DirectoryIndex
URIをスラッシュで終わるアクセスがあると、そのディレクトリにあるindex.htmlが呼ばれます。DirectoryIndexディレクティブを使用することで、デフォルトファイルを異なるファイルに変更できます。下記の例は、スラッシュで終わるアクセスがあった場合、記載した複数のリインデックスファイルのうち、先に記載したファイルから優先して呼ぶ場合の記述例です。全てのリインデックスファイルが見つからない場合は、ディレクトリのファイルリストを表示し、ディレクトリ一覧の表示が許可されていない場合には、403 Forbiddenになります。
DirectoryIndex index.html index.htm index.php index.cgi

2019/03/25

ホームサーバー 〜Fedora29 アップデート失敗⁈〜

つい先日、アップグレード失敗対応が終わったばかりのホームサーバーにOSのアップデートがありました。ちょっと不安な気持ちになりながらも、今ならシステムもデータベースもWordPressもバックアップがそのまま使える...ということで、思い切ってOSのアップデートを実施しましたが...

嫌な予感的中

OSのセキュリティ・アップデートやブラウザなどのアップデートなど、全部をまとめてアップデート...再起動..............................また、起動できない...エラーメッセージが表示されました。なんじゃこりゃあ。(* ´艸`)クスクス 笑ってる場合じゃないんだけど。
よく見てみると、journalctlってタイプしてsystem logを見ろといってるみたいなので、コマンドを入力するとシステムログが表示されます。
エラーメッセージ
Generating “/run/initramfs/rdsosreport.txt”

Entering emergency mode. Exit the shell to continue.
Type “journalctl” to view system logs.
You might want to save “/run/initramfs/rdsosreport.txt” to a USB stick or /boot after mounting them and attach it to a bug report.

システムログの確認

表示されるシステムログは、問題のある箇所が赤字で表示されますので、注意しながら見ていると直ぐに問題箇所を見つけることができます。ファイルシステムが壊れていて正常に認識できていないみたいです。
問題箇所
fsck failed .........
 ~中略~
Failed to start file System Check on ファイルシステム

ファイルシステムの修復

ファイルシステムのチェックと修復を行うfsckというコマンドを使って、ファイルシステムの修復を試みます。オプションには、障害発生時に修正する場合に利用が推奨されている。-fオプション(ファイルシステムがクリーンな場合でも全てのチェックを行う。)を指定します。コマンド実施後、何度か確認を求められるので、何度もyを入力するのが面倒な方は、修正箇所が見つかった場合に実行者に確認せずに修正を行う。-yオプションも併せて指定すると良いと思います。ファイルシステムの部分には修復するファイルシステム...つまり、システムログの確認で問題箇所として特定したファイルシステムを指定システムを指定してコマンドを実行。修復が完了したら、再起動して作業が完了です。
ファイルシステムの修復
fsck -fy ファイルシステム
今回は、この方法でリカバリーできましたが、必ずリカバリーできるものではないので、自分で運用、保守をしている方は、定期的にバックアップを取ったり、システムに変更を加えた時にバックアップを取ったりして、いざという時に備えるようにして下さいね。

2019/03/17

ホームサーバー 〜WordPressブログ バックアップ/リストア〜

以前、レンタルサーバーのCPU使用制限超過でリダイレクトされてしまった時には、WebサーバーもWordPressブログも起動出来ていたので、phpAdminでWordPressデータベース全てのバックアップを取りましたが、今回はWebサーバーもWordPressブログもPHPも動いていない状況です。そして、ホームサーバーなのでFTPは使わずに直接外付けディスクを接続してWordPressブログのWebページをバックアップできます。

データベースバックアップ/リストア

最初にデータベースのバックアップを取ります。ホームサーバーなので外付けディスクを直接接続して、転送容量を気にせずにバックアップを取ることができるので、念のため全データベースのバックアップを取ることにします。何度も調べなくて良いように、特定のデータベースをバックアップ/リストアするコマンドも残しておくことにします。
MySQLデータベースバックアップ
特定のデータベースのみバックアップする場合
mysqldump --single-transaction -u ユーザー名 -p DB名 > 出力ファイル名

全データベースをバックアップする場合
mysqldump --single-transaction -u ユーザー名 -p -x --all-databases > 出力ファイル名

MySQLデータベースリストア
特定のデータベースのみリストアする場合
mysqldump -u ユーザー名 -p DB名 < バックアップファイル名

全データベースをリストアする場合
mysqldump -u ユーザー名 -p < バックアップファイル名

 WordPressブログバックアップ/リストア

次にWordPressブログのバックアップです。こちらも、転送容量を気にせずにバックアップを取ることができるので、念のため全データのバックアップを取ることにします。あちこち見ないで良いように、最低限のデータをバックアップ/リストアする方法も残しておくことにします。リストアは、各ディレクトリにバックアップしたデータを上書きすれば良いのですが。
WordPressブログバックアップ
最低限のデータのみバックアップする場合
1.~/wp-config.php
2.~/wp-content/plugin/   ⇒ プラグイン格納
3.~/wp-content/themes/ ⇒ テーマ格納
4.~/wp-content/uploads/ ⇒ アップロードデータ格納

全データをバックアップする場合
WordPressのインストールディレクトリ配下の全データ
データベースのリストアでなく、WordPressのエクスポート機能で出力したXMLファイルをインポート機能でリストアする場合は、以前、使用していたテーマ、プラグインを有効にし、以前と同じパーマリンク設定をしてから、XMLファイルをインポート機能でリストアして下さい。正しく記事が復元されないのでくれぐれも注意して下さい。

使用していたテーマ、プラグイン、以前と同じパーマリンク設定が思い出せなくても手間は掛かりますが、最後の手段が有ります。MySQLのバックアップデータやWordPressのエクスポート機能で出力したXMLファイルは、テキストエディターで開くと記事の内容を読み取ることが出来るので、コピー&ペーストなどで復元することが可能です。

ただし、データベースのバックアップには、記事の履歴(修正の度に保存される各リビジョンのデータ)も含まれていますので、最新の情報を見るようする必要があります。

2019/03/09

ホームサーバー 〜WordPressブログ トラブル復旧〜

ホームサーバーで、運用しているWordPressブログサイト、MataKitena BlogがOSのアップグレード失敗で起動できなくなったトラブル対応の続きです。今回は、Webサーバーのapacheが起動出来て、無事にWordPressブログが起動出来たので、原因と対応方法を記事に残しておきます。データベースのバックアップとリストアについては次回記事にしますね。

WordPressブログが起動できない原因は

WordPressブログがどうして起動できないのか調べて分かったことは、データベースであるMySQLは起動出来ているということ。そして、Webサーバーのapacheを起動させてみたら...何やらPHPのライブラリに存在しないものがあると、エラーメッセージを出力して異常終了しているようです。これで、原因がはっきりしました。libnsl.so.1が存在しないので、Webサーバーが異常終了してしまいWordPressブログが起動出来ないのです。後は、インターネットで情報を探して対応すれば起動できそうです。
出力されたエラーメッセージの一部
...Cannot load modules/libphp7.so into server: libnsl.so.1: cannot open shared object file: No such file or directory...

そして、対応方法を探しに...

こういうことを調べている時に多いのですが、エラーメッセージをコピー&ペーストして検索すると英語のページがたくさん見つかるんです。英語が苦手な方は挫折しそうになっても、もうちょっと頑張って下さい。ここで、Google翻訳の出番です。検索結果のページを丸ごとか、部分的に翻訳すればほとんど日本語になった文書に翻訳されます。下記が、検索結果の中で1番解り易そうなページの要約です。なるほど...
発見した情報
Fedora 28以降で、msendユーティリティを使用しようすると、libnsl.so.1がnot foundと表示されるとのこと。
その原因は
Ferdoa 28以降、libnslパッケージはデフォルトでは含まれなくなり、libnsl2のみになったとのこと。
その対応方法は
後方互換性があるはずなのでlibnsl2ライブラリをlibnslにソフトリンクをしてみるか、libnslをインストールすればいいとのこと。 
ということは...利用しているOSが32bit、64bitのどちらかによって下記のコマンドでインストールできます。MataKitena Blogは、32bitなので、”dnf install libnsl”を実行してコマンドからWebサーバーのapatchを起動...起動完了です。念のため、システム起動時に自動起動されるかも確認しましたが、問題なく起動できました。
libnslのインストール方法
32bit OSの場合:dnf install libnsl
64bit OSの場合:dnf install libnsl.i686


2019/03/03

ホームサーバー 〜WordPressブログ システムバックアップ〜

ホームサーバーで、運用していたWordPressブログサイト、MataKitena BlogがOSのアップグレード失敗で起動できなくなったトラブル対応の続きです。システムバックアップとリストアについて記事を残しておきます。

システムバックアップとは

システムバックアップとは、いざという時のためにパーティションやハードドライブ全体のイメージをバックアップすることをいいます。本来は、今回のようにサーバー自体が起動できなくなる可能性があるOSのアップグレードなどの作業を実施する場合には、事前にシステムバックアップをしておけば、リストアすることで元に戻すことが出来るので安心できます。とはいえ、ハードドライブ自体が壊れてしまった場合、復元することは不可能なので壊れる前にバックアップすること。更に、同一システム内のハードドライブでは、不注意や予期しない事態で壊れることもありますので、外付けのハードドライブやクラウドにバックアップデータを保存するようにしましょう。

システムバックアップの方法は

ddコマンドを利用します。ddコマンドはdataset definitionの略で、ディスクに限らずデータをLowレベルで読み書きできるので、データの中身を無視して操作でき、OSが読み取れないファイルシステムでフォーマットされている場合にもバイナリーレベルで読み書きすることができます。 バックアップしたいドライブ以外から起動する必要があるので、Bootable USBやBootable DVDなどを作成しておきましょう。ddコマンドは、ifで指定した入力ファイルを指定されたブロックサイズで、必要に応じて変換をしながらofで指定した出力ファイルにコピーすることができます。OSのディストリビューションやバージョンにより異なる場合もありますので、利用するシステムのmanコマンドで調べたり、確認して下さい。
ddコマンド書式
dd [--help] [--version] [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks] [seek=blocks] [count=blocks] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]

今回はどうしたの

今回、ディスクユーティリティで起動ディスクを調べてみると.../dev/sda1と/dev/sda2の2パーティションが存在しました。準備しておいたBootable CDから起動して、それに合わせ、より大きな容量の外付けディスクに、より大きなサイズのパーティションを作成してシステムバックアップを実行しました。リストアは、if=で指定した入力ファイルとof=で指定した出力ファイルを入れ替えるだけです。まだ、WordPressブログが起動できていないですが、何か起こったとしても現在の状況までは戻すことが出来ます。
参考:今回実行したコマンド
dd if=/dev/sda1 of=/dev/sdb1 bs=64k conv=noerror,sync status=progress
dd if=/dev/sda2 of=/dev/sdb2 bs=64k conv=noerror,sync status=progress
あとは、データベースを含め、WordPressブログをバックアップして、本格的に復旧作業に備えます。

2019/02/10

ホームサーバー 〜WordPressブログ トラブル対応〜

先日、MataKitena's Owndで記事にしたように、ホームサーバーで、運用していたWordPressブログサイト、MataKitena BlogがOSのアップグレード失敗で起動できなくなりました。これまで何度も、何事も無く無事にアップグレード出来ていたのですが、手抜きしてバックアップを取っていなかった今回に限って…(_ _。)シュン

ということでトラブル対応開始

キリッ(๑•̀д•́๑)ホームサーバーのトラブル対応を開始することにしました。ところが‼いろいろ対応し始めて、あッそうだった…と思い出すことがたくさん。まずは、現状のシステムバックアップを取るため、古いカーネルイメージを選択して起動されることを確認。そして、いつ無くなっても、おかしくないと思われる32Bit OSのLiveイメージをダウンロードしてBootable USBを作成しておこうと思いましたが。ホームサーバーは、何世代も前のノートパソコン。もしかするとBIOSが対応してないかも知れない。さっそく、インターネットでBIOS画面の表示方法を調べて、Boot Menuを見てみましたが。やっぱり、Boot Deviceとして表示されるのは、Optical Drive、Floppy Disk、Hard Disk、Network…USB機器には対応してませんでした。

まだまだ想定の範囲内

それじゃあ、MAC BookでBootable DVDを作って…でも、作成したBootable DVDから起動しません。他には、DVDドライブ付きのパソコンもない。ということで、古い雑誌の付録に付いていたDVDとCDを用意してホームサーバーの問題の切り分けです。DVD、CDどちらも認識されません。そういえばOSをインストールする時に、同じ様なことをした憶えが。あの時は、CDレンズクリーナーを使ってクリーニングしたはず。見つけたCDレンズクリーナーで2回程クリーニングすると、CDを認識しましたがDVDは認識しません。以前もそうでした。Fedora29 Workstationのネットワークインストールイメージが536MB。これならCDに入ります。取りあえず32BitOSのインストールCDを作成して、CD起動することを確認しました。

一気にクリアインストール?

MataKitena Blogの復活に向けて、一気にクリアインストールとも考えましたが。WordPressブログのバックアップすら作成してません。ここは、手を抜かないで、システムバックアップ、MataKitena Blogのバックアップも作成して、いざとなったら、海外ドラマで見たことのある「じゃあ、プランBで…」みたいな奥の手を作っておくことにします。ということで、いざという時を想定してどんなバックアップを取っておくかを検討するので、この記事は、ここまで。続きは、しばらくお待ち下さい。近日公開予定です。

2019/01/13

教育 ~学びたい人が、学びたい時に、学びたい場所で…~

最近、ニュースで耳にしたことがある教育無償化。2020年の憲法改正時に実現しようとしているそうです。そんなこともあって、気になっていることがあります。それは、インターネットで「無料学習」とか「無料教育」で検索した時の検索結果です。幼児教育や大学講座、IT系のスキルアップ講座等々。動画や生放送視聴にWeb学習等、多種多様な教育が無料で受講できるようになってきているんです。

どんな無料教育があるの

ベネッセの知育子供ゲーム。あの、しまじろうのぬりえ、折り紙、えかき歌などのキッズゲームで親子で楽しく学ぶことができます。他にも、誰にでも、どこにでも無料で世界クラスレベルの教育を提供することを使命としているというKhan Academy。世界中の多くの人達が自分のペースで学ぶことが出来るんです。数学や科学、コンピュータプログラミング、歴史、美術史、経済学など色んなコースがあるそうです。しかも、数学でいうと幼稚園の算数レベルから微積分学レベルまで学ぶ人に合せて学習できます。日本でも、全ての人に平等な教育をオンラインでというコンセプトのFREE UNIVERSITYというオンライン教育プラットフォームが2018/10/12に開校されました。小中高大の授業やスポーツ、文化、職業体験、生涯学習、語学や資格試験など、ほぼすべての教育ジャンルを2030年までに網羅し、日本の教育を多言語化して、開発途上国などに向けて授業を配信することで平等な教育機会を全世界に提供していくそうです。

学びたい人が、学びたい時に、学びたい場所で…

そんなことが、出来るようになっていたんですね。まだまだ、通信環境が整備されていない地域やパソコン、タブレット、スマートフォンなどの機器を手にすることができない人々はどうするのか…というような、課題はたくさんあると思いますが。この素晴らしい思いや試みが継続されるのであれば、きっと、いつか、全てが実現される日が来るのではないでしょうか。このブログで紹介した無料教育は、ほんの少しだけです。企業や個人の方々が実施されているものも、たくさんあります。このような、思いや試みが継続されて、全てが実現されて、継続されると良いですね。

2018/07/14

XOOPS Cube ~ポータルコミュニティサイト構築CMS~

以前、お仕事で使ったことがあった、XOOPS Cubeについて調べてみました。XOOPS Cubeとは、ポータルコミュニティサイトを構築するために開発されたコンテンツ管理システムで、モジュールとテーマを組み合わせてWebサイトを構築できるシステムです。
動作環境 
OS:Linux、Windows
Webサーバー:Apatche
PHP:PHP5.2
データベース:MySQL 5.0以上  
※XOOPS Cube Legacy 2.2の動作環境です。
モジュールでブログ、掲示板、Wikiなどの機能を追加、テーマでデザインを変更することができます。インストールするには、CMSの機能を実現するためのプログラムを取りまとめたパッケージというものを利用します。
インストールパッケージ 
公式パッケージ(XOOPS Cube Legacy 2.2/略称 XCL2.2)
XOOPS Cube のコアな部分をまとめ、ベーシックな機能を実現しているパッケージです。

サードパーティー製パッケージ(ディストリビューション)
公式パッケージには、ブログ等の機能を実現するためのモジュールが含まれないことから、有志により各種モジュールや機能を追加したサードパーティー製パッケージが各種リリースされているそうです。サードパーティー製のパッケージは、All in One パッケージとも言われ、別名ディストリビューションとも呼ばれているそうです。
現状では、各種モジュールのアップデート管理機能を持つ、X-updateモジュールなどを追加したXOOPS X(ten)が推奨ディストリビューションで、インストール後は、ブラウザ上で様々なモジュールの配置とインストール、アップデートやXOOPS Cube Legacy 本体のアップデートが可能で、サイト構築・運営ができるようになります。
XOOPS Cubeは、ポータルコミュニティサイトを構築するために開発されたコンテンツ管理システムで、モジュールとテーマを組み合わせて、Webサイトを構築・管理できるようになっていて、初心者にも分かり易いシステムでした。

2018/07/08

Blogger テーマ ~厳選テーマ 2018~

たくさんあるBloggerのテーマ、目移りしてしまいますよね。「Blogger テーマ ~初めてのテンプレート選び」では、初めてテーマを選ぶ時のポイントとカスタマイズする時のテーマ選びのポイントを紹介させて頂いたのですが、MataKietaのブログ(Blogger)ほんまえぇなぁ~のブログ(Blogger)の2つのブログで使っているテーマを決めるのにも結構悩みましたので、最後まで迷っていた5つのテーマをここに紹介しておきますね。

1.Gossip

かわいい見た目と、かっこいいデザイン、シンプルで、記事が見やすくってなどは良かったのですが、日本語でないことで最後まで悩んだテーマです。リンク先で、ライブプレビューを見たり、ダウンロードできますので、実際に見て触ってみてはどうでしょうか。

2.Simplify2
こちらも、かっこいいデザイン、シンプルで、記事が見やすくってなどは良かったのですが、日本語でないことで最後まで悩んだテーマですが。記事上のメニューと記事下のページ数とタイトル付きの前の記事/後の記事ナビゲーションができるということで、最終的に使うことに決めたテーマです。リンク先で、ライブプレビューを見たり、ダウンロードできますので、実際に見て触ってみてはどうでしょうか。

3.Kyoto
ここから先は、日本語のテーマです。チェック柄で見た目が、かわいいだけでなく、SEO対策されていたり、スクロールに合わせてサイドバーがついてきたりする機能も付いている実現力派なテーマです。リンク先には、作者のラムネグさんの詳細な説明。そして、サンプルページを見たり、ダウンロードできたりしますので、実際に見て触ってみてはどうでしょうか。

4.Tokyo 

日本語のテーマです。テーマKyotoと同じ作者のラムネグさん作のシンプルで、かっこいいだけでなく、SEO対策されていたり、スクロールに合わせてサイドバーがついてきたりする機能も付いている実現力派なテーマです。こちらも、リンク先には、詳細な説明。そして、サンプルページを見たり、ダウンロードできたりしますので、実際に見て触ってみてはどうでしょうか。

5.Vaster2

日本語のテーマです。最低限の機能でシンプルに設計されているだけでなく、表示速度が速かったり、日本語対応のテンプレートデザイナーが付いていたり、人気記事や関連記事を表示する機能も付いている実現力派なテーマです。こちらも、リンク先には、作者トーマスさんによる詳細な説明。そして、サンプルブログを見たり、ダウンロードできたりしますので、実際に見て触ってみてはどうでしょうか。日本語で、表示速度が速くて、必要な機能が付いているということで、最終的に使うことに決めたテーマです。
見た目だけでなく、操作性や表示速度などなど、テーマ選びって本当に悩ましいですよね。選ぶだけでこんなに悩んでしまうのだから、作る人達は、もっと悩んでいるんじゃないかと想うと…使わせて頂いて、本当に感謝です。

2018/06/17

Linux ~Linuxシステムの起動 Systemd~

Linuxのシステム起動について、従来から使ったわれてきたSystem V init(SysVinit)に変わって、Systemdが使われるようになってきています。SysVinitは、古くから使われているので、お仕事の現場などで遭遇することがまだ多いと想います。Systemdは、Linuxオペレーティングシステムのシステムサービスマネージャーで、SysVinitと後方互換するように設計され、起動時のシステムサービスの並行スタートアップやデーモンのオンデマンドのアクティベーション、システム状態のスナップショットのサポート、依存ベースのサービス管理論理などの多くの機能を提供するそうです。
Systemdの概要については、RedHatのCustomerPortalRHEL7 におけるsystemdの概要という記事が、SysVinitとの機能比較やコマンドの使い方も記載されていて、解りやすいと想いますので、読んでみて下さい。SysVinitの起動手順や設定、ランレベルについては、Linux ~システムの起動/停止手順~も参考にして下さい。ここには、Systemdの起動手順や起動方法、自動起動の設定を記載しておきます。
Systemdの起動手順 
電源ON
    ⇩
BIOSがディスクのMBRという先頭ブロックのブートローダーをメモリ上に読み込みます。
    ⇩
ブートローダーがカーネル(vmlinuz)をメモリに読み込みます。
    ⇩
カーネルが起動し、ドライバなどがロードされて、Systemdプロセスを起動する。
    ⇩
default.targetというファイルに従って、どのターゲットを開始するかを決定し、システムサービスを開始します。

サービスの起動方法

systemctl start サービス名.service
終了     :stop
再起動    :restart
状態表示   :status
設定再読み込み:reload

有効化されているユニットの一覧表示
systemctl list-units

インストールされているユニットファイルの一覧表示
systemctl list-unit-files 


サービスの自動起動設定

systemctl enable サービス名.service

自動起動解除
systemctl disable サービス名.service

設定確認
systemctl is-enabled サービス名.service

2018/05/27

Linux ~Ubuntu ハードディスクを自動マウント~

Ubuntu Desktopをインストールして構築したリビングサーバー、どうせなら起動時からハードディスクをマウントさせて、ファイルサーバーやメディアサーバーとして利用してみようと、調べて、やってみた時のことを残しておきます。…結局は、マザーボードが壊れたりしたこともあり、停電したら結局使えないし、使う時にサーバーを起動してマウントすることにしたので、現在は起動時に自動マウントはさせていませんが、また気が変わった時のために。
起動時、自動マウント手順
 1.設定情報の取得
 2./etc/fstabへの設定
1.設定情報の取得
まず最初に、自動マウントするハードディスクの固有の識別子であるUUIDをblkidコマンドを使って調べます。
sudo blkid
/dev/sda1: LABEL="System" UUID="nnnnnXnXnnnXXXXX" TYPE="ntfs"
/dev/sda2: LABEL="XXXXXX" UUID="nXXnnnXnXnnnXXXX" TYPE="ntfs"
             …
LABEL="XXXXXX"の行のUUIDの値をメモしておきます。

2./etc/fstabへの設定サーバー起動時に、ハードディスクが自動マウントされるようにfstabに1行、設定情報を追加します。
UUID=uuid /mnt  vfat  defaults  0  0
設定値  概要
uuid    マウントするデバイス、1.でメモしたUUID
/mnt        マウントするディレクリ
vfat   マウントするデバイスのファイルシステム
defaults 読み書き実行可、root以外マウント不可
0     ダンプオプション、ダンプ不要
0     fsckオプション、起動時のチェック不要