開発・テスト環境や運用環境としてウェブサーバを手元に構築しておくと便利です。
公式サイトからソースを取得します。 wgetやfetchコマンド、またはftpなどで手元にソースを持ってきます。 手元で展開できる形式ならどれでもいいです。 # cd /usr/local/src # fetch http://www.ring.gr.jp/archives/net/apache/httpd/apache_1.3.42.tar.gz # tar zxvf apache_1.3.42.tar.gz # cd apache_1.3.42 --helpオプションで、事前に各種ファイルのディレクトリ配置の確認ができます。 # ./configure --help --prefixを変更したい場合は、以下のようにして配置を確認できます。 # ./configure --help --prefix=/usr/local/apache 配置が決まれば実際にconfigureコマンドで環境に合ったMakefileを作成する際にこのときのオプションを渡します。 どんなモジュールがあって、どれがインストールされるかを--show-layoutオプションで確認できます。 # ./configure --show-layout 個々にモジュールを指定するのは面倒なので、とりあえす全部入れて後でコメントにすればモジュールロードしなくて済むようにします。 # ./configure \ --prefix=/usr/local/apache \ --enable-shared=max \ --enable-module=rewrite \ --enable-module=so # make # make install ▼ LAMP(FAMP)環境の構築 ●Debian, Ubuntu # tasksel install lamp-server 「# tasksel --list」でインストール可能なパッケージを確認できる。 または # apt-get install apache2 # apt-get install php5 libapache2-mod-php5 # apt-get install mysql-server 「# apt-get update」で最新のパッケージリストを取得 「# apt-cache search キーワード」でパッケージ名検索 手動起動 # /etc/init.d/apache2 start # /etc/init.d/mysql start ●Fedora Core # yum install httpd # yum install php php-mbstring php-mysql # yum install mysql mysql-server # yum installed | grep httpd # yum installed | grep php # yum installed | grep mysql 手動起動 # /etc/init.d/httpd start # /etc/init.d/mysqld start 自動起動設定 # chkconfig httpd on # chkconfig mysqld on ●FreeBSD # cd /usr/ports/www/apache22 # make install # cd /usr/ports/lang/php5 # make configure # make install # cp php.ini-dist /usr/local/etc/php.ini # cd /usr/ports/lang/php5-extensions # make configure # make install # cd /usr/ports/database/mysql50-server # make configure # make install # cd /usr/local/mysql # bin/mysql_install_db --user=mysql # rehash mysql_install_dbで権限テーブルを作成します。 手動起動 # apachectl start # /usr/local/mysql/bin/mysqld_safe & apachectlスクリプトがなければhttpd -k start 自動起動設定(/etc/rc.conf) apache22_enable="YES" apache22_http_accept_enable="YES" mysql_enable="YES" もしくは/usr/local/etc/rc.d以下に起動シェルを作成など ●ソースを落としてきて手動インストール # cd /usr/local/src # fetch や wget, ftpなどで落としてくる # tar zxvf php-4.4.6.tar.gz # tar zxvf apache_1.3.37.tar.gz # tar zxvf mysql-4.1.22.tar.gz # groupadd mysql # useradd -g mysql -c "MySQL Server" mysql # cd mysql-4.1.22 # chown -R root.root * # make clean # ./configure \ --prefix=/usr/local/mysql \ --localstatedir=/usr/local/mysql/data \ --disable-maintainer-mode \ --with-mysqld-user=mysql \ --with-unix-socket-path=/tmp/mysql.sock \ --without-comment \ --without-debug \ --without-bench # make # make install # ./scripts/mysql_install_db # chown -R root:mysql /usr/local/mysql # chown -R mysql:mysql /usr/local/mysql/data # cp support-files/my-medium.cnf /etc/my.cnf # chown root:sys /etc/my.cnf # chmod 644 /etc/my.cnf # echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf # ldconfig # cp ./support-files/mysql.server /etc/rc.d/init.d/mysql # chmod +x /etc/rc.d/init.d/mysql # chkconfig --level 3 mysql on # cd /usr/local/src/apache_1.3.37 # make clean # ./configure \ --prefix=/usr/local/apache \ --enable-shared=max \ --enable-module=rewrite \ --enable-module=so # make # make install # cd /usr/local/src/php-4.4.6 # ./configure \ --with-apxs=/usr/local/apache/bin/apxs \ --disable-debug \ --enable-ftp \ --enable-inline-optimization \ --enable-magic-quotes \ --enable-mbstring \ --enable-mm=shared \ --enable-safe-mode \ --enable-track-vars \ --enable-trans-sid \ --enable-wddx=shared \ --enable-xml \ --with-dom \ --with-gd \ --with-gettext \ --with-mysql=/usr/local/mysql \ --with-regex=system \ --with-xml \ --with-zlib-dir=/usr/lib # make # make install # cp php.ini-dist /usr/local/lib/php.ini インストール後、設定確認 [httpd.conf] LoadModule php5_module libexec/apache22/libphp5.so AddType application/x-httpd-php .php [php.ini] register_globals = Off magic_quotes_gpc = Off short_open_tag = Off extension=php_mbstring.dll php.iniの場所がわからなければphpinfo()関数の表示を確認 php.iniファイルがなければ、php.ini-distなどをコピー
公式サイトからソースを取得します。
wgetやfetchコマンド、またはftpなどで手元にソースを持ってきます。 手元で展開できる形式ならどれでもいいです。
--helpオプションで、事前に各種ファイルのディレクトリ配置の確認ができます。
--prefixを変更したい場合は、以下のようにして配置を確認できます。
配置が決まれば実際にconfigureコマンドで環境に合ったMakefileを作成する際にこのときのオプションを渡します。
どんなモジュールがあって、どれがインストールされるかを--show-layoutオプションで確認できます。
個々にモジュールを指定するのは面倒なので、とりあえす全部入れて後でコメントにすればモジュールロードしなくて済むようにします。
「# tasksel --list」でインストール可能なパッケージを確認できる。
「# apt-get update」で最新のパッケージリストを取得 「# apt-cache search キーワード」でパッケージ名検索
mysql_install_dbで権限テーブルを作成します。
apachectlスクリプトがなければhttpd -k start
もしくは/usr/local/etc/rc.d以下に起動シェルを作成など
インストール後、設定確認
php.iniの場所がわからなければphpinfo()関数の表示を確認
php.iniファイルがなければ、php.ini-distなどをコピー
[conf/httpd.conf] KeepAlive On MaxKeepAliveRequests 500 # DNSで名前解決できるホスト名(ホスト名が付いてなければIPアドレス) ServerName www.example.com:80 # ブラウザからhttp://www.example.comでリクエストされた場合にhttp://www.example.com/に補完 UseCanonicalName On # apacheバージョンを非表示に ServerSignature Off # 80番ポート以外を使う Listen 192.168.0.1:8080 # リクエストURL省略時に呼ばれる優先順位 DirectoryIndex index.html index.php # DNSによる逆引きを行うかどうか HostnameLookups Off Windows環境でのパス指定は、ディレクトリパスを"/"で区切り、ダブルクォートで囲む "C:/path/to/windows/dir" ディレクトリ単位で設定するための<Directory>コンテナ ファイル単位で設定するための<Files>コンテナ URLアドレス単位で設定するための<Location>コンテナ 上記3種のコンテナがあり、<Directory>⇒<Files>⇒<Location>の順番で設定が上書きされた上で反映される。 これらはそれぞれ<Directory ~ "">, <Files ~ "">, <Location ~ "">とすることで正規表現を使えるようになり、それぞれ<DirectoryMatch>, <FilesMatch>, <LocationMatch>と同じになります。 AllowOverride None Options All Optionsには、ディレクトリオプションを設定します。 All ...MultiViews以外のすべて ExecCGI ... CGI FollowSymLinks ...シンボリックリンクをディレクトリとして許可 Includes ...SSI IncludesNOEXEC ...SSI(#exec #include以外) Indexes ...ディレクトリインデックスがない場合にディレクトリ内一覧ページを表示 MultiViews ...ネゴシエーションを許可してAddLanguageを有効にする SymLinksIfOwnerMatch ...ユーザIDが一致する場合だけシンボリックリンク許可 Options ExecCGI Includesのように複数指定する場合は半角スペース区切りで連ねて書きます。指定しない場合はOptions Noneとします。 一方、Options +ExecCGI -Includesのような記述が使えます。これは上位階層にOptions指定があればそれを継承した上での設定(+なら追加、-なら削除)になります。 SSI設定 AllowOverride None Options +Includes AddType text/html .shtml AddHandler server-parsed .shtml システムユーザ用のディレクトリ指定 UserDir /path/to/*/public_html AllowOverride None Options All .htaccessファイルの無効化 Options FollowSymLinks AllowOverride None "AllowOverride None"指定で無効にできます。 .htaccessファイルの有効化 Options FollowSymLinks AllowOverride Limit : AccessFileName .htaccess : Order allow,deny Deny from all Satisfy All AllowOverride AllまたはLimitで有効にできます。 AddHandlerでファイルタイプ(拡張子)と関連付け Alias /cgi-bin/ "/path/to/cgi" Options ExecCGI AddHandler cgi-script .cgi 拡張子で関連付けしないで、ディレクトリやURLで関連付けるには SetHandler server-parsed SSIを有効にする設定 ディレクトリを丸ごとスクリプト専用にする ScriptAlias /cgi-bin/ "/path/to/cgi" AllowOverride None Optiones None Order allow,deny Allow from all リダイレクト設定(要mod_alias) Redirect /foo http://www.example.com/bar カスタムエラードキュメント ErrorDocument 404 /error404.html ログ CustomLog logs/access.log common #CustomLog logs/access.log combined combinedを選ぶと、リファラーとUAの出力を行う。 特定のリクエストをログ保存しない SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" nolog CustomLog /path/to/access.log common env=!nolog ドキュメントルート以外の場所を使う Alias /foo/ "/path/to/foo/" AllowOverride None Options None
Windows環境でのパス指定は、ディレクトリパスを"/"で区切り、ダブルクォートで囲む "C:/path/to/windows/dir"
上記3種のコンテナがあり、<Directory>⇒<Files>⇒<Location>の順番で設定が上書きされた上で反映される。
これらはそれぞれ<Directory ~ "">, <Files ~ "">, <Location ~ "">とすることで正規表現を使えるようになり、それぞれ<DirectoryMatch>, <FilesMatch>, <LocationMatch>と同じになります。
Optionsには、ディレクトリオプションを設定します。
Options ExecCGI Includesのように複数指定する場合は半角スペース区切りで連ねて書きます。指定しない場合はOptions Noneとします。
一方、Options +ExecCGI -Includesのような記述が使えます。これは上位階層にOptions指定があればそれを継承した上での設定(+なら追加、-なら削除)になります。
AllowOverride AllまたはLimitで有効にできます。
IPアドレス共通で、複数のホスト名がDNSで設定(CNAME)されてる場合 Listen 80 NameVirtualHost *:80 DocumentRoot /path/to/html2 ServerName www2.example.com DocumentRoot /path/to/html3 ServerName www3.example.com Listern 80 ServerName www.example.com DocumentRoot /path/to/html1 # バーチャルホストとして受付けるIPアドレス NameVirtualHost 192.168.0.1 DocumentRoot /path/to/html1 ServerName www2.example.com DocumentRoot /path/to/html2 ServerName www3.example.com バーチャルホスト以外へのリクエストはwww.example.comがデフォルトで受付ける 違うIPアドレスでリクエストされても、同じコンテンツを返す NameVirtualHost 192.168.0.1 NameVirtualHost 192.168.10.1 DocumentRoot /path/to/html1 ServerName www.example.com ServerAlias www <VirtualHost *>とも書ける ローカルでは単にwwwで名前解決できる 違うポートでサイト運営 Listen 80 Listen 8080 NameVirtualHost 192.168.0.1:80 NameVirtualHost 192.168.0.1:8080 ServerName www.example.com DocumentRoot /path/to/www80 ServerName www.example.com DocumentRoot /path/to/www8080 別のホスト名があれば、<VirtualHost>コンテナを増やせばよい IPベースのバーチャルホスティング Listen 80 DocumentRoot /path/to/www1 ServerName www1.example.com DocumentRoot /path/to/www2 ServerName www2.example.com
バーチャルホスト以外へのリクエストはwww.example.comがデフォルトで受付ける
<VirtualHost *>とも書ける
ローカルでは単にwwwで名前解決できる
別のホスト名があれば、<VirtualHost>コンテナを増やせばよい
アクセス制御はhttpd.confに記述したり、設定が許可されていれば.htaccessに記述する場合があります。 .htaccessを有効にするには、<Directory>コンテナのAllowOverrideディレクティブを使うことになります。 AllowOverride All All以外にもLimitとしても設定できます。 AuthConfig ...認証関連 FileInfo ...ドキュメントタイプ制御(ErrorDocument,SetHandler,rewrite,などが関連する) Indexes ...ディレクトリインデックス制御(DirectoryIndexなど) Limit ...アクセス制御(.htaccess) Options ...ディレクトリの機能指定(Options=ExecCGI,Includesのように使う?) まずすべてを拒否した上で、許可設定を追加していく流れとなる。 Order deny,allow Deny from all 上記を書くことですべて拒否しているので、あとは許可する設定を追加していく Order allow,deny Allow from all これで/path/to/foo領域内だけをアクセス許可できたことになる。 一方、一部のみを許可するには、先に拒否した上で、許可するものだけを個別に書く : Order deny,allow Deny from all Allow from 192.168.1. : 特定のファイル名をアクセス制限 Order deny,allow Deny from all URLでアクセス制限 Order deny,allow Deny from all 上記はURLがhttp://www.example.com/fooで始まる場合にアクセス制限 パスワード認証 AllowOverride AuthConfig AuthType Basic AuthName "Auth Access" AuthUserFile /path/to/foo/.htpasswd Require valid-user .htpasswdファイルの設定は、以下のコマンドで行う。 # /path/to/apache/bin/htpasswd -c /path/to/foo/.htpasswd username 既に存在する.htpasswdへの追加エントリーの場合は以下を # /path/to/apache/bin/htpasswd /path/to/foo/.htpasswd username2 作成した.htpasswdファイルの中身は username:aYx2sDNc80tyZ username2:hdGz8huDC16iq 行儀のよい検索エンジンのクローラーを制御 [htdocs/robots.txt] User-agent: * Disallow: /
アクセス制御はhttpd.confに記述したり、設定が許可されていれば.htaccessに記述する場合があります。
.htaccessを有効にするには、<Directory>コンテナのAllowOverrideディレクティブを使うことになります。
All以外にもLimitとしても設定できます。
.htpasswdファイルの設定は、以下のコマンドで行う。
既に存在する.htpasswdへの追加エントリーの場合は以下を
作成した.htpasswdファイルの中身は
行儀のよい検索エンジンのクローラーを制御
■ OpenSSLをインストール ApacheでSSL通信に対応させるには、暗号化機能を提供するツールを利用することになる。 その代表的なものがOpenSSLになる。 最近は初めからOpenSSLが用意されている環境も多い。 インストールされているかどうかはopensslコマンドで確認できる。 $ openssl version ■ mod_sslを有効にする ApacheからOpenSSLを利用するために、mod_sslモジュールを組み込んで連携させることになる。 mod_sslモジュールが組み込まれているかどうかはhttpdコマンドで確認できる。 $ httpd -M 大量に表示されるのでgrepコマンドがあれば見やすいように絞り込める $ httpd -M | grep ssl 組み込まれたmod_sslモジュールが有効になってるかどうかは設定ファイルを確認 Apache設定ファイル [${APACHE_HOME}/conf/httpd.conf] LoadModule ssl_module modules/mod_ssl.so : Include conf/extra/httpd-ssl.conf ここまでが前準備となる。 次にopensslコマンドを使ってSSL通信に必要な「秘密鍵」「公開鍵」「デジタル証明書」の3つを作成していく。 秘密鍵と公開鍵はペアのものを作成することになる。 内訳はserver.key(秘密鍵)、server.csr(CSRファイル:公開鍵+証明書申請情報)、server.crt(デジタル証明書)といった感じになる。 ●秘密鍵を作成 適当な場所に移動してそこに作成 $ cd ${APACHE_HOME}/conf $ openssl genrsa -des3 1024 > server.key 実行すると、秘密鍵のパスフレーズ入力を求められる ●公開鍵を作成 CSRファイルは認証局からデジタル証明書を発行してもらうときに必要になる。 $ openssl req -new -key server.key > server.csr 実行すると、秘密鍵作成の時に設定したパスフレーズ入力が求められるので正しく入力すればその次に所在地や組織名などの入力を求められる。 また、Windowsの場合は以下の方法で作成する。 $ openssl req -config /path/to/openssl.cnf -new -key server.key > server.csr いずれも作成した秘密鍵を渡すことでペアとなる公開鍵を作成している。 ●デジタル証明書を作成 SSL通信には信用ある機関のお墨付きが必要となる。 そのための正式なデジタル証明書を発行してもらうためには費用や手間がかかる。 グローバルなネットワーク上に内輪だけで利用するサイトを設置する場合や開発用のテスト機などで手軽に使うためには認証局を使わずに自分で証明書を発行して使うこともできれば便利。 ただしこの方法を使うと最初にアクセスした時に警告ページが表示される。 $ openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 この時もまた、秘密鍵のパスフレーズ入力が求められる。 以上で鍵と証明書の作成は完了。 ■その他 このままではApache起動時にパスフレーズ入力が求められるので最後に秘密鍵のパスフレーズを解除する細工をする。 $ mv server.key server.key_master $ openssl rsa -in server.key_master > server.key ここでもまた秘密鍵のパスフレーズ入力が求められるので、秘密鍵作成時に入力したパスフレーズを入力する。 conf/extra/httpd-ssl.confの設定確認 SSLCertificateFile、SSLCertificateKeyFileなどへのパス設定を先ほど作成したものと一致させる。 ではApache起動 $ apachectl startssl
ApacheでSSL通信に対応させるには、暗号化機能を提供するツールを利用することになる。 その代表的なものがOpenSSLになる。
最近は初めからOpenSSLが用意されている環境も多い。 インストールされているかどうかはopensslコマンドで確認できる。
ApacheからOpenSSLを利用するために、mod_sslモジュールを組み込んで連携させることになる。
mod_sslモジュールが組み込まれているかどうかはhttpdコマンドで確認できる。
大量に表示されるのでgrepコマンドがあれば見やすいように絞り込める
組み込まれたmod_sslモジュールが有効になってるかどうかは設定ファイルを確認
ここまでが前準備となる。
次にopensslコマンドを使ってSSL通信に必要な「秘密鍵」「公開鍵」「デジタル証明書」の3つを作成していく。 秘密鍵と公開鍵はペアのものを作成することになる。
内訳はserver.key(秘密鍵)、server.csr(CSRファイル:公開鍵+証明書申請情報)、server.crt(デジタル証明書)といった感じになる。
●秘密鍵を作成
適当な場所に移動してそこに作成
実行すると、秘密鍵のパスフレーズ入力を求められる
●公開鍵を作成
CSRファイルは認証局からデジタル証明書を発行してもらうときに必要になる。
実行すると、秘密鍵作成の時に設定したパスフレーズ入力が求められるので正しく入力すればその次に所在地や組織名などの入力を求められる。
また、Windowsの場合は以下の方法で作成する。
いずれも作成した秘密鍵を渡すことでペアとなる公開鍵を作成している。
●デジタル証明書を作成
SSL通信には信用ある機関のお墨付きが必要となる。 そのための正式なデジタル証明書を発行してもらうためには費用や手間がかかる。
グローバルなネットワーク上に内輪だけで利用するサイトを設置する場合や開発用のテスト機などで手軽に使うためには認証局を使わずに自分で証明書を発行して使うこともできれば便利。
ただしこの方法を使うと最初にアクセスした時に警告ページが表示される。
この時もまた、秘密鍵のパスフレーズ入力が求められる。
以上で鍵と証明書の作成は完了。
■その他
このままではApache起動時にパスフレーズ入力が求められるので最後に秘密鍵のパスフレーズを解除する細工をする。
ここでもまた秘密鍵のパスフレーズ入力が求められるので、秘密鍵作成時に入力したパスフレーズを入力する。
conf/extra/httpd-ssl.confの設定確認
SSLCertificateFile、SSLCertificateKeyFileなどへのパス設定を先ほど作成したものと一致させる。
ではApache起動
ディレクトリインデックスを装飾(要mod_autoindex) IndexOptions FancyIndexing IndexOptions IconHeight=16 IconWidth=16 IndexIgnore .htaccess *.bak costomHeader.html HeaderName customHeader.html IconHeightおよびIconWidthにアイコンサイズを指定することでロード時間を短縮できる IndexIgnoreディレクティブを使って、一覧に載せたくないものを指定できる HeaderNameディレクティブは、インデックス一覧の先頭に挿入される。 ユーザ用URLアドレスから~チルダを抜き取る方法 AliasMatch ^/home/([^/]+)/(.*) /home/$1/public_html/$2 プロクシサーバ設定 mod_proxyを組み込む必要あり LoadModule proxy_module modules/mod_proxy.so ProxyRequests On CacheRoot "/path/to/proxy" CacheSize 5 # 自分のサーバだけを使用許可する Order deny,allow Deny from all Allow from ourdomain.example.com ProxyVia Block # 特定ホストへのアクセスを禁止 #ProxyBlock foo.example.com bar.example.com デフォルトサイズが5KBなので、空き容量の20%程度を設定 ProxyVia BlockでViaヘッダが取り除かれる
IconHeightおよびIconWidthにアイコンサイズを指定することでロード時間を短縮できる
IndexIgnoreディレクティブを使って、一覧に載せたくないものを指定できる
HeaderNameディレクティブは、インデックス一覧の先頭に挿入される。
デフォルトサイズが5KBなので、空き容量の20%程度を設定
ProxyVia BlockでViaヘッダが取り除かれる
基本設定 KeepAlive On MaxKeepAliveRequests 200 TimeOut 60 # ここは少ないほど軽くなる DirectoryIndex index.html index.php # DNSによる逆引きを行わない HostNameLookups Off <Directory>コンテナの基本 AllowOverride None Options FollowSymLinks AllowOverride Noneで上位階層の設定を継承しないようにして、basic認証や.htaccessも使えないようにする。 Options FollowSymLinksにすることで、シンボリックリンクかどうか確認を行うシステムコールを発行させないで済む あとは不要なモジュールをコメントにして、ログ保存もコメントにする
AllowOverride Noneで上位階層の設定を継承しないようにして、basic認証や.htaccessも使えないようにする。
Options FollowSymLinksにすることで、シンボリックリンクかどうか確認を行うシステムコールを発行させないで済む
httpd.confの記述チェック # httpd -t Syntax OKが出ればOK 組み込まれたモジュールリストの確認 # httpd -l 起動と停止 # httpd -k {start|stop|restart|graceful} これはapachectlスクリプトと同じ # httpd -f /path/to/customHttpd.conf -k start カスタマイズした設定ファイルで起動する Apacheベンチマークabコマンド # ab -n 100 -c 10 http://localhost/ 同時リクエスト10発行して、100リクエストに達するまで行う
これはapachectlスクリプトと同じ
カスタマイズした設定ファイルで起動する
同時リクエスト10発行して、100リクエストに達するまで行う
[/etc/newsyslog.conf] /var/log/httpd-error.log 640 7 * @T00 Z /var/log/httpd-access.log 640 7 * @T00 Z /var/run/httpd.pid 30 定期的にログを切り分けるだけでは古いログファイルに書き込みが行われつづける。 したがってログ切り分け直後にgracefulでの再起動(処理を最後まで待ってから再起動)をするようにUSR1シグナルを送る必要がある。 これが末尾に記述した30ということになる。 先に記述したエラーログから切り分けられて、つづけてアクセスログを切り分けたところでシグナルを送るようにすればOK これでウェブのユーザには気づかれることなく華麗に切り分けられたということですな
定期的にログを切り分けるだけでは古いログファイルに書き込みが行われつづける。
したがってログ切り分け直後にgracefulでの再起動(処理を最後まで待ってから再起動)をするようにUSR1シグナルを送る必要がある。 これが末尾に記述した30ということになる。
先に記述したエラーログから切り分けられて、つづけてアクセスログを切り分けたところでシグナルを送るようにすればOK
これでウェブのユーザには気づかれることなく華麗に切り分けられたということですな