Ubuntu 7.10→8.04のアップグレードのメモ

7.10から8.04にアップグレードしてみたので、その際のメモでも。

アップグレードを行う前に現状のパッケージのアップデートを全て適用しておく。

$ sudo -i
# aptitude update
# aptitude safe-upgrade

GUI画面の「システム」 → 「システム管理」 → 「アップデート・マネージャ」を開く。
8.04LTSにアップグレードできますという項目があるので、アップグレードのボタンを押せばOK。
時間的には、1時間半くらいかかる感じ。途中、ファイルを置き換えますか?とか聞かれる場面が何度かあり、処理がそこで止まってしまうのでアップグレード中は完全に放置することができなかった。

下は途中でファイルを新しいものに置き換えるか聞かれ、置き換えたものたち。

  • /etc/mime.conf
  • /etc/sysctl.conf
  • /etc/modprobe.d/blacklist
  • /etc/gdm/gdm.conf
  • /etc/apache2/envvars
  • /etc/scim/config

sysctl.confは、とりあえず新しいものに置き換えてみて、今設定してある値を後ほど追加という形を取った。
/etc/modprobe.d/blacklist については、置き換え後に以下の記述を追記しておいた。

# IPv6
blacklist net-pf-10
blacklist ipv6

apache2.confの置き換えが発生したが、これは色々と記述を変更している部分が多いので置き換えなかった。
置き換えはせずに現状の設定を維持して、後ほど下記の設定部分の変更を行う。PidFile と User, Group の記述を若干変える感じ。

# This needs to be set in /etc/apache2/envvars
#PidFile /var/run/apache2.pid   ←コメントアウト
PidFile ${APACHE_PID_FILE}    ←追記

# These need to be set in /etc/apache2/envvars
#User www-data    ←コメントアウト
#Group www-data   ←コメントアウト
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

/etc/apache2/mods-available/{default,dir.conf} は現状の設定を維持。
php.ini について何を行いたいかとゆー選択肢が出てきたので、「現在インストールされているローカルバージョンを保持」を選択した。
/etc/ntp.conf、/etc/init.d/sysklogd は現状の設定を維持。

以上のファイル置き換えの問いが完了すると「不要なパッケージを削除しますか?」と出てきたので削除を選択しておいた。
再起動を促すメッセージが出たので、再起動ボタンをクリック。以上で7.10から8.04のアップグレードが完了。

再起動後に以下のようにしてちゃんとバージョンアップされてるか確認してみた。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION="Ubuntu 8.04"

カーネルのバージョンも確認

$ uname -r              
2.6.24-16-generic

/etc/apt/sources.list の中もちゃんとhardy用のものに書き換わっていることを確認できた。

参考サイト:
https://help.ubuntu.com/community/HardyUpgrades#head-378718bf27e85b8e05c7a5966125eb194b5f26bb

PHPの設定

PHPのインストール

先ずは以下のようにして必要なものをインストールしてやる。

$ sudo aptitude install php5 php5-cli php-pear

PHPのモジュールはインストール後に読み込まれている状態になっていたので、a2enmodで読み込む必要は無し。

PHPの設定

以下は設定を変更した部分のみピックアップ。
なお、セキュリティにも一応気を使った設定となっている。

$ sudo vi /etc/php5/apache2/php.ini

; PHPのバージョンを隠す
expose_php = Off

; ログに記録するレベルを指定
; E_STRICTはPHP5で推奨されていない関数が使用された場合などに警告を出す
error_reporting  =  E_ALL & ~E_NOTICE | E_STRICT

; エラーをHTMLで表示しないようにする
display_errors = Off

; phpのエラーをログに記録する
log_errors = On

; ログに記録するサイズを増やす(4KB)
log_errors_max_len = 4096

; 記録するログのファイルを指定(あとで作成)
error_log = /var/log/php/php_error_log

; $HTTP_*_VARS のような古くて長い変数は使用しないので
register_long_arrays = Off

; Webアプリケーションではargcやargvは不要なので
register_argc_argv = Off

; 確実にoffにしておく。PHP6.0.0で削除される機能
magic_quotes_gpc = Off

; デフォルトの文字コードを指定
default_charset = "UTF-8"

; require()やinclude()するファイルのディレクトリを指定
include_path = ".:/usr/share/php:/usr/share/pear"

