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
OpenSSL パッケージの脆弱性
http://www.debian.or.jp/blog//openssl_package_and_its_vulnerability.html
パッケージをアップデートしただけではダメなので、早めに上記の対策をしておきましょう。
うちのUbuntuマシンも2台ほど影響受けました。
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