[Centos6]apache + php + postgresql
| Table of Contents |
はじめに
CentOS 6.2でapache,PHP,PostgreSQLの環境を構築します。
動作確認としてPHPからPostgreSQLへ接続します。
環境
-
OS
- CentOS 6.2 (kernel 2.6.32-220.4.1.el6)
-
パッケージ
- httpd-2.2.15-15.el6
- mod_ssl-2.2.15-15.el6
- php-5.3.3-3.el6_2.6
- php-gd-5.3.3-3.el6_2.6
- php-pgsql-5.3.3-3.el6_2
- php-mbstring-5.3.3-3.el6_2
- postgresql91-libs-9.1.3-1PGDG.rhel6.x86_64
- postgresql91-9.1.3-1PGDG.rhel6.x86_64
- postgresql91-server-9.1.3-1PGDG.rhel6.x86_64
PostgreSQLのインストール
パッケージのインストール
-
yumを利用してpostgresql9.1をインストールするため、下記postgresqlのサイトからCentOS用リポジトリを検索します。
http://yum.postgresql.org/repopackages.php
-
今回は下記の通リポジトリを追加します。
# rpm -ivh http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-centos91-9.1-4.noarch.rpm
-
postgresql-serversのインストール
# yum install postgresql91-server
データベースクラスタの初期化
-
postgresユーザに切り替えます。
# su - postgres
-
.bash_profileに環境変数を追加します。
$ vi ~postgres/.bash_profileexport PATH=$PATH:/usr/pgsql-9.1/binexport POSTGRES_HOME=/usr/pgsql-9.1export PGLIB=$POSTGRES_HOME/libexport PGDATA=/var/lib/pgsql/9.1/dataexport MANPATH="$MANPATH":$POSTGRES_HOME/share/manexport LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
-
環境変数を反映します。
$ source ~postgres/.bash_profile
-
データベースクラスタの初期化を行います。
$ initdb --no-locale -D /var/lib/pgsql/9.1/data -E UTF-8
-
--no-locale
ロケールは言語や文化に応じた処理をするOSの機構です。
PostgreSQLではデータのソート処理に使用しますが英語や日本語のデータを扱う場合は不要です。
有効にすると、ロケール処理の分、ソート処理などが遅くなるため無効にします。
-
-D
データベースの保存場所を指定します。
PostgreSQLの設定
postgresql.confの編集
-
パラメータ設定ファイル「postgresql.conf」を編集します。
$ vi /var/lib/pgsql/9.1/data/postgresql.conflisten_addresses = '0.0.0.0'max_connections = 100 shared_buffers = 64MB work_mem = 4MBwal_buffers = 4MB checkpoint_segments = 16# PITR関連の設定wal_level = archivearchive_mode = on archive_command = 'cp "%p" /var/lib/pgsql/9.1/backups/"%f"'# ログ関連の設定log_destination = 'syslog' log_min_error_statement = error # 統計情報関連の設定track_activities = ontrack_counts = on# autovacuum関連の設定autovacuum = on
設定項目 説明 listen_addresses postmasterがクライアントアプリケーションからの接続を監視するTCP/IPホスト名かアドレスを設定します。 max_connections データベースサーバーへの同時接続の最大数を設定します。 shared_buffers データベースサーバで使用される共有メモリバッファのページ数を設定します。 wal_buffers WALデータ用に共有メモリ内で使用されるメモリ量を設定します。 work_mem プランナが問い合わせ実行計画を作成するときに使う、マージソート結合とハッシュ結合のためのメモリ量を指定します。 checkpoint_segments チェックポイントの間隔をセグメントファイル数で設定します。
トランザクションログがここに指定したセグメントファイル数に達した場合、チェックポイントを発生させます。1セグメントは16Mバイト。wal_level デフォルト値はminimalで、クラッシュまたは即時停止から回復するのに必要な情報のみ書き出します。
archiveはWALアーカイビングに必要なロギングを追加し、
hot_standbyは更にスタンバイサーバ上の読み取り専用問い合わせの情報を追加します。archive_mode WALログのアーカイブするかどうか設定します。 archive_command WALログのアーカイブする際の実行コマンドを記載します。
%pはWALログのフルパス名、%fはWALログのファイル名ですlog_destination stderr (標準エラー出力), syslog, csvlogを選択します。複数選択も可能。 log_min_error_statement デフォルトのERRORを設定した場合は、エラー、ログメッセージ、致命的エラー、パニックを引き起こした文がログに記録されます。 track_activities サーバーで実行されているコマンドとその実行開始時刻を収集するか否かを設定します。 track_counts パフォーマンス統計情報を収集するか否かを設定します。
この値をoffにすると、自動バキューム機能が正常に動作しなくなります。autovacuum VACUUMEおよびANALYZEを自動で実行するか否かを設定します。
pg_hba.confの編集
-
次にホスト認証設定ファイル「pg_hba.conf」を編集します。
今回はLAN(192.168.11.0/24 )からの接続はパスワード認証で全データベースにアクセス可能とします。$ vi /var/lib/pgsql/9.1/data/pg_hba.conf# TYPE DATABASE USER CIDR-ADDRESS METHODhost all all 192.168.11.0/24 password
ログの設定
postgresql.confの確認
-
ログをsyslogへ出力する設定を確認します。
# vi /var/lib/pgsql/9.1/data/postgresql.conflog_destination = 'syslog' log_min_error_statement = error
syslogの設定
-
ログを保存するためのディレクトリを作成します。
# mkdir /var/log/postgres# chown postgres:postgres /var/log/postgres
-
ログの出力先を設定します。
# vi /etc/rsyslog.conflocal0.* /var/log/postgres/postgres.log
-
syslogのログローテートにpostgres.logを追加します。
# vi /etc/logrotate.d/syslog/var/log/cron/var/log/maillog/var/log/messages/var/log/secure/var/log/spooler/var/log/postgres{ sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript}
-
rsyslogを再起動します。
# /etc/init.d/rsyslog restart
自動起動の設定
-
chkconfigコマンドで自動起動をONにします
# chkconfig postgresql-9.1 on
-
chkconfigコマンドで自動起動の確認をします。LUNレベル3,5がonになっていれば問題ありません。
# chkconfig --list postgresql-9.1postgresql-9.1 0:off 1:off 2:on 3:on 4:on 5:on 6:off
-
PostgreSQLを起動します。
# /etc/init.d/postgresql-9.1 start
-
psコマンドで起動の確認を行います。
# ps ax |grep post20851 ? S 0:00 /usr/pgsql-9.1/bin/postmaster -p 5432 -D /var/lib/pgsql/9.1/data20853 ? Ss 0:00 postgres: logger process20857 ? Ss 0:00 postgres: writer process20858 ? Ss 0:00 postgres: wal writer process20859 ? Ss 0:00 postgres: autovacuum launcher process20860 ? Ss 0:00 postgres: archiver process20861 ? Ss 0:00 postgres: stats collector process
プロセス名 説明 postmaster DBMSデーモン logger process サーバログ writer process バックグラウンドライタ wal writer process WAL ライタ archiver process アーカイブログ管理 autovacuum launcher process 自動バキューム stats collector process 統計情報
SElinuxの設定
WEBサーバからPostgreSQLへアクセスするためには、WEBサーバ側でSElinuxの設定が必要になります。
PostgreSQLサーバ側の設定は不要です。
-
SElinuxのパラメータを確認します。
# getsebool -a | grep httpdallow_httpd_anon_write --> offallow_httpd_mod_auth_ntlm_winbind --> offallow_httpd_mod_auth_pam --> offallow_httpd_sys_script_anon_write --> offhttpd_builtin_scripting --> onhttpd_can_check_spam --> offhttpd_can_network_connect --> offhttpd_can_network_connect_cobbler --> offhttpd_can_network_connect_db --> off #この設定をonにしますhttpd_can_network_memcache --> offhttpd_can_network_relay --> offhttpd_can_sendmail --> offhttpd_dbus_avahi --> onhttpd_enable_cgi --> onhttpd_enable_ftp_server --> offhttpd_enable_homedirs --> offhttpd_execmem --> offhttpd_read_user_content --> offhttpd_setrlimit --> offhttpd_ssi_exec --> offhttpd_tmp_exec --> offhttpd_tty_comm --> onhttpd_unified --> onhttpd_use_cifs --> offhttpd_use_gpg --> offhttpd_use_nfs --> off
-
該当項目の設定を変更します。
# setsebool -P httpd_can_network_connect_db 1
apacheのインストール
-
apacheとSSLモジュールのインストール
# yum install httpd mod_ssl
PHPのインストール
-
PHPのインストール
# yum install php
-
PHPモジュールの追加(必要に応じて追加します)
-
PostgreSQL関数を利用するためモジュールを追加します。
# yum install php-pgsql
-
マルチバイト文字列関数用のモジュールを追加します。
# yum install php-mbstring
-
画像処理モジュールGDを追加します。
# yum install php-gd
apacheの設定
httpd.confの編集
-
apacheの設定ファイル「/etc/httpd/conf/httpd.conf」を編集します
# vi /etc/httpd/conf/httpd.conf#44行目 ヘッダ情報のセキュリティ対策(ヘッダ情報にapacheのパージョンを出力しない)ServerTokens Prod#277行目 サーバ名を設定しますServerName www.oss-d.net:80#339行目「/var/www/html」以下のディレクトリでhtaccessを有効にしますAllowOverride All#403行目 インデックスファイルの指定 (index.phpを追加)DirectoryIndex index.html index.html.var index.php#537行目 エラーページのセキュリティ対策(サーバのバージョンやホスト名を出力しない)ServerSignature Off#760行目 デフォルトの文字コードを指定しますAddDefaultCharset UTF-8
ssl.confの編集
-
apacheのSSL設定ファイル「/etc/httpd/conf.d/ssl.conf」を編集します
# vi /etc/httpd/conf.d/ssl.conf#112行目 httpsdの使用する公開鍵の場所(デフォルト値)SSLCertificateFile /etc/pki/tls/certs/localhost.crt#119行目 httpsd の使用する秘密鍵の場所(デフォルト値)SSLCertificateKeyFile /etc/pki/tls/private/localhost.key#134行目 中間証明書の場所を指定します。利用するCAによっては設定が必要になります。# 今回はCAを利用せず、自己証明書を利用するため設定しません。#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt#220行目 ログの出力形式(追記します)CustomLog logs/ssl_access_log combined
秘密鍵と証明書の作成
秘密鍵「localhost.key」と自己署名証明書「localhost.crt」を作成します。
- 自己署名証明書は商用サービスなどの第三者がアクセスする環境で利用しないで下さい。
- 第三者がアクセスする場合は、CAから発行された証明書を利用して下さい。
-
カレントディレクトリを変更します。
# cd /etc/pki/tls
-
秘密鍵を生成します。
# openssl genrsa -des3 2048 -rand /var/log/ > private/localhost.key
「Enter PEM pass phrase:」と表示されるので、パスフレーズを入力すると暗号化のための秘密鍵(localhost.key)が生成されます。
-
秘密鍵からパスフレーズを削除します。
「Enter pass phrase for private/localhost.key:」と表示されるので、先ほどのパスフレーズを入力します。# openssl rsa -in private/localhost.key -out private/localhost.keyEnter pass phrase for private/localhost.key:writing RSA key
-
生成された秘密鍵を使って自己署名証明書を発行します(Common NameはURLでのホスト名を入力)
# openssl req -new -x509 -key private/localhost.key \-out certs/localhost.crt -days 3650-----Country Name (2 letter code) [AU]:JPState or Province Name (full name) [Some-State]:Locality Name (eg, city) []:Organization Name (eg, company) [Internet Widgits Pty Ltd]:Organizational Unit Name (eg, section) []:Common Name (eg, YOUR name) []:www.oss-d.netEmail Address []:
PHPの設定
php.iniの編集
-
php.iniでPHPの設定を行います。セキュリティ関連と文字コードの設定が中心です。
尚、文字コードはUTF-8のスクリプトをUTF-8表示する設定です。(文字コード設定については こちら )# vi /etc/php.ini;; 出力バッファリングを無効とする;; ファイルエンコードとブラウザへ出力するエンコードが異なる場合はonにします。output_buffering = Off;; httpヘッダでPHPに関する情報を出力しないexpose_php = Off;; ブラウザにエラーを表示しない(デフォルト)display_errors = Off;; エラーログを記録するlog_errors = On;; エラーログの記録先error_log = syslog;; 変数(Environment, GET, POST, Cookie, Server)をグローバル変数に登録しない(デフォルト)register_globals = Off ;; $HTTP_*_VARS のような古い長い 定義済みの変数 を登録しない(デフォルト)register_long_arrays = Off;; GET,POST,COOKIEの値を自動的にエスケープしない(デフォルト)magic_quotes_gpc = Off;; デフォルトの文字コードを指定default_charset = “UTF-8″;; 動的モジュールのロードしない(デフォルト)enable_dl = Off;; 外部ファイルを読み込まないallow_url_fopen = Off;; 外部のPHPを読み込まない(デフォルト)allow_url_include = Off;; セッションの処理を Cookie のみに限定 (デフォルト)session.use_only_cookies = 1;; セッションIDにMD5(128bit)でなくSHA-1(160bit)を利用する。session.hash_function = 1;; デフォルトの内部エンコーディングを設定mbstring.language = Japanese;; デフォルトの内部エンコーディングを設定mbstring.internal_encoding = UTF-8;; デフォルトのHTTP入力文字エンコーディングを設定mbstring.http_input = auto;; デフォルトのHTTP出力文字エンコーディングを設定mbstring.http_output = UTF-8;; HTTP入力エンコーディング変換を有効にするmbstring.encoding_translation = On;; デフォルトの文字エンコーディング検出順序を設定mbstring.detect_order = auto;; 代替文字のデフォルト値を設定mbstring.substitute_character = none;
apacheの起動設定
自動起動の設定
-
chkconfigコマンドで自動起動をONにします
# chkconfig httpd on
起動
-
apacheを起動します。
# /etc/init.d/httpd start
-
psコマンドでプロセスの確認します。/usr/sbin/httpdがあれば問題ありません。
# ps ax|grep http 1747 ? S 0:00 /usr/sbin/httpd 1900 ? S 0:00 /usr/sbin/httpd 1923 ? Ss 0:00 /usr/sbin/httpd
ファイアウォールの設定
-
TCP 80,443,5432番をアクセス可能にします。(下記はサンプルなので環境に合わせてください)
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
動作確認
Postgresへの接続結果をブラウザに表示させます。
-
apache経由でPostgreSQLにアクセスするために、PostgreSQLにユーザを作成します。
# su postgres$ createuser -P test_user新しいロールのためのパスワード: test_passもう一度入力してください: test_pass新しいロールをスーパーユーザにしますか? (y/n)n新しいロールに対してデータベースを作成する権限を与えますか? (y/n)n新しいロールに対して別のロールを作成する権限を与えますか? (y/n)n
-
データベース接続用のPHPスクリプトを用意します。
# vi /var/www/html/index.php
-
ブラウザで以下にアクセスして「接続OK」と表示されればデータベースへ接続出来ています。
http://www.oss-d.net
-
www.oss-d.netの部分は、環境に合わせて変更して下さい。
-
www.oss-d.netの部分は、環境に合わせて変更して下さい。