徒然なるままに

個人の備忘録を中心としたブログです

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
apacheとtomcatをajpで連携した状態で、tomcat側の通常htmlファイルをアクセスする時にステータスコード304(Not Modified)で、何故かページが表示されないという現象が起こった。

この304というコード自身はページファイルのタイムスタンプを見てページに変更がないということで問題はないのだが・・・。
servletやjspファイルへは200(OK)となるのは、これらが動的にページを生成するものであるからだろう。

また、tomcat単独でのアクセス(8080ポート)時は304(Not Modified)でも正常にキャッシュを参照出来ている。
Apacheをリバースプロキシで通しているとうまくキャッシュが参照できていないようである。
そのため、ブラウザのキャッシュを消去して初めのアクセスは200(OK)でhtmlファイルの内容が表示される。
二回目以降は304で表示されない。

ちなみにCtrl+F5の更新を使えば、キャッシュを使わずにページを再取得するので、とりあえず表示したいならこれ。


・対策1、キャッシュを無効にする
(tomcatのキャッシュ対策)
context.xmlにて
にreloadable="true"オプションを追加して
とする。
しかしこれは、「Tomcatを再起動せずにサーブレットのクラスファイルを更新して反映させることができる」
というもののようでキャッシュを無効にするとはまた違った。実際挙動変わらず。

(htmlのキャッシュ対策)
同様にhtmlの<head>に
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

を記述しキャッシュを使わないようにする。が、結局これもブラウザによって挙動が変わったりする不安定なものでFirefox、Chromeでは304が帰って来てアウト。

(Apacheのキャッシュ対策)
mod_headersをDSOインストールして、キャッシュを抑制する。

インストール方法は
Apacheのソースからmodules/metadata/に入って、
sudo /usr/local/apache/bin/apxs -i -a -c mod_headers.c
apachectl -M

無事DSOインストールできると、headers_module (shared)が追加されています。

apacheとtomcatを再起動させてテスト。
無事、200(OK)が返ってきました。

・対策2、キャッシュのkeyとなるURLを変換する。
こっちが原因への直接的対策です。

tomcat(ディレクトリ)以下をtomcatに渡しているとします。
http://localhost/tomcat/hoge/hoge.htmlのページのキャッシュは当然、
key:http://localhost/tomcat/hoge/hoge.htmlで保存されるわけですが、
tomcat側でapacheは見えないので、http://localhost/hoge/hoge.htmlを探しにいっているというのが
原因として最も考えられます。

要するにCookieについて、ProxyPassReverseCookiePathでURLを書き換えたように
キャッシュでも同じようなことができないのかということです。

これに関しては情報を探してもなかなか出てきません。
キャッシュのURLキーの書き換えについて、知っている人がいましたら教えてください。


上記以外の対策法も募集しています。
スポンサーサイト
フォームからGETで送られたパラメータをjspで取り出すときに文字化けしてしまう問題が起こった。
というのもtomcat5以降とtomcat7で挙動が変わるらしい。(5より前を今更使い始める人もいないだろう)

この問題を解決するのに参考になったOKwaveの質問ページ
JSP/Servletのパラメータの受け渡しが文字化けしてうまくいきません。

以下、tomcat5についての上記ページからの引用
--------------------------------------------------------------------------------------------------------------------

 Tomcat5では、GETで送られるアドレス部のURL文字列のデコードに、必ずISO8859-1が使われるため、
サーブレット中でSetCharacterEncoding()メソッドにより文字エンコーディングを指定しても、デフォルトではそれが無視されてしまいます。
 Tomcatが悪いわけではありませんが、以前のバージョンのTomcatと振る舞いが異なるため混乱の原因となっています。

このデフォルト値を変更するには、以下の場所にあるserver.xmlを編集する必要があります。

/conf/server.xml

server.xmlを開いたら、次の記述を追加します。
useBodyEncodingForURIの設定(80行目付近)


server.xmlはTomcatの動作を設定するためのファイルです。
UseBodyEncodingForURI="true"を指定することで、
URLデコード時にsetCharacterEncoding()メソッドで指定した文字エンコーディングが使われます。
この設定を行った後、Tomcatを再起動して、再び実行すれば文字化けせずに表示されます。

補足::
・POSTリクエストの場合はこの設定を行わなくても文字化けしません。
これはPOSTではGETと違ってパラメータをURLの一部として送信しないからです。
・サーブレットAPIの将来のリリースではsetCharacterEncoding()メソッドのエンコーディングがアドレス部分に適用されると
明記されるようになる予定なので、この設定を行うのが今のところベターな対処だと考えられます。

[COLUM]
getBytes()のnew String()
setCharacterEncoding()メソッドはサーブレットAPI2.3で導入されました。
それより前には以下のように自前でエンコーディングを行う必要がありました。

String message = request.getParameter("message");
message =new String(message.getBytes("ISO8859-1"),"Shift_JIS");

古い資料を見るとこのようなサンプルソースもあるかもしれませんが、現在はあまり利用されません。

---------------------------------------------------------------------------------------------------------------------

現在、tomcat7ではUseBodyEncodingForURI="true"を書く必要がないらしい。
つまり、setCharacterEncodingで受け取る文字コードを指定するだけでよい。

<%
request.setCharacterEncoding("UTF-8");
String s = request.getParameter("hoge");
%>

の二行のコーディングで済むらしい。


・・・のだが、Ubuntu12.04のFirefoxで実際にやってみるとこのコードだけでは不十分で自前で変換する必要があった。
手持ちの環境によるだろうが、文字化け対策を重ねておくほうがよいという結論になりました。
pageEncodingはページ自身の文字コードの指定です。
tmp.getByte()は引数で渡された文字コードに直したバイト配列を返します。

String()に関してはこちらから
http://docs.oracle.com/javase/jp/1.5.0/api/java/lang/String.html#constructor_detail
-----------------------------------------------------------------------------------------------
public String(byte[] bytes,
String charsetName)
throws UnsupportedEncodingException

指定された文字セットを使用して、指定されたバイト配列を復号化することによって、新しい String を構築します。新しい String の長さは文字セットによって変化するため、バイト配列長と一致しないことがあります。
-------------------------------------------------------------------------------------------------

というわけで雛形はこんな感じ。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%
request.setCharacterEncoding("UTF-8");
String tmp = request.getParameter("hoge");
String carname = new String(tmp.getBytes("ISO8859_1"),"UTF-8");
%>
<html>
<head><title>タイトル</title></head>
<body>適当</body>
</html>


これだけやれば、まず文字化けは直っていると思います。
自身でいろいろ試すときはURLに「?hoge=ほげ」など適当な文字列を追加することを忘れないこと。
これを忘れるとgetBytesでNullPointExceptionが出て、コンパイルエラーに悩まされます。
まずDSOの.soファイルを格納するディレクトリを
phpinfo()のextension_dirの項目から確認します。
デフォルトで
/usr/lib/php/extensions/no-debug-non-zts-20*********
のように指定されていると思うので、この中に後で作成した.soをコピーします。


このディレクトリが存在しないなら、自分が分かりやすいextension_dirを作成するとよいでしょう。
自分はext/を作成しました。
$sudo mkdir /usr/local/lib/php/ext


その場合php.iniを編集して、extension_dirの項目を書き換えます。
php.ini
-------------------------------------------------------------------
extension_dir = "/usr/local/lib/php/ext"
-------------------------------------------------------------------

.soファイルを作るためにphpizeというコマンドが用意されています。
phpizeは.soを作るためのconfigureを生成します。

手順は、
1、PHPをインストールした時のソースにext/という拡張モジュール用のディレクトリがあるので
目的の拡張モジュールに対応したディレクトリ(ここではmysqli)に移動
2、phpizeを実行
3、make
4、modules/mysqli.soが生成される
となっています。

$ cd /usr/local/src/php-5.4.13/ext/mysqli/
$ phpize
$ ./configure --with-mysqli=/usr/local/mysql/bin/mysql_config
$ make


ここでmysqli/modulesにmysqli.soが作られているはずです。
あとはこれをext/にコピーします。

$ cp modules/mysqli.so /usr/local/lib/php/ext/


php.iniでmysqli拡張を有効にします。
extension=mysqli.so

mysqli拡張が有効になっていればphpinfo()でmysqliの項目が追加されているはずです。

(参考にしたサイト)
http://www.hackthissite.org/articles/read/948
PHPMyAdminはブラウザ上でMySQLを操作するPHPアプリケーションです。
インストールはファイルを公式からダウンロードして、ディレクトリルートに設置するだけ。
SQL文を知らなくてもデータベースを使えるという非常に便利なツールです。

公式からダウンロードしてきます。
日本語表示させたければall-languagesを選びましょう。
今回は、phpMyAdmin-3.5.7-all-languages.tar.gzを落としてきます
http://www.phpmyadmin.net/home_page/downloads.php
なお、ファイル名が長いのでアクセスを簡単にするためにリネームします。

$ tar xzvf phpMyAdmin-3.5.7-all-languages.tar.gz
$ mv phpMyAdmin-3.5.7-all-languages phpmyadmin


できたphpmyadminをお使いのApacheのルートディレクトリにmvします。
$ sudo mv phpmyadmin /usr/local/apache/htdocs


ブラウザで、http://localhost/phpmyadmin/にアクセスします。
index.phpが表示されない場合はApacheのindexページ指定でindex.phpが登録されていないので
httpd.confのDirectoryIndexにindex.phpを追加します。
httpd.conf
-----------------------------------------------------
DirectoryIndex index.html index.php
-----------------------------------------------------

アクセスしたところページの下部に「mysqli 拡張がありません。PHP の設定をチェックしてみてください。」との表示。
あれ、PHPのインストール時にmysql拡張したような・・・。
と思ったら「mysqli」と「mysql」は違うのですね。
--with-mysql=/usr/local/mysqlは設定したものの、--with-mysqli=/usr/local/mysql/bin/mysql_config
を設定していなかった。

ということでmysqliモジュールをDSOで追加します。(別記事でエントリーしました)
http://kamiyasu2.blog.fc2.com/blog-entry-29.html


再度、ブラウザでhttp://localhost/phpmyadmin/にアクセスすると、
「ERROR 2002: Can't connect to local MySQL server through socket」
との表示。

そもそも、なぜPHPMyAdminでMySQLデーターベースが操作できるのかというと
PHP側とMySQL間でソケットによって通信をしているからです。

そのためmy.cnfとphp.iniで
port番号や、socketファイルの指定が異なっていると
通信ができないので2002 errorが発生します。

ご自分のmy.cnfに合わせて、php.iniを編集しましょう。
設定例は以下のようになります。

my.cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
basedir = /usr/local/mysql
socket = /var/run/mysqld/mysqld.sock
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306


php.ini
[Pdo_mysql]
pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock
[MySQL]
mysql.default_port = 3306
mysql.default_socket = /var/run/mysqld/mysqld.sock
[MySQLi]
mysqli.default_port = 3306
mysqli.default_socket = /var/run/mysqld/mysqld.sock


今度こそ、phpmyadminにアクセスしてユーザとパスワードを入力すると無事ログインができました!
PHPがインストールできたら、PHP.iniを編集することで細かい設定を変更できます。

インストール後にまずやるべきことはphpinfo()で表示された
Configuration File (php.ini) Path の項目を確認します。
ソースからインストールした場合はおそらく/usr/local/libになっていると思います。

といってもソースからインストールした場合、自動でphp.iniが作成されているわけではないので
ソースのディレクトリから
./php.ini-development、./php.ini-production
のどちらかをphp.iniとリネームして/usr/local/lib等にコピーすることになります。
developmentが開発環境用、productionが実際に運用する上でのデフォルトphp.iniファイルとなっています。

ここでは、php.ini-developmentを選びます。
sudo cp PHP_SRC(ソース)/php.ini-development /usr/local/lib/php.ini


その後は必要に迫られてphp.iniを編集していけばよいのですが
とりあえず最低限の設定をしておきましょう。基本コメントアウトを外してちょっと記述すればいいようになっています。

php.ini
-----------------------------------------------------------------------
[PHP]



; PHP's default character set is set to empty.
; http://www.php.net/manual/en/ini.core.php#ini.default-charset
default_charset = "UTF-8"



[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"



[mbstring]
; language for internal character representation.
; http://www.php.net/manual/en/mbstring.configuration.php#ini.mbstring.language
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_detection = Off
mbstring.http_output_conv_mimetype=
-----------------------------------------------------------------------
http://unixlife.jp/unixlife/linux/s-php1.jspを参考にさせてもらいました。

apacheを再起動させて、phpinfo()の内容が更新されていることを確認します。
MySQLを使う際には、
1、MySQLのデーモンmysqldの起動
2、mysqlを実行
という二つのプロセスが必要になります。

1のmysqldの起動コマンドは
mysqld_safeを-user=mysqlでバックグラウンド起動させるコマンド
sudo /usr/local/mysql/bin/mysqld_safe -user=mysql &
あるいは、
init.dに仕込んだ自動起動ファイルプログラムを使うコマンド
sudo /etc/init.d/mysql.server start (=service mysql.server start)
を使います。

serviceを使った方が-userとかバッググラウンド指定(&)するとかいちいち考えなくてよいので便利です。

2のmysqldの停止は
mysqladminのshutdownオプションを使ったコマンド
sudo mysqladmin shutdown
あるいは
init.dのプログラムを使うコマンド
sudo /etc/init.d/mysql.server (=service mysql.server stop)
を使います。

バックグラウンドでmysqldを動かしたら、/usr/local/mysql//bin/mysqlを実行します。

MySQLをインストール後に求められているのは
rootユーザのパスワード設定と、匿名ユーザの削除である。
rootユーザのパスワードはmysqladminを使って登録する。
以下のコマンドのnewpasswordを任意のパスワードに変えて実行する。
mysqladmin -u root password "newpassword"
mysqladmin -u root -h hostname password "newpassword"

-hを省略すると自動でlocalhostになるので二行目は必要ないかもしれない。

その後、mysqlにrootでログインする。
mysql -u root -p

-uでユーザ指定,-pがパスワード指定ですが実際にパスワードを入力するのは
Enter passwsord: と表示された後です。

mysqlにログインが出来たら、二つのSQL文で匿名ユーザを削除します。
DELETE FROM mysql.user WHERE Host='localhost' AND User='';
FLUSH PRIVILEGES;


以上で、設定終了。
(注)
また、このエントリーは適当に試行錯誤した結果、うまくいっちゃった程度の内容が含まれます。
備忘録として試行錯誤を書き残しては置きますが、あくまで参考程度にしてください。

一応、原因が分かりました。

Apacheやmysqlが組み込まれていることを前提とします。

公式:http://www.php.net/manual/ja/install.unix.apache2.php
のやり方にそってインストールしましょう。

wget http://www.php.net/get/php-5.4.13.tar.gz/from/a/mirror
mv mirror php-5.4.13.tar.gz


MySQLのデータと連動させて、グラフを描くためにいろいろオプションを指定しています。
configureオプションは、http://phpspot.net/php/pgUNIX%E7%92%B0%E5%A2%83%E3%81%B8%E3%81%AEPHP5%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.htmlを使わせてもらいました。
とりあえずPHPプログラムが実行できればいいというのであれば、--with-zlib-dir以降を削除しても構いません。

GDに関しては、PHP5にバンドルされているものを使うとします。

$ sudo ./configure --with-apxs2=/usr/local/apache/bin/apxs --enable-mbstring \
--enable-mbsrt-enc-trans --enable-mbregex --enable-trans-sid --with-mysql=/usr/local/mysql \
--with-zlib-dir=/usr/local/lib --with-png-dir=/usr/local/lib --with-jpeg-dir=/usr/local/lib \
--with-freetype-dir=/usr/local/lib --with-gd --enable-gd-native-ttf --with-pdo-mysql=/usr/local/mysql


エラーが出たら求められているライブラリをインストールする必要があります。
本来はソースから/usr/local/あたりに一つ一つインストールするべきなのでしょうが
ライブラリの数が多いのでめんどうくさくなって
php5-gd,libxml2-dev,libjpeg-dev,libpng++-dev,libfreetype6-dev辺りを「pt-get install」したらなんかできてしまった。
もちろん/usr/local/libにインストールされている様子はない。

(追記)
configureで/usr/includeを勝手に読んでくれていたみたい。/usr/include/freetype2/freetype,/usr/include/libpng,/usr/include/libpng2などなど。
つまり、configureでのインクルードパス指定は形骸化していたわけですね


まあ通ったなら一度インストールしてみるかとういことで
$ sudo make
$ sudo make install


make時に早速エラー:fatal error: libxml/parser.h: no such file or directory
libxml2はちゃんとソースからインストールしたはずなんだけど・・・。
実行時のインクルードパスを見ると-I/usr/local/include/libxml2とあり、
結果は自分がlibxml2を/usrにインストールしていたのが悪かったみたい。
cp /usr/include/libxml2 /usr/local/include/libxml2

したら通りました。

(追記)
そう。makeさんは/usr/includeを読んでくれていなかったのです^^
Makefileを見ると CFLAGS_CLEAN = -I/usr/include -g -O2 -fvisibility=hidden
の記述はあるのですが、また別なのでしょうね。


info.phpを以下の内容で作成。
<?php phpinfo(); ?>

info.phpをApacheのDocRootにおいて
Apacheの再起動をかけて、いろいろ情報が出ればPHPのインストールはOK。

gdについてのオプションでsupport JPEGやsupport PNGなどがOKになっていることを見ておきましょう。


(追記)
そもそも、ライブラリをソースから入れるのに躊躇したのは
PHP5にバンドルされていないGDを使おうとしていたからです。
GDライブラリの公式ではソースの公開を停止しており、
各ディストリビューションでパッケージからのインストールを推奨しています。
ソースはあるようなのですが、現在フォーラムのような形で有志が更新しているのか
configureがなく、cmakeを使うような形になっていたよう?なので導入時に不安が残り見送ったというわけです。

余裕が出来たので、http://d.hatena.ne.jp/rougeref/20070208を参考にさせてもらい
後から試しにlibpngを入れてみましたが普通にうまくいったので、残りの三つもソースからインストールすればよかったと思います。
その場合libjpeg,libpng,freetype2について、configureの際に--enable-sharedを忘れずに。
これを忘れるとphp5のconfigureで怒られてしまいます。

libpngのソースコードの場所だけ分かりにくかったのでおいておきます。
http://www.libpng.org/pub/png/libpng.html


(参考にしたサイト)

http://www.gadgety.net/shin/tips/unix/php-gd.html




MySQL5.6.10のインストールが完了(前の記事)したら、データベースを使うために
mysqlユーザとmysqlグループを作成します。

$ sudo groupadd mysql
$ sudo useradd -r -g mysql mysql

useraddの-rオプションはホームディレクトリを作成しないという意味です。システムアカウントを作成する時によく使われます。-gは所属するgroupの指定ですね。


次にmysqlディレクトリの所有権を先ほど設定したmysqlユーザ及びmysqlグループに設定します。
$ cd /usr/local/mysql
$ sudo chown -R mysql:mysql


ログファイルの前準備をしておきます。error.logにはエラーの解決法が乗っている可能性があるので、ここから先に何か途中でエラーがおきたらこのファイルを一度覗いてみましょう
$ sudo mkdir /var/log/mysql/
$ sudo touch /var/log/mysql/error.log
$ sudo touch /var/log/mysql/query.log
$ sudo touch /var/log/mysql/slow.log
$ sudo chown -R mysql. /var/log/mysql/



ソケットディレクトリの所有者設定
sudo chown -R mysql:mysql /var/run/mysqld


mysqlの設定ファイルであるmy.confの作成。
sudo cp support-files/my-default.cnf /etc/my.cnf
sudo vi /etc/my.cnf

my.cnf
---------------------------------------------------
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
tmpdir = /tmp
skip-external-locking


----------------------------------------------------
これは以前upt-getでmysqlをインストールしたときに残っていたmy.cnfを編集しなおしたものなので、環境によってはうまくいかないかもしれない。
うまくいかなかったら、公式の説明を読んで自分で書くか(http://dev.mysql.com/doc/refman/4.1/ja/option-files.html
他の人がちゃんと書いた(おい my.cnfを参考にしてください

最後にmysqlの初期化スクリプトを実行します。
自分はここで詰まりました。問題となったのは以前apt-getでインストールした際に残っていたmy.cnfが残って悪さをしていたからです。この不必要なmy.cnfがapt-getで入れた場合のディレクトリを参照していたのです。

解決方法の鍵は--default-file=/etc/my.cnfです。
--default-fileオプションは指定されたmy.cnf「だけ」を読み込みます。
これで他のmy.cnfを指さなくなり正常に動いてくれるはずです。
--default-fileの代わりに、「--no-defaults」でmy.cnfの設定を全く読み込まないとしてもうまくいきます。

ちなみにmy.cnfの置き場所は/etc/my.cnf・・・グローバルな設定。DATADIR(MySQL データディレクトリで今までの手順通りだと/usr/local/mysql)/my.cnf・・・サーバ固有オプション。~/my.cnf・・・ユーザ固有オプションです。
apt-getでインストールした場合、/etc/mysql/my.cnfに作られていました。


$ sudo ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --defaults-file=/etc/my.cnf

ここでOKが二回出ればやっとmysqlを使う準備が整いました。

なお[WARNING]として--explicit_defaults_for_timestampを指定するように求められると思いますが、無視して構いません。
5.6からの変更として、timestamp型のカラムに暗黙的に属性としてCURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPといったが加えられるのを抑制するためのもののようです。
CURRENT_TIMESTAMPは現在の時刻を返す関数です。
通常、カラムの属性に関数は指定できないのですがTIMESTAMP型のカラムのこの関数は例外的に許されていました。
統一性を高めるために、後にこの機能が廃止になるということらしいです。
とりあえず、現段階ではこのデフォルトの属性がついていたほうが下位verとの挙動の互換性からいっても何かと便利なので
--explicit_defaults_for_timestampは指定せずにインストールしましょう。
なお、このオプションはmy.cnfにて変更できるので深く考える必要はありません。

ディレクトリの所有者等を一部戻します。
sudo chown -R root:root ./
sudo chown -R mysql:mysql ./data


bashrcや/etc/profileにPATHを追加しておきましょう
export PATH="$PATH:/usr/local/mysql/bin"

自動で、mysqlが起動するように設定します。
sudo cp support-files/mysql.server /etc/init.d/mysql.server
update-rc.d mysql.server defaults
sudo sysv-rc.conf --list | grep mysql.server

mysql.server 0:off 1:off 2:on 3:on 4:on 5:on 6:off
このように適切にrun-levelが設定できているのを確認しましょう。

お疲れさまでした。次はmysqlの初期設定です。

(参考にしたサイト)
http://my-life-logs.blogspot.jp/2011/05/mysql-5512-ubuntu-1104.html ←詳細に経過を書いてくれているので、初めてのインストールで同じように苦労する人にはわかりやすいです
http://www.omakase.org/rdbms/mysql-5519_for_ubuntu.html ←シンプルに手順を書いているので一度インストール経験があればわかりやすいです
度重なるエラーに、一度は諦めてapt-getしかけましたがなんとか無事インストールできました。
やはり、初心者は新しいもの(mysql5.6)を使おうとするべきじゃないですね。。

Downloadsなどの適当なフォルダに移ったら公式サイトからソースコードを落としてきます。
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.10.tar.gz/from/http://cdn.mysql.com/
$ tar xzvf mysql-5.6.10.tar.gz
$ sudo mv mysql-5.6.10/ /usr/local/src/ #srcは後で使うので基本残しましょう


5.5以降はCMakeを使ってビルドするので、cmakeやcmakeに必要なパッケージやライブラリをapt-getしておきます。
sysv-rc-confはrun-levelの変更やチェックに使うので、入れていない方はぜひご一緒に。
$ sudo apt-get install install -y cmake bison libncurses5-dev libncursesw5-dev sysv-rc-conf


その後は解凍したディレクトリに移って
$ sudo cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.19 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATIO N=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_PIC=1
$ sudo make
$ sudo make install


オプションの指定でミスった場合は
$ sudo rm CMakeCache.txt

して再度cmakeできます。

これでインストールはひとまず完了しました。
次の記事は各種設定です。
ソースからインストールしたApacheにSSL機能を追加したくなったので、mod_sslモジュールをDSOで追加した。

かなりエラーが出て悩んだので、できればApacheのインストール時にconfigureで
$ ./configure --enable-so --enable-ssl
しておくのが一番です。

参考にしたとういか、助けてもらったのは以下のサイトです。エラーの内容とそのエラーを回避する方法について非常に詳しく書いてあるので詳しく知りたい方はこちらを読んでください。
apxsコマンドの指定の意味がつかめると思います。
http://d.hatena.ne.jp/rx7/20130206/p1

Apacheでmod_sslを有効にするためにはopensslが必要です。
$ openssl --version

version情報が確認できればインストールされています。
(Ubuntu12.04では元々インストール済みでした)
oepnsslのヘッダファイルの場所は環境によって異なりますが
おそらく/usr/include/openssl、/usr/local/include/openssl辺りにあると思います。

mod_sslモジュール本体であるmod_ssl.cは、インストール時に使用したApacheのソース/modules/sslにあります。

では、早速apxsでmod_ssl.cをコンパイルするのですが、mod_ssl.cだけをコンパイルすると後にsyntax検査で必要なファイルがないとかでエラーがでます。
sslディレクトリ内のすべての*.cファイルを指定する必要があることに注意。

また、コンパイルの際にHAVE_OPENSSLというマクロが定義されていないと、ヘッダファイルがインクルードされないので-Dオプションでマクロを定義します。

-lcrypto、-lsslはopensslのライブラリ指定です。必須です。

例によってapxsのオプションは-iがインストール、-aがhttpd.confに自動でLoadModuleの記述を追加、-cがコンパイル -Iでインクルードするヘッダファイルを指定します。

$ cd APACHE_SRC/modules/ssl
sudo /usr/local/apache/bin/apxs -i -a -c -I /usr/include/openssl -D HAVE_OPENSSL=1 -lcrypto -lssl *.c


$ apachectl -M

でSyntax OKを確認したら無事モジュールのインストールが完了しました。
通常、Linuxで起動サービスのランレベル変更にはchkconfigを使いますが、Ubuntuではデフォルトでインストールされていません。
apt-getで普通にインストールできますが、Ubuntuでランレベルの変更の際にchkconfigを使うとエラーを吐かれることがあります。

このchkconfigに変わって、使うのが「sysv-rc-conf」
文字通り「従来のsystem-V系のrcファイルを設定する」スクリプトです。
sudo apt-get install sysv-rc-conf

でインストールしましょう。

引数などの使用法はchkconfigとほとんど変わらないみたいです。
通常、Ubuntu以外のLinuxディストリビューションでテキストモードのログインをするには
起動時のデフォルトランレベルの変更という手段を使う。
/etc/inittabの
id:5:initdefault:

の5(Graphical mode)を、3(Text mode)に変更するのだとか。

ところがUbuntuではそもそもinitデーモンを使用せず(6.10以降)、
「Upstart」というイベントをトリガとする起動形式をとっていて
/etc/inittabは存在しないようだ。

しかし、互換性のためにランレベルの概念も引き継いでいるようで
/etc/event.d/rc-defaultというスクリプトにデフォルトのランレベルを記述せよ。とのこと
しかし、これは(9.04)までの話であり、12.04には/etc/event.dは存在しない。

現在(12.04)のUbuntuでテキストモードのログインを行う一般的な方法として、GRUBの起動オプションを変更する。
/etc/default/grubの編集で
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”


GRUB_CMDLINE_LINUX_DEFAULT=”text”

に変更。
その後に$ sudo update-grub2で更新を行わないと設定が反映されないことに注意。

GRUB_CMDLINE_LINUX_DEFAULTは通常起動のlinuxラインの最後に指定されたオプションを付け足すことができる。

すなわち、GRUBの選択画面で'e'を押して、起動時のコマンドラインを直接編集してもよい。
その場合も" quiet splash"の部分を" text"に変更するだけ。

ちなみに、オプションの意味はquietはkernelメッセージの抑制、splashはスプラッシュスクリーンの表示。
splashそのままで、元々のquietを外せば起動時の読み込み動作などが小窓に表示されるとのこと。
グラフィカルモードで読み込み動作をスプラッシュスクリーンなしで、表示させたい場合には
GRUB_CMDLINE_LINUX_DEFAULT=”quiet nosplash”

に変更するらしい。

(追記13/03/01 11:30)
実際試してみたところ、12.04では"splash", "quiet nosplash"の起動時の表示は"quiet splash"と変わらないみたい?
ここでは、テキストモードでログインしたいだけなのでまあいいや

(参考にしたサイト)
http://bibo-log.blog.so-net.ne.jp/2010-05-23
http://christina04.blog.fc2.com/blog-entry-162.html

kamiyasu

Author:kamiyasu

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。