; 動的モジュールのロードをオフにする
enable_dl = Off

; ファイルアップロードを使わない場合は確実にOffに
file_uploads = Off

; URIをファイルとして扱わないようにする
; これが有効だとインターネットのどこからでもコードを読み込んで実行できてしまう可能性がある
allow_url_fopen = Off

; JavaScriptでセッションIDを使用しない場合は1に
session.cookie_httponly = 1

; セッションIDを作成する際の外部リソースへのパスを指定。読み込むバイト数も指定しておく
session.entropy_length = 32
session.entropy_file = /dev/urandom

; SHA-1の指定に変更しておく
session.hash_function = 1

[mbstring]
; 言語環境を日本語に設定
mbstring.language = Japanese

; default_charsetと同じ文字コードを指定
mbstring.internal_encoding = UTF-8

以上で設定は完了となるので、PHPのエラーをログに記録する際に指定したファイルの作成をしてやる。

$ sudo mkdir /var/log/php
$ sudo touch /var/log/php/php_error_log
$ sudo chown -R www-data. /var/log/php

以上が完了したら設定を反映させる為にApacheを再起動させる。

$ sudo /etc/init.d/apache2 restart

その他のセキュリティに関する設定

open_basedirの指定をしてやる。ここには、PHPを主に使いそうなディレクトリを指定する。
例えば、/etc/php5/apache2/php.iniの設定を以下のように変更した。

; PHPを実行できるディレクトリを指定
open_basedir = /usr/share/:/var/www/html:/home/chibi/

Apacheの設定でDocumentRootに設定した/var/www/html と 自分のホームディレクトリ以下で使用することが多いので上記のように設定した。なお、/usr/shareが無いとPearでインストールしたパッケージが使用できなくなったので、/usr/shareも追記。
なお、意図しないところでPHPが実行されるのを防ぐ為にも、このopen_basedirの設定は確実にしておくことが好ましい。
例えば、以下の様なプログラムはopen_basedirを設定していない状態だと、/etc/passwdの中身が丸見えになる。上記のようにopen_basedirを設定しておけば失敗する。

<?php
require_once "/etc/passwd";
?>

指定した関数を無効化したい場合は、disable_functionsの設定をする。

; 指定した関数を無効化する
disable_functions = openlog

状況に併せて、使わせたくない関数などをここに記述して禁止してやるのがいい。ここではopenlogを禁止にしている。

動作確認のサンプルプログラム

例えば、/var/www/html 以下に以下の様なプログラムを作成して実際にアクセスしてみて無事に表示できることを確認してみる。

$ vi hello.php

<html>
<body>
<?php
for ($i=1; $i<=5; $i++) {
  echo "<h$i>Hello PHP!</h$i>\n";
}
?>
</body>
</html>

また設定状況なども確認しつつ、PHPのサンプルを試したいなら以下を作成してアクセスしてみる(アクセスした後は確実に削除しておく)。

$ vi info.php

<?php
phpinfo();
?>

phpのログのローテーション

PHPのエラーをログに出力しているようにしているが、このままではログのローテーションは行われないので、ファイルがどんどん大きくなっていく一方だ。
例えば、PHPのエラーログを1週間という単位でローテーションさせたい場合は、以下のようなファイルを作成してやる。

$ sudo vi /etc/logrotate.d/php

/var/log/php/php_error_log {
  weekly  missingok
  notifempty
  sharedscripts
  postrotate
    /etc/init.d/apache2 reload > /dev/null 2>/dev/null || true
  endscript
}

mod_deflateで圧縮

Apacheモジュールのmod_deflateを使用すれば、サーバ→クライアントでやり取りするデータを圧縮することができ、トラフィック量の低減が期待できる。

a2enmod コマンドで deflate と headers を読み込むように設定する。(Headerディレクティブを使用する為、mod_headersも読み込ませる必要がある)

$ sudo a2enmod deflate
$ sudo a2enmod headers

続いて、/etc/apache2/mods-enabled/deflate.conf を以下のように編集する。

$ sudo vi /etc/apache2/mods-enabled/deflate.conf
<IfModule mod_deflate.c>

    # 1〜9の値で圧縮率の設定(数字が大きくなると圧縮率が大きくなる)
    DeflateCompressionLevel 6
    
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    
    <Location />
        # DEFLATEの有効化
        SetOutputFilter DEFLATE

        # Netscape 4.0X の場合は圧縮しない
        BrowserMatch ^Mozilla/4\.0[678] no-gzip

        # Netscape 4.X以上 / Firefox / MSIEでは圧縮(htmlテキストのみ)
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/5 gzip-only-text/html

        # 拡張子による制限(gif/jpg/png は圧縮しない)
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

        # Proxyサーバで適切なキャッシュ処理が行われるように、HTTPのVaryレスポンスヘッダを追加
        Header append Vary User-Agent env=!dont-vary
    </Location>
</IfModule>

GIFやJPGファイルは元々圧縮されたファイルなので、圧縮の意味は無くCPUを無駄に消費してしまうので、上記ではこれらのファイルは圧縮の対象から外すような設定を行っている。


ちゃんと圧縮されたかどうかは以下のサイトで確認することができる。
結果表示が、Compression status: Compressed (gzip) になっていればきちんと圧縮されている。

http://www.port80software.com/surveys/top1000compression/#checkyoursite

Apache再起動時に出るメッセージの件

Apache再起動時に以下のメッセージが出る場合の対処法。

$ sudo /etc/init.d/apache2 restart
 * Restarting web server apache2
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName  [ OK ]

/etc/hosts の 127.0.0.1 の行を以下のようにlocalhost.localdomain を先頭に持ってくることで対処できる。

$ sudo vi /etc/hosts
127.0.0.1         localhost.localdomain localhost haruhi

上記を編集後にApache を再起動するとエラーは出なくなっている。

$ sudo /etc/init.d/apache2 restart
 * Restarting web server apache2      [ OK ]

Apacheで不要なログを記録しないようにする

例えば、以下のようなログを記録しないようにする。
"SEARCH /\x90\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02 ... \x90\x90\x90\x90" 414 271 "-" "-"

上記は非常に長いログ。これを1回記録するとそれだけで 32kB になるので、アクセスログに記録しないようにする。また、その他のワームアクセスや記録が不要と思われる物もログに記録しないようにする。
以下のように設定ファイルを編集する。

$ sudo vi /etc/apache2/apache2.conf

# \"%r\" の部分を \"%!414r\" に変更する
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


# ウイルスや画像ファイルへのアクセスはログに記録しない
setenvif Request_URI "default\.ida" no
setenvif Request_URI "root\.exe" no
setenvif Request_URI "cmd\.exe" no
setenvif Request_URI "Admin\.dll" no
setenvif Request_URI "NULL\.IDA" no
setenvif Request_URI "\.(gif)|(jpg)|(png)|(ico)|(css)$" no

# env=!no を付け加える
CustomLog /var/log/apache2/access.log combined env=!no

以上が完了したら、Apacheを再起動させて設定を反映してやる。

$ sudo /etc/init.d/apache2 restart

システム全体で使えるスレッド数の最大値を上げる

システム全体での最大プロセス数(プロセス数+スレッド数)は、threads-max の値で決まる。(Linuxカーネルからは、スレッドもプロセスのように見える)
この値を超えるプロセスは生成できないので必要に応じて十分な値を取る必要があるかもしれない。ただし、threads-maxのデフォルトの数値はメモリ量に合わせて起動時に計算された値となっている。ちなみにうちの環境では以下の値だった。

$ cat /proc/sys/kernel/threads-max
15871

とりあえず、テストとして値を3倍にしてみる。変更方法は、/etc/sysctl.conf に以下のように追記する。

$ sudo vi /etc/sysctl.conf
...
# システム全体での最大プロセス数
kernel.threads-max = 47613            ← 追記


編集後は以下のコマンドで設定を反映させる。
$ sudo sysctl -p


再び、値を確認してみる。
$ cat /proc/sys/kernel/threads-max
47613

なお、ユーザ1人あたりが使用できるプロセス数の上限値は以下で確認できる。

$ ulimit -u
7935

/etc/security/limits.conf に以下のように追記すれば、各ユーザのプロセス数の上限値を変更できる。

$ sudo vi /etc/security/limits.conf
...
# プロセス数の上限値
chibi    soft    nproc   10000    ←追記
chibi    hard    nproc   15000    ←追記

# End of file

ここではchibiユーザのソフトリミットを10000に、ハードリミットを15000に設定した。一旦ログアウトしてから、値が変更されていることを確認してみる。

$ ulimit -u                       
10000