■HTTPD
※Webサーバを構築する ※IPアドレスでアクセスしたときはIPアドレスもしくはサーバ名だけが表示されるページにアクセス、 ドメインを指定してアクセスしたら対応するページにアクセス。 とすると管理しやすいかも ※バーチャルホストが不要な案件でも、後々検収環境が追加されたりを想定して、常にバーチャルホストにしておくといいかも バーチャルホストの設定方法は etcetera.txt を参照 ※バーチャルホストにした場合、access_log にサブドメインが残らないのでページを判別しづらい (リファラには表示されるが、外部からアクセスされたときなどはダメ) サブドメイン名を記録するか、サブドメインごとにログファイルを分けておいた方が良さそう ※PHP5.6を使うならApacheは2.4をインストールする。詳細は programming.txt を参照 ■インストール 参考:Webサーバー構築(Apache) http://centossrv.com/apache.shtml # yum -y install httpd … httpdをインストール # vi /etc/httpd/conf/httpd.conf … httpdの設定ファイルを編集
#ServerTokens OS ServerTokens Prod … エラーページなどでOS名を表示しないようにする #ServerName www.example.com:80 ServerName refirio.net:80 … サーバー名を指定(設定しておかないと、サーバ起動時に警告が表示される Webサーバが複数ある場合は「ServerName web1.refirio.net:80」など) <Directory "/var/www/html"> #Options Indexes FollowSymLinks Options Includes ExecCGI FollowSymLinks …CGI、SSIを許可する場合 #AllowOverride None AllowOverride All ….htaccessを許可する場合 #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 … 長すぎるURI(414エラー)をログに記録しない場合 LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i %v" combined … 処理時間やプロキシのIPなども記録する例 # # For a single logfile with access, agent, and referer information # (Combined Logfile Format), use the following directive: # SetEnvIf Request_URI "favicon\.ico" no_log … faviconへのアクセスをログに記録しない場合に追加 SetEnvIf Request_URI "default\.ida" no_log … wormからのアクセスをログに記録しない場合に追加 SetEnvIf Request_URI "cmd\.exe" no_log … 同上 SetEnvIf Request_URI "root\.exe" no_log … 同上 SetEnvIf Request_URI "Admin\.dll" no_log … 同上 SetEnvIf Request_URI "NULL\.IDA" no_log … 同上 SetEnvIf Remote_Addr 192.168.1 no_log … 内部からのアクセスをログに記録しない場合に追加 SetEnvIf Remote_Addr 127.0.0.1 no_log … 自ホストからのアクセスをログに記録しない場合に追加 CustomLog logs/access_log combined env=!no_log … 上記以外のアクセスをログに記録する #ServerSignature On ServerSignature Off … エラーページでサーバー情報を表示しないようにする #AddDefaultCharset UTF-8 … UTF-8以外でページを作成する場合はコメントアウト(文字化け対策) #AddHandler cgi-script .cgi AddHandler cgi-script .cgi .pl … .plをCGIとして実行する場合 <Directory "/var/www/icons"> #Options Indexes MultiViews FollowSymLinks Options MultiViews FollowSymLinks … iconsディレクトリのファイル一覧を表示しないように AllowOverride None Order allow,deny Allow from all </Directory>
# rm -f /etc/httpd/conf.d/welcome.conf … テストページを削除 # rm -f /var/www/error/noindex.html … 同上 # ln -s /usr/bin/perl /usr/local/bin/perl … Perlコマンドへ /usr/local/bin/perl でもアクセスできるように # whereis perl … Perlのパスを確認 perl: /usr/bin/perl /usr/local/bin/perl /usr/share/man/man1/perl.1.gz # chown apache. /var/www/ … 公開用ディレクトリの所有者をapacheに変更 # chmod 775 /var/www/ … apacheグループのユーザに読み書き実行を許可 # chown apache. /var/www/html/ … ドキュメントルートの所有者を「apache」に変更 # chmod 775 /var/www/html/ … apacheグループのユーザに読み書き実行を許可 # ll /var/www/ … ドキュメントルートの所有者を確認 合計 24 drwxr-xr-x 2 root root 4096 10月 5 11:45 cgi-bin drwxr-xr-x 3 root root 4096 10月 9 00:19 error drwxr-xr-x 5 refirio refirio 4096 9月 27 17:43 html drwxr-xr-x 3 root root 4096 9月 27 09:29 icons # chown apache. /var/www/cgi-bin/ … 必要なら他のフォルダにも同様の設定を行う # chmod 775 /var/www/cgi-bin/ # chown apache. /var/www/error/ # chmod 775 /var/www/error/ # chown apache. /var/www/icons/ # chmod 775 /var/www/icons/ # service httpd configtest … 設定ファイルの構文をチェック # service httpd start … httpdを起動 httpd を起動中: [ OK ] # chkconfig httpd on … httpdの自動起動を設定 ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定(80ポートを開ける)
#HTTPを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 ■動作確認 # vi /var/www/html/index.html … テストページ作成
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>テスト</title> </head> <body> <p>テスト。</p> </body> </html>
http://refirio.net/ のようにブラウザからアクセスを確認
■SSL(有料証明書なしでSSLを導入する場合)
※暗号化して通信する ■インストール(サーバ用秘密鍵・証明書作成) 参考:Webサーバー間通信内容暗号化(Apache+mod_SSL) http://centossrv.com/apache-ssl.shtml 参考:CentOS(さくらのVPS)に、mod_sslをインストール http://havelog.ayumusato.com/develop/server/e168-centos-mod_ssl-install.html # yum -y install mod_ssl … mod_sslインストール # cd /etc/pki/tls/certs/ … ディレクトリ移動 # sed -i 's/365/3650/g' Makefile … サーバ用証明書有効期限を1年から10年に変更 # make server.crt … サーバ用秘密鍵・証明書作成 umask 77 ; \ /usr/bin/openssl genrsa -des3 1024 > server.key Generating RSA private key, 1024 bit long modulus .................++++++ ............++++++ e is 65537 (0x10001) Enter pass phrase: … 任意のパスワードを設定(表示はされない) Verifying - Enter pass phrase: … 任意のパスワードを確認(表示はされない) umask 77 ; \ /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 3650 -out server.crt -set_serial 0 Enter pass phrase for server.key: … 上で設定したパスワードを入力(表示はされない) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP … 国名を設定 State or Province Name (full name) [Berkshire]:Tokyo … 都道府県名を設定 Locality Name (eg, city) [Newbury]:Shibuya … 市区町村名を設定 Organization Name (eg, company) [My Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 # openssl rsa -in server.key -out server.key … サーバ用秘密鍵からパスワード削除(Webサーバ起動時にパスワードを要求されないように) Enter pass phrase for server.key: … サーバ用秘密鍵・証明書作成時のパスワードを入力(表示はされない) writing RSA key ■インストール(サーバ用秘密鍵・証明書設定) # vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集
SSLCertificateFile /etc/pki/tls/certs/server.crt … サーバ用証明書を指定 SSLCertificateKeyFile /etc/pki/tls/certs/server.key … サーバー用秘密鍵を指定 # General setup for the virtual host, inherited from global configuration #DocumentRoot "/var/www/html" DocumentRoot "/var/www/html" … #を削除(コメントを解除) # SSL Protocol support: # List the enable protocol levels with which clients will be able to # connect. Disable SSLv2 access by default: #SSLProtocol all -SSLv2 SSLProtocol all -SSLv2 -SSLv3 … SSLv2、SSLv3を無効化する(POODLE SSLv3.0 脆弱性問題対処)
# service httpd restart … Apacheを再起動して、パスワードを要求されないことを確認 httpd を停止中: [ OK ] httpd を起動中: [ OK ] ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定(443ポートを開ける)
#HTTPSを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 https://refirio.net/ のようにブラウザからアクセスを確認
■SSL(有料証明書でSSLを導入する場合)
※証明書を更新することを想定して、鍵や証明書などの名前には年月日を含めた方が良さそう ※証明書の価格に差はあるが、これは信頼性による差。暗号化の強度に差は無い ただし安い証明書は、「証明書に聞き慣れない会社の名前が表示される」「サイトシールがない」などの問題があるので注意する ※SSLを購入する際、ワイルドカードとして購入しなければ複数のサブドメインには対応できない ただしワイルドカードはフィーチャーフォンに対応できない可能性が上がるので注意する ワイルドカードは高額なので注意 https://www.ssl.ph/globalsign/option/wildcard.html ■インストール(mod_sslをインストールしていない場合) 参考:Webサーバー間通信内容暗号化(Apache+mod_SSL) http://centossrv.com/apache-ssl.shtml 参考:CentOS(さくらのVPS)に、mod_sslをインストール http://havelog.ayumusato.com/develop/server/e168-centos-mod_ssl-install.html # yum -y install mod_ssl … mod_sslインストール # service httpd restart … Apacheを再起動 httpd を停止中: [ OK ] httpd を起動中: [ OK ] ■SSL証明書発行(GMOグローバルサインの例) ※以降は有料の証明書を導入する場合 CSR … refirio.net.csr … 公開鍵の情報が含まれる 中間証明書 … ica.refirio.net.crt … ブラウザによっては、これが無くてもエラーにならない 秘密鍵 … refirio.net.key … 流出してはいけない 参考:[CSR生成] Apache 2.x + mod_ssl + OpenSSL(新規・更新) https://jp.globalsign.com/support/csr/04.html?service=ssl 参考:[インストール] Apache 2.x + mod_ssl + OpenSSL(新規・更新) https://jp.globalsign.com/support/server/03.html?service=ssl 参考:認証レベルの違い https://jp.globalsign.com/service/ssl/knowledge/types-of-ssl.html ■CSR生成 ※CSRとは、サーバ証明書を発行するための署名要求(Certificate Signing Request) ※秘密鍵があれば、CSRは何度でも生成できる。秘密鍵を無くさないように注意 ※秘密鍵は同じものを使えるが、毎回違うものを使うほうがセキュリティ上好ましい 参考:CSRについて教えてください。 https://jp.globalsign.com/support/faq/65.html # openssl version … OpenSSLがインストールされているか確認 OpenSSL 1.0.1e-fips 11 Feb 2013 # cd /etc/httpd/conf/ … ディレクトリ移動 # mkdir ssl.key … 秘密鍵用のディレクトリを作成 # openssl genrsa -des3 -out ./ssl.key/refirio.net.20160130.key 2048 … 秘密鍵を生成 Generating RSA private key, 2048 bit long modulus ......+++ .............+++ e is 65537 (0x10001) Enter pass phrase for ./ssl.key/refirio.net.20160130.key: … 任意のパスワードを設定(表示はされない) Verifying - Enter pass phrase for ./ssl.key/refirio.net.20160130.key: … 任意のパスワードを確認(表示はされない) # mkdir ssl.csr … CSR用のディレクトリを作成 # openssl req -new -key ./ssl.key/refirio.net.20160130.key -out ./ssl.csr/refirio.net.20160130.csr … CSRを生成 Enter pass phrase for ./ssl.key/refirio.net.20160130.key: … 上で設定したパスワードを入力(表示はされない) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP … 国名を設定 State or Province Name (full name) []:Tokyo … 都道府県名を設定 Locality Name (eg, city) [Default City]:Shibuya … 市区町村名を設定 Organization Name (eg, company) [Default Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 ※クイック認証の場合、管理者メールアドレスは不要みたい ※サブドメイン secure.refirio.net で利用するとして、サーバが複数台構成のために web1.refirio.net のような名前の場合、 「Common Name」には「secure.refirio.net」を入力する。つまり、あくまでも「ブラウザでサーバにアクセスする際に入力するURL」となる。 参考:コモンネームについて教えてください。 https://jp.globalsign.com/support/faq/67.html Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: … 空Enter An optional company name []: … 空Enter # cd ssl.key … ssl.keyディレクトリに移動 # openssl rsa -in refirio.net.20160130.key -out refirio.net.20160130.key … サーバ用秘密鍵からパスワード削除(Webサーバ起動時にパスワードを要求されないように) Enter pass phrase for refirio.net.20160130.key: … サーバ用秘密鍵・証明書作成時のパスワードを入力(表示はされない) writing RSA key # cat ../ssl.csr/refirio.net.20160130.csr … CSRの内容を確認 -----BEGIN CERTIFICATE REQUEST----- MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTEVMBMG 〜省略〜 bzhh/X0SHFCYaHAHIJYLUx2Ii3265wENEwdsteXVps8zTyuKw6jZaq/1 -----END CERTIFICATE REQUEST----- ■証明書申し込み(GMOグローバルサインの例) https://system.globalsign.com/au/signon/gacp/login.do からログインし、「証明書発行」を選択して申し込む 1. サービス選択 ※以下は入力例 サービス クイック認証SSL キャンペーン/クーポンコード 使用しない コモンネームオプション 無し サブドメインへの対応が不要でよければ 署名ハッシュアルゴリズム SHA256 契約期間 1年 乗り換え いいえ 更新 いいえ 期間カスタマイズオプション なし 2. 技術担当者情報入力 自動入力で入力し、必要があれば編集する 「メール送信先に指定」にチェックしておくと、 技術担当者情報で設定したメールアドレスにも申し込み完了メールなどが届く 3. CSR DN情報入力 「CSRを利用する」のままで、サーバサイドで生成したCSRを貼り付ける 次へ進むとCSR内容確認が表示される。以下は例 CSR解析結果 / スキップ入力内容 審査される証明書の内容 CN refirio.net refirio.net O refirio.net OU Domain Control Validated L Shibuya S Tokyo C 日本 - JP 日本 - JP E refirio@example.com 鍵長 2048 2048 メールでの認証やMETAタグでの認証など、任意の認証方法を選択する 4. 支払い方法入力 クレジットカードか銀行振込を選択する 5. 確認 内容を確認し、同意して完了する 6. 完了 オーダーIDと、以降の流れが表示される 同時に「サーバ証明書お申し込み受付」メールが送信されるので確認する ■証明書インストール ※AWSでロードバランサに証明書を設定する場合の手順は aws.txt を参照 # mkdir /etc/httpd/conf/ssl.crt/ … 証明書用のディレクトリを作成 # vi /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 証明書の内容を全てコピーして貼り付ける MIIE4DCCA8igAwIBAgISESFyQfmhMxTM6H2txGeH/YImMA0GCSqGSI 〜略〜 TlmDVg== -----END CERTIFICATE-----
# vi /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 中間証明書の内容を全てコピーして貼り付ける MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQ 〜略〜 EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= -----END CERTIFICATE-----
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集(バーチャルホストを指定していない場合) # vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル編集(バーチャルホストを指定している場合。etcetera.txt も参照)
SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用の設定を確認&編集 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.20160130.key … 秘密鍵用の設定を確認&編集 SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用の設定を追加
# service httpd stop … Apacheを停止(restartでは正常に読み込まれないことがある) httpd を停止中: [ OK ] # service httpd start … Apacheを起動 httpd を起動中: [ OK ] ■確認 念のため、再度opensslコマンドやhttpsアクセスでテストし、HTTP接続やSSL接続に問題がないか確認する # openssl s_client -connect refirio.net:443 -showcerts … SSLが正しく設定されているか確認 CONNECTED(00000003) depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA … CN(この場合はGlobalSign)を確認 verify return:1 depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Domain Validation CA - SHA256 - G2 verify return:1 depth=0 OU = Domain Control Validated, CN = refirio.net verify return:1 〜以下略〜 サーバに https:// でアクセスして、SSL接続に問題がないか確認する (必要に応じて、ファイヤーウォールも設定する) # service httpd restart … Apacheを再起動して、パスワードを要求されないことを確認 httpd を停止中: [ OK ] httpd を起動中: [ OK ] サイトにSSLのサイトシールを掲載する(サイトが信頼できることを示すもの) https://jp.globalsign.com/service/ssl/siteseal/ ■バーチャルホスト バーチャルホストでSSLを使用する場合は etcetera.txt も参照
■SSL(有料証明書を更新する場合)
※秘密鍵は同じものを使えるが、毎回違うものを使うほうがセキュリティ上好ましい ※万が一問題が発生しても戻せるように、以前の秘密鍵や証明書は削除せずに置いておく 参考:CSRについて教えてください。 https://jp.globalsign.com/support/faq/65.html ■CSR生成 # cd /etc/httpd/conf/ … ディレクトリ移動 # openssl genrsa -des3 -out ssl.key/refirio.net.20160130.key 2048 … 秘密鍵を生成 Generating RSA private key, 2048 bit long modulus ....+++ ......+++ e is 65537 (0x10001) Enter pass phrase for ssl.key/refirio.net.20160130.key: … 任意のパスワードを設定(表示はされない) Verifying - Enter pass phrase for ssl.key/refirio.net.20160130.key: … 任意のパスワードを確認(表示はされない) # openssl req -new -key ssl.key/refirio.net.20160130.key -out ssl.csr/refirio.net.20160130.csr … CSRを生成 Enter pass phrase for ssl.key/refirio.net.20160130.key: … 上で設定したパスワードを入力(表示はされない) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:JP … 国名を設定 State or Province Name (full name) []:Osaka … 都道府県名を設定 Locality Name (eg, city) [Default City]:Osaka … 市区町村名を設定 Organization Name (eg, company) [Default Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 ※新規導入の時と同じ内容でいい Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: … 空Enter An optional company name []: … 空Enter # openssl rsa -in ssl.key/refirio.net.20160130.key -out ssl.key/refirio.net.20160130.key … サーバ用秘密鍵からパスワード削除(Webサーバ起動時にパスワードを要求されないように) Enter pass phrase for refirio.net.20160130.key: … サーバ用秘密鍵・証明書作成時のパスワードを入力(表示はされない) writing RSA key # vi .ssl.csr/refirio.net.20160130.csr … CSRの内容を確認
-----BEGIN CERTIFICATE REQUEST----- MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVPc2FrYTEVMBMG 〜省略〜 bzhh/X0SHFCYaHAHIJYLUx2Ii3265wENEwdsteXVps8zTyuKw6jZaq/1 -----END CERTIFICATE REQUEST-----
■証明書申し込み 新規に購入してもいいが、更新した方が得かも ■証明書インストール ※AWSでロードバランサに証明書を設定する場合の手順は aws.txt を参照 # vi /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 証明書の内容を全てコピーして貼り付ける MIIE4DCCA8igAwIBAgISESFyQfmhMxTM6H2txGeH/YImMA0GCSqGSI 〜略〜 TlmDVg== -----END CERTIFICATE-----
# vi /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用のファイルを作成
-----BEGIN CERTIFICATE----- … 中間証明書の内容を全てコピーして貼り付ける MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQ 〜略〜 EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= -----END CERTIFICATE-----
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集(バーチャルホストを指定していない場合) # vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル編集(バーチャルホストを指定している場合)
#SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.crt #SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.key #SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.crt SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.20160130.crt … 証明書用の設定を編集 SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.20160130.key … 秘密鍵用の設定を編集 SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.20160130.crt … 中間証明書用の設定を追加
※万が一問題が発生しても戻せるように、削除ではなくコメントアウトにする # service httpd stop … Apacheを停止(restartでは正常に読み込まれないことがある) httpd を停止中: [ OK ] # service httpd start … Apacheを起動 httpd を起動中: [ OK ] ■確認 念のため、再度opensslコマンドやhttpsアクセスでテストし、HTTP接続やSSL接続に問題がないか確認する # openssl s_client -connect refirio.net:443 -showcerts … SSLが正しく設定されているか確認 CONNECTED(00000003) depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA … CN(この場合はGlobalSign)を確認 verify return:1 depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Domain Validation CA - SHA256 - G2 verify return:1 depth=0 OU = Domain Control Validated, CN = refirio.net verify return:1 〜以下略〜 サーバに https:// でアクセスして、SSL接続に問題がないか確認する # service httpd restart … Apacheを再起動して、パスワードを要求されないことを確認 httpd を停止中: [ OK ] httpd を起動中: [ OK ]
■FTPD
※FTPサーバを構築する ※SSHでもファイルを転送できる(SFTP)ので必須ではない ■インストール 参考:FTPサーバー構築(vsftpd) http://centossrv.com/vsftpd.shtml 参考:さくらのVPSを使ってみる【9】-vsftpdをインストールしてみる http://pro-grammer.info/archives/902 # yum -y install vsftpd … vsftpdインストール # vi /etc/vsftpd/vsftpd.conf … vsftpd設定ファイル編集
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO … anonymousユーザ(匿名ユーザ)のログイン禁止 # Activate logging of uploads/downloads. xferlog_enable=YES … /var/log/vsftpd.logに接続・転送を記録(1/3) # You may override where the log file goes if you like. The default is shown # below. xferlog_file=/var/log/vsftpd.log … /var/log/vsftpd.logに接続・転送を記録(2/3) # If you want, you can have your log file in standard ftpd xferlog format xferlog_std_format=NO … /var/log/vsftpd.logに接続・転送を記録(3/3) # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. ascii_upload_enable=YES … アスキーモードでのアップロードを許可 ascii_download_enable=YES … アスキーモードでのダウンロードを許可 # You may fully customise the login banner string: ftpd_banner=Welcome to blah FTP service. … FTPログイン時にソフト名とバージョンが表示されないようにする # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). chroot_local_user=YES … デフォルトでホームディレクトリより上層へのアクセスを禁止する chroot_list_enable=YES … ホームディレクトリより上層へのアクセスを許可する場合 # (default follows) chroot_list_file=/etc/vsftpd/chroot_list … ホームディレクトリより上層へのアクセスを許可する場合 # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. ls_recurse_enable=YES … ディレクトリごと削除できるようにする 以下を最下行へ追加 use_localtime=YES … タイムスタンプ時間を日本時間にする(時差が発生したら削除する) pasv_addr_resolve=YES … PASVモード接続先IPアドレスをホスト名から取得する(要検証) pasv_address=refirio.net … PASVモード接続先IPアドレスが牽けるホスト名(要検証) pasv_min_port=60000 … PASVモード接続時の最小ポート番号 pasv_max_port=60030 … PASVモード接続時の最大ポート番号 ssl_enable=YES … SSLの有効化 rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem … サーバー証明書を指定 force_local_logins_ssl=NO … ログイン時にSSL接続を強制しない場合 force_local_data_ssl=NO … データ転送時にSSL接続を強制しない場合
# echo username >> /etc/vsftpd/chroot_list … FTPサーバーへのアクセスを禁止するユーザを登録する場合 # cd /etc/pki/tls/certs/ … ディレクトリ移動 [root@centos certs]# make vsftpd.pem … サーバー証明書作成 umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:1024 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ; \ cat $PEM1 > vsftpd.pem ; \ echo "" >> vsftpd.pem ; \ cat $PEM2 >> vsftpd.pem ; \ rm -f $PEM1 $PEM2 Generating a 1024 bit RSA private key .................................++++++ ................................++++++ writing new private key to '/tmp/openssl.OH7090' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP … 国名を設定 State or Province Name (full name) [Berkshire]:Tokyo … 都道府県名を設定 Locality Name (eg, city) [Newbury]:Shibuya … 市区町村名を設定 Organization Name (eg, company) [My Company Ltd]:refirio.net … 組織名を設定(なんでもいい) Organizational Unit Name (eg, section) []: … 空Enter(もしくは部署名を設定) Common Name (eg, your name or your server's hostname) []:refirio.net … コモンネーム(Webサーバー名)を設定。SSL購入時に申請するものと一致させる Email Address []:refirio@example.com … 管理者メールアドレスを設定 # cd … ホームディレクトリへ戻る # service vsftpd start … vsftpd起動 vsftpd 用の vsftpd を起動中: [ OK ] # chkconfig vsftpd on … vsftpd自動起動設定 ■ファイヤーウォール設定(iptablesを使用している場合の設定) # vi /etc/sysconfig/iptables … ファイヤーウォールを設定
#FTPを許可 -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 60000:60030 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動 要検証 : iptableでpassiveFTPを許可する場合(SFTPを使用する場合は不要) http://www.geocities.jp/gronlijus/skill/linux/linux-iptables-ftp.html ■FTP用ユーザを作成 ※SSHでログインできない、ホームディレクトリが /var/www のユーザを作成するものとする ※apacheグループを使うかは要検討 webmasterグループなどを作って使うと、Apacheから公開フォルダ内にファイルを作成する場合に保存できない? # adduser --shell /sbin/nologin --home /var/www username1 … ユーザを作成 # adduser --shell /sbin/nologin --home /var/www username2 # usermod -a -G apache username1 … ユーザをapacheグループに追加 # usermod -a -G apache username2 # passwd username1 … ユーザにパスワードを設定 # passwd username2 ※必要なら接続元IP制限を行う ※userlistを使えばブラックリスト形式、ホワイトリスト形式のいずれかでFTPアクセスを許可するユーザを指定できる ユーザは /etc/vsftpd/user_list で指定できる ★FTPSで接続できない?証明書が必要?要検証
■PHP
※プログラミング言語PHPを導入する ※CentOS6では、未だにデフォルトでPHP5.3がインストールされる PHP5.6を使う方法は etcetera.txt を参照 ■インストール # yum -y install php php-mbstring php-gd … php、php-mbstring、gdをインストール # vi /etc/php.ini … phpの設定ファイルを編集
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED error_reporting = E_ALL … & ~E_NOTICE & ~E_DEPRECATED を削除 ;date.timezone = date.timezone = Asia/Tokyo … Asia/Tokyo を設定 ;mbstring.language = Japanese mbstring.language = Japanese … 行頭の ; を削除 ;mbstring.internal_encoding = EUC-JP mbstring.internal_encoding = UTF-8 … 行頭の ; を削除し、EUC-JP を UTF-8 に修正 ;mbstring.http_input = auto mbstring.http_input = pass … 行頭の ; を削除し、auto を pass に修正 ;mbstring.http_output = SJIS mbstring.http_output = pass … 行頭の ; を削除し、SJIS を pass に修正 ;mbstring.encoding_translation = Off mbstring.encoding_translation = Off … 行頭の ; を削除 ;mbstring.detect_order = auto mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII … 行頭の ; を削除し、auto を UTF-8,SJIS,EUC-JP,JIS,ASCII に修正 ;mbstring.substitute_character = none; mbstring.substitute_character = none; … 行頭の ; を削除 ;mbstring.func_overload = 0 mbstring.func_overload = 0 … 行頭の ; を削除 ;mbstring.strict_detection = Off mbstring.strict_detection = Off … 行頭の ; を削除
必要に応じて error_reporting や short_open_tag なども設定する セキュリティ対策に、expose_phpもOffにしておくと良さそう Apacheの挙動に関する設定ファイルは /etc/httpd/conf.d/php.conf に作られるので、必要に応じて編集する # service httpd restart … httpdを再起動 httpd を起動中: [ OK ] ■動作確認 公開ディレクトリ内に phpinfo.php を作成し、以下を記述する ブラウザからアクセスし、PHPの情報が表示されることを確認する <?php phpinfo() ?>
■MySQL
※データベースMySQLを導入する ■MariaDBについて CentOS7ではMySQL互換のMariaDBが標準のデータベースとなっている。使い方は基本的にMySQLと同じ 参考:ネコでもわかる!さくらのVPS講座 〜第四回「phpとMariaDBをインストールしよう」 http://knowledge.sakura.ad.jp/knowledge/9006/ 以降はCentOS6でのMySQLインストール方法 ■全体的な設定について ※MySQL5.5.3以降なら、utf8mb4にするといい。それ以前ならutf8にするといい(utf8mb4については後述) 参考:mysqlについて、機能とかInnoDBとか文字コード等々 http://blog.cototoco.net/tag/utf8mb4/ ■インストール 参考:データベースサーバー構築(MySQL) http://centossrv.com/mysql.shtml # yum -y install mysql-server … mysql-serverをインストール # vi /etc/my.cnf … MySQLの設定ファイルを編集
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 character-set-server = utf8 … 追加(MySQLサーバーの文字コードをUTF-8にする)
# service mysqld start … MySQL起動 MySQL データベースを初期化中: Installing MySQL system tables... OK Filling help tables... OK 〜略〜 Please report any problems with the /usr/bin/mysqlbug script! [ OK ] mysqld を起動中: [ OK ] # chkconfig mysqld on … MySQL自動起動設定 # mysql_secure_installation … MySQL初期設定 NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): … 空Enter OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. Set root password? [Y/n] … 空Enter(rootパスワード設定) New password: … rootパスワード入力 Re-enter new password: … rootパスワード入力確認 Password updated successfully! Reloading privilege tables.. ... Success! By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] … 空Enter(匿名ユーザー削除) ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] … 空Enter(リモートからのrootログインを禁止) ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] … 空Enter(testデータベースを削除) - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] … 空Enter ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! ■動作確認 # mysql -u root -p … MySQLへrootでログイン Enter password: … MySQLのrootパスワードを入力 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 to server version: 4.1.12 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> GRANT ALL PRIVILEGES ON test.* TO webmaster@localhost IDENTIFIED BY '1234'; … testへのすべてのアクセス権限を持った、ユーザwebmasterを作成 Query OK, 0 rows affected (0.00 sec) mysql> SET PASSWORD FOR webmaster@localhost=PASSWORD('abcd'); … webmaster@localhostのパスワードを「abcd」に変更する場合 Query OK, 0 rows affected (0.00 sec) mysql> REVOKE ALL PRIVILEGES ON test.* FROM webmaster; … webmasterユーザからtestへのアクセス権限を剥奪する場合 Query OK, 0 rows affected (0.00 sec) mysql> SELECT user FROM mysql.user WHERE user='webmaster'; … webmasterユーザ登録確認 +-----------+ | user | +-----------+ | webmaster | +-----------+ 1 row in set (0.00 sec) mysql> exit … ログアウト Bye # mysql -u webmaster -p … webmasterユーザでMySQLサーバーへログイン Enter password: … webmasterのパスワードを入力 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 to server version: 4.1.12 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE DATABASE test; … testデータベース作成(文字コードを指定しない場合) mysql> CREATE DATABASE test DEFAULT CHARACTER SET utf8; … testデータベース作成(文字コードを指定する場合) Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES; … データベース作成確認 +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.01 sec) mysql> USE test … testデータベースへ接続 Database changed mysql> exit … ログアウト Bye ■PHPから接続 # yum -y install php-mysql … php-mysqlをインストール # service httpd restart … httpdを再起動 httpd を起動中: [ OK ] ※スロークエリの設定も行っておくといい。次回設定時に追記する ■アクセス権限の追加 参考:MySQLのGRANT(権限)の追加/削除/確認 http://takuya-1st.hatenablog.jp/entry/2015/03/22/120618 mysql> SHOW GRANTS FOR webmaster; … webmasterユーザの権限を確認 +-----------------------------------------------------------------------+ | Grants for webmaster@% | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'webmaster'@'%' IDENTIFIED BY PASSWORD <secret> | | GRANT ALL PRIVILEGES ON `test`.* TO 'webmaster'@'%' | +-----------------------------------------------------------------------+ 2 rows in set (0.01 sec) mysql> GRANT ALL PRIVILEGES ON sample.* TO webmaster; … webmasterユーザにsampleデータベースの権限を追加 Query OK, 0 rows affected (0.02 sec) mysql> SHOW GRANTS FOR webmaster; … webmasterユーザの権限を再度確認 +-----------------------------------------------------------------------+ | Grants for webmaster@% | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'webmaster'@'%' IDENTIFIED BY PASSWORD <secret> | | GRANT ALL PRIVILEGES ON `test`.* TO 'webmaster'@'%' | | GRANT ALL PRIVILEGES ON `sample`.* TO 'webmaster'@'%' | +-----------------------------------------------------------------------+ 3 rows in set (0.01 sec) ■utf8mb4 設定ファイルの /etc/my.cnf で以下のように文字コードを設定しておく これでutf8mb4のテーブルを扱うことができる(MySQL5.5.3以降) character-set-server = utf8mb4 以下のようにテーブルを作成すると文字コードがutf8になる 4バイト文字を登録すると「?」と表示される CREATE TABLE char_test( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', text VARCHAR(255) NOT NULL COMMENT 'テキスト', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '文字コードテスト'; INSERT INTO char_test(text) VALUES('4バイト文字を含むテキスト'); 以下のようにテーブルを作成すると文字コードがutf8mb4になる 4バイト文字を登録するとそのまま扱える PHPからMySQLに接続する際、「SET NAMES utf8mb4」としておく CREATE TABLE char_test( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', text VARCHAR(255) NOT NULL COMMENT 'テキスト', PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '文字コードテスト'; INSERT INTO char_test(text) VALUES('4バイト文字を含むテキスト'); ローカル環境のXAMPPでデータベースを作成する場合、 普段 utf8_general_ci にしていたので utf8mb4_general_ci とした 参考:MySQL で utf8 と utf8mb4 の混在で起きること http://tmtms.hatenablog.com/entry/2016/09/06/mysql-utf8 参考:MySQLの文字コードをutf8mb4に変更 http://qiita.com/deco/items/bfa125ae45c16811536a
■PostgreSQL
※データベースPostgreSQLを導入する ■インストール 参考:yumによるRPMパッケージのアンインストール http://fedorasrv.com/memo/log/37.shtml 参考:PostgreSQL インストール http://www.server-world.info/query?os=CentOS_6&p=postgresql 参考:PostgreSQL 9.3をCentOS 6.5へインストールして初期設定 http://ossfan.net/setup/postgresql-20.html 参考:データベースサーバの構築(PostgreSQL) http://kajuhome.com/postgresql.shtml 参考:CentOSでPostgreSQL!一般ユーザ用のDBを作って操作する方法! http://senoway.hatenablog.com/entry/2013/09/21/231706 # rpm -q postgresql … 古いPostgreSQLを削除する場合 postgresql-8.4.20-1.el6_5.x86_64 # yum remove postgresql # yum -y install postgresql-server … postgresql-serverをインストール # service postgresql initdb … データベース初期化 データベースを初期化中: [ OK ] # vi /var/lib/pgsql/data/postgresql.conf … PostgreSQLの設定ファイルを編集
# 59行目:コメント解除して変更(他ホストからのアクセスも受け付ける場合) listen_addresses = '*' # 334行目:コメント解除して変更(ログの形式を [日時 ユーザー DB 〜]とする) log_line_prefix = '%t %u %d '
# service postgresql start … PostgreSQL起動 postgresql サービスを開始中: [ OK ] # chkconfig postgresql on … PostgreSQL自動起動設定 ■動作確認 ※OSのユーザとPostgreSQLのユーザが一致している必要があるため、あらかじめOSのユーザを作成しておく # useradd webmaster … 一般ユーザ「webmaster」を作成(作成していない場合) # passwd webmaster … 「webmaster」のパスワードを設定(作成していない場合) # su - postgres … postgres ユーザーにスイッチしてパスワード設定 (postgresユーザはPostgreSQLインストール時に自動的に作成される) -bash-4.1$ psql -c "ALTER USER postgres WITH PASSWORD '1234'" ALTER ROLE -bash-4.1$ createuser webmaster … DBユーザー「webmaster」を新規登録 Shall the new role be a superuser? (y/n) y# DBの管理者権限を与える場合は「y」 # su - webmaster … webmasterユーザに切り替え $ createdb test … testデータベースを作成 $ psql -l … データベース作成確認 $ psql test … testデータベースに接続 psql (8.4.20) "help" でヘルプを表示します. test=# ALTER USER webmaster WITH PASSWORD '1234'; … ユーザにパスワードを設定 ALTER ROLE test=# CREATE TABLE test(no INT, name TEXT); … テーブルを作成&テスト CREATE TABLE test=# INSERT INTO test VALUES(1, 'taro'); INSERT 0 1 test=# SELECT * FROM test; no | name ----+------ 1 | taro (1 行) test=# DROP TABLE test; DROP TABLE test=# \q … ログアウト ■PHPから接続 ※設定しないと、PHPから接続した時に「Ident認証に失敗しました」となる 「Linux上のアカウントとPostgreSQLのアカウントが一致しないとエラーにする」という設定で、あらかじめ設定されているもの PHPはapache権限で実行されるため、ユーザが異なるとみなされる 参考:CentOS で PostgreSQL を使ってみよう!(2) http://lets.postgresql.jp/documents/tutorial/centos/2 # vi /var/lib/pgsql/data/pg_hba.conf … クライアント認証ファイルを編集
# "local" is for Unix domain socket connections only … 丸ごとコメントアウト #local all all ident # IPv4 local connections: #host all all 127.0.0.1/32 ident # IPv6 local connections: #host all all ::1/128 ident local all all trust … 代わりに以下の設定を追加 host all all 127.0.0.1/32 trust host all all ::1/128 trust host all all 0.0.0.0/0 password
※スロークエリの設定も行っておく。次回設定時に追記する
■nginx
※Apacheの代替になり得るとされているWebサーバ ※Apacheよりも大量のアクセスを捌くことができるとされている ※Basic認証やリダイレクトの方法がApacheと同じではないので注意 nginxの設定ファイルに記述する必要があり、SSHで設定再読み込みやミドルウェア再起動が発生する 参考:Nginxとは?Apacheとの違いについてエンジニアに聞いてみた https://academy.gmocloud.com/qa/20160616/2761 参考:EC2(Amazon Linux)に Nginx をインストールしてBasic認証する http://dev.classmethod.jp/etc/amazon_linux_nginx_basic_auth/ 参考:Nginxセキュリティ設定 http://qiita.com/hideji2/items/1421f9bff2a97a5e5794 参考:nginxのパラメータチューニングとh2o http://qiita.com/cubicdaiya/items/235777dc401ec419b14e 参考:Apacheからnginxへ移行する際に気になったことメモ https://qiita.com/nayuneko/items/a3b326e2e9466e4117d6 参考:Nginx導入時やること - Qiita https://qiita.com/kidach1/items/985efebba639713c562e ■インストール # yum -y install nginx … nginxをインストール # service nginx start … nginxを起動 # chkconfig nginx on … nginxの自動起動を設定 ■動作確認 ブラウザからアクセスすると /usr/share/nginx/html/index.html が表示される 公開ディレクトリを変更したい場合、以下の設定を行う # vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集
http { server_tokens off; … 追加。nginxのバージョン番号をエラーページとServer headerに含まれないようにする server { listen 80 default_server; listen [::]:80 default_server; #server_name localhost; server_name refirio.net; … サーバー名を指定 #root /usr/share/nginx/html; root /var/www/html; … 公開ディレクトリを変更する場合
アクセスログとエラーログは以下の場所にある /var/log/nginx/access.log /var/log/nginx/error.log ログフォーマットも /etc/nginx/nginx.conf で変更できる 参考:ELB経由のnginxでアクセス元IPアドレスをアクセスログの$remote_addrとして書くようにする - Qiita https://qiita.com/toshihirock/items/1de2613bb7c95d486dc1 参考:nginx: ログ出力形式の変更と、ログにレスポンスタイムを出力する方法 - エラーの向こうへ https://tech.mktime.com/entry/259 ■PHPを使う ※FPM(FastCGI Process Manager)は、PHPのFastCGI実装のひとつ。nginxがphp-fpmと通信してPHPを実行する HHVM(HipHop Virtual Machine)というものもあり、動作が軽量らしい 参考:CentOSにてnginxでPHPを動かす http://qiita.com/utano320/items/36b6eac2bbd5bb5657f6 参考:EC2にnginx+php(php-fpm socket)環境を最速で構築 http://qiita.com/koni/items/05158e33b4c8aac07b59 参考:nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc 参考:HHVM を導入して、PHP実行環境を高速化する | しょぼんブログ https://syobon.jp/2017/01/30/hhvm-install/ # yum -y install php php-fpm … php、php-fpmをインストール # vi /etc/php-fpm.d/www.conf … php-fpmの設定ファイルを編集
#user = apache user = nginx #group = apache group = nginx # vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集 #index index.html index.htm; index index.php index.html index.htm; … インデックスページにPHPを追加 #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} location ~ \.php$ { root /var/www/html; … パスを設定 fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; … パスを設定 include fastcgi_params; }
# service php-fpm start … php-fpmを起動 # chkconfig php-fpm on … php-fpmの自動起動を設定 # service nginx restart … nginxを再起動 これでnginxでPHPを使うことができる 必要に応じて php-mbstring や gd もインストールし、/etc/php.ini も設定する ■リバースプロキシを使う ※ロードバランサーのように負荷分散を行うが、ロードバランサーとは異なりレスポンスはリバースプロキシが返す これにより、リバースプロキシがレスポンスをキャッシュして負荷を軽減させたりなどができる 参考:Nginxによるリバースプロキシの設定方法 http://qiita.com/schwarz471/items/9b44adfbec006eab60b0 参考:Nginx でリバースプロキシサーバーつかってみる。Apache -> Nginx http://qiita.com/murachi1208/items/d04797b0b61e69018938 参考:リバースプロキシって何?触りだけ学んだサーバー/インフラ入門 http://qiita.com/growsic/items/fead30272a5fa374ac7b 参考:Nginx でリバースプロクシを立てるときに気にすべき proxy_next_upstream 設定 - 無印吉澤 http://muziyoshiz.hatenablog.com/entry/2017/10/25/235114 ここでは以下2台のサーバがあるものとし、 203.0.113.1 サーバにアクセスしたときに 203.0.113.2 サーバの内容を返すように設定するものとする http://203.0.113.1/(プライベートIP 10.0.0.1) ... nginxが動作しているものとする http://203.0.113.2/(プライベートIP 10.0.0.2) ... Apache+PHPが動作しているものとする □203.0.113.1 # vi /etc/nginx/conf.d/proxy.conf … リバースプロキシ用の設定ファイルを作成
server { server_name refirio.net; … サーバー名を指定 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location /sample/ { … sampleディレクトリをプロキシアクセスにする proxy_pass http://10.0.0.2/sample/; … 10.0.0.2 サーバにアクセスさせる } location /sample2/ { … sample2ディレクトリをプロキシアクセスにする proxy_pass http://10.0.0.2/sample2/; … 10.0.0.2 サーバにアクセスさせる } }
# service nginx restart … nginxを再起動 □203.0.113.2 特に設定しなくても動作に問題はないが、そのままだとアクセスログには 203.0.113.1 のIPアドレスのみが記録されることになる /etc/httpd/conf/httpd.conf のLogFormatに %{X-Forwarded-For}i を追加すると、アクセスした人本来のIPアドレスが記録される ■リバースプロキシでキャッシュを使う ※アプリケーションサーバのレスポンスをnginxがキャッシュすることにより、負荷軽減&高速化を実現できる ※WordPressなどに使用する場合、管理ページではキャッシュさせないなどの対応が必要 参考:Nginx - リバースプロキシキャッシュ設定(基本的)! http://www.mk-mode.com/octopress/2014/04/23/nginx-proxy-cache-setting/ 参考:【nginx】WordPress でキャッシュしてはいけないページ(ファイル、ディレクトリ)設定!!! http://oki2a24.com/2014/07/03/set-do-not-cache-wordpress-page/ 参考:nginxで特定のページをキャッシュさせないように設定したい https://teratail.com/questions/13018 正規表現で「URLに○○が含まれている場合はキャッシュを返さない」のように設定できるみたい。要調査 参考:nginxでWordPressの設定する時に出てくるディレクティブのメモ https://nskw-style.com/2012/server/nginx-directives.html 特定URLの場合にキャッシュさせない、はできるみたい。要調査 □203.0.113.1 # mkdir /var/cache/nginx … キャッシュと一時ファイル保存用のディレクトリを作成 # chown nginx. /var/cache/nginx # vi /etc/nginx/nginx.conf … nginxの設定ファイルを編集
「index index.php index.html index.htm;」の次の行に以下を追加 proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-key:8m max_size=50m inactive=120m; proxy_temp_path /var/cache/nginx/tmp; … キャッシュと一時ファイル保存用のディレクトリ
# vi /etc/nginx/conf.d/proxy.conf … リバースプロキシ用の設定ファイルを編集
「location /sample/ { 〜 }」のブロック内に以下を追加 proxy_ignore_headers Cache-Control; … バックエンド側のCache-Controlヘッダでno-cache が指定されていても無視する proxy_cache my-key; proxy_cache_valid 200 302 60m; … HTTPレスポンスが200か302の場合は60分キャッシュする proxy_cache_valid 404 10m; … HTTPレスポンスが404の場合は10分キャッシュする
# service nginx restart … nginxを再起動 キャッシュをクリアしたい場合、以下のディレクトリ内にあるデータをすべて削除する /var/cache/nginx/cache/ /var/cache/nginx/tmp/ ■ロードバランサーにする 参考:nginxをHTTPロードバランサのように使う http://mogile.web.fc2.com/nginx/http/load_balancing.html ※未検証 /etc/nginx/nginx.conf で以下の設定を追加し、
upstream myapp { server web1.example.com; server web2.example.com; server web3.example.com; }
/etc/nginx/conf.d/proxy.conf で以下のように設定すれば、処理の振り分けができるみたい
location / { proxy_pass http://myapp; }
/etc/nginx/nginx.conf で以下のように設定すると、リクエストの 3/5 はweb1に向かうみたい
upstream myapp { server web1.example.com weight=3; server web2.example.com; server web3.example.com; }
AWSならELBを使う方が可用性の担保が容易 nginxをロードバランサーにする場合、ELBとは違い可用性は独自に担保する必要がある FloatingIPにするなどを検討する 参考:EC2 Nginx で高可用性+ロードバランス(Floating IP パターン) https://blog-kazuhisya.rhcloud.com/2014/08/10/floating-ip-with-nginx-load-balancer/