■目次
UNIXとLinuxの違いLinuxのディレクトリ構成yumリポジトリC言語でプログラムを作成する流れソースコードからインストールアクセス権メモユーザの停止ユーザのシェルログイン制御SFTP用ユーザの追加(鍵認証なし)FTP用ユーザの追加(グループで管理)cronを使用するApacheにレスポンスタイムを記録Apacheでバーチャルホスト1サーバに複数のSSL証明書を設定するApacheでユーザディレクトリApache+SSLでRC4暗号化を外すTLS1.2の対応状況を確認するApacheでfavicon.icoの404エラーを記録させないnginxでリクエストを操作するnginxにレスポンスタイムを記録nginxでリバースプロキシを使うnginxをロードバランサーにするApache・Nginxのエラーログフォーマットを変更rsync(一方向同期)rsync(双方向同期)メールのキューを削除するroot宛のメールを削除するMySQLのデータベース文字コードMySQLで外部キー制約を無視してインポートPostgreSQLでEUC_JPのデータベースを作成SSIを使用する処理の進捗を表示サーバ2台構成でWordPress(rsyncでファイル双方向同期、MySQLレプリケーションでデータベース同期)独自ドメインを設定する(ムームードメイン)コントロールパネルからリモートコンソールを使う(さくらの専用サーバ)OS再インストール(さくらのVPS)システム障害対策接続元引越時のTODO
■UNIXとLinuxの違い
3分間で人に説明できるようになるUnixとLinuxの違い https://eng-entrance.com/unix_linux
■Linuxのディレクトリ構成
bin ... 一般ユーザ、管理ユーザ向けコマンド。ブートするときに必要な、システムの基本コマンド。binaries sbin ... 管理ユーザ向けコマンド。ブートするときに必要な、管理ユーザ用コマンド etc ... 設定ファイル。Editable Text Configuration(後付の意味) lib ... binやsbinなどに置かれたコマンドやプログラムが利用するライブラリ module ... カーネルモジュール lib64 ... 64bitライブラリ opt ... Linuxインストール後、追加でインストールしたパッケージ(ソフトウェア) dev ... デバイスファイル(ハードウェアもファイルとして扱うという、Linuxの設計思想のため) sys ... ドライバ関連のプロセス srv ... システムに提供された固有のデータ proc ... プロセスファイルシステム。カーネルの情報 boot ... システムの起動に必要なブートローダ関連のファイルや、カーネルイメージ lost+found ... システムのバックアップや復元用 mnt ... 外部記憶装置を配置するディレクトリ(スワップなど) media ... 外部記憶装置を自動的に配置するディレクトリ(CD-ROMなど) root ... rootユーザのホームディレクトリ tmp ... 一時的なファイル。リブートすると消える var ... システム運用中にサイズが変化するファイル。頻繁に書き換えられるデータファイル。variable log ... ログファイル spool ... メールやプリンタジョブ蓄積場所 run ... 起動中サーバのプロセスID tmp ... 一時的なファイル。リブートしても消えない www ... Webサーバ用のデータ usr ... 読み出しが可能でユーザが共有できるファイル bin ... 一般ユーザ、管理ユーザ向けコマンド。ブートのときには使用しない、平常時用の基本コマンド sbin ... 管理ユーザ向けコマンド。ブートのときには使用しない、平常時用のシステム管理コマンド lib ... ライブラリ share ... 筋腫に依存しないファイル local ... Linuxインストール後、追加でインストールしたパッケージ。bin, sbin, lib などにあたるコマンド home ... 一般ユーザのホームディレクトリ Filesystem Hierarchy Standard - Wikipedia https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard Linuxの基本の基本。Linuxの基本的なディレクトリ構成 http://oxynotes.com/?p=5987 Linuxのディレクトリ構造(一覧)を理解する http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html なぜ,/var や /etc が /etc や /cfg というディレクトリ名ではないのか? http://d.hatena.ne.jp/ytakano/20100715/1279219401 WindowsのあのフォルダはUNIX/Linuxで言えばあそこだ http://qiita.com/yuba/items/669f718fe6e62dbaab19
■yumリポジトリ
「yum」は「ヤム」と読む Linuxのパッケージ管理システム。例えば # yum install httpd # yum install nginx のように、コマンドを実行してアプリケーションのインストールなどを行える Yellowdog Updater Modified https://ja.wikipedia.org/wiki/Yellowdog_Updater_Modified IT業界で横行する恥ずかしい英語発音 http://qiita.com/ryounagaoka/items/290885ee3291b393fe1f yum 名前の由来 http://poormemory.seesaa.net/article/356576330.html yumリポジトリ一追加リスト 完全版 http://qiita.com/bezeklik/items/9766003c19f9664602fe
■C言語でプログラムを作成する流れ
■gccの確認 gccはGNUが作成しているフリーのCコンパイラ Linuxではコンパイラはこれを使えばいい $ gcc -dumpversion 4.4.7 ※単に「gcc」のみだと「gcc: no input files」というエラーになる ※gccがインストールされていない場合、以下のコマンドで開発ツールを一括インストールできる # yum -y groupinstall "Base" "Development tools" ■ライブラリ関数 カーネル(kernel。英語で「核」)がLinuxOSの核 ハードウェアを操作するためのソフトウェア部品のことをデバイスドライバ、略してドライバと呼ぶ ドライバを扱えるのはカーネルだけで、カーネルに仕事を頼むためにはシステムコールと呼ばれる仕組みを使用する C言語では、システムコールもライブラリ関数も見た目や使い方は変わらない 関数はLinuxが用意しているライブラリに収められている ライブラリは色々なものがあるが、C言語の重要な命令(例えば printf や exit など)は 標準Cライブラリ(standard C library)、通称libcに格納されている Linuxが普段使用するlibcはGNUが管理するGNU libcで、略してglibcと呼ばれる ■Hello, world! $ mkdir hello $ cd hello/ $ vi hello.c
#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, world!\n"); return 0; }
$ ls hello.c $ gcc hello.c $ ls a.out hello.c $ ./a.out Hello, world! ■出力ファイル名を指定 $ gcc -o hello hello.c $ ./hello Hello, world!
■ソースコードからインストール
基本的に以下の流れでインストールする ただし yum や apt-get など、できるだけコマンドでインストールする方がバージョンアップなど管理が楽 $ cd /usr/local/src … 作業ディレクトリに移動 $ wget https://example.com/example-2.1.tar.gz … ソースコードの圧縮ファイルを取得 $ tar -xvf example-2.1.tar.gz … 圧縮ファイルを解凍 $ cd example-2.1 … 解凍して作成されたディレクトリ内に移動 $ ./configure … インストール環境を調査し、その状況を記述したMakefileファイルを作成 $ make … configureで作成されたMakefileをもとにして、ソースコードをコンパイル $ make install … makeで生成されたバイナリファイルなどを、規定のディレクトリにコピー(インストール) ./configure;make;make installにはどんな意味がある? http://www.itmedia.co.jp/help/tips/linux/l0302.html Makefile ことはじめ - Qiita https://qiita.com/kasei-san/items/ad25df63260e86c5cc71 C言語を使うならMakeを使おうよ - Qiita https://qiita.com/j8takagi/items/74232a00cc33623f7844 cやc++をビルドしたいので ./configureスクリプトの作り方調べた - Qiita https://qiita.com/hadashiA/items/9da2b424965952707a6d make - make installはどこにインストールされる?(77528)|teratail https://teratail.com/questions/77528
■アクセス権メモ
SUIDとは http://www.itmedia.co.jp/enterprise/articles/0804/08/news014.html ■SUID(Set User ID) # ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 2月 22 20:48 2012 /usr/bin/passwd ↑sになっている。どのユーザがプログラムを実行した場合でも、ファイルの所有者の権限で実行される これにより、root権限の無い一般ユーザが /etc/shadow を編集できる ■SGID(Set Group ID) どのユーザがプログラムを実行した場合でも、グループの所有者の権限で実行される ■SUIDとSGIDの確認 # find / -perm -4000 -o -perm -2000 ざっくり概要!Linuxセキュリティに関する基礎知識まとめ https://eng-entrance.com/linux-security-basic ■スティッキービット # ls -ld /tmp drwxrwxrwt. 5 root root 4096 5月 7 17:53 2016 /tmp ↑tになっている。実際のパーミッションに関係なく、ファイルもしくはディレクトリの所有者と、rootユーザーのみが名前の変更と削除を行える すべてのユーザーがファイルやディレクトリを作成できるようにしたいが、作成したファイルやディレクトリを他人が消せないようにしたい という場合に使用される
■ユーザの停止
逆引きUNIXコマンド/ユーザアカウントをロック・アンロックする方法・usermodコマンド http://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E3%8... # usermod -L xxxxx … ユーザ xxxxx をロック(パスワードで認証できなくなる) # usermod -U xxxxx … ユーザ xxxxx のロックを解除 以下の方法でもロック&解除できる # passwd -l xxxxx # passwd -u xxxxx 以下で確認し、パスワードのフィールド(コロン区切りで2つ目の値)の先頭に「!」が追加されていればロック中 # cat /etc/shadow 上記の方法は、どちらもパスワード認証のロック。鍵認証には影響しないので注意 鍵認証の場合は一例だが、以下の方法でロック&解除できる(鍵ファイルを読めないようにしてロック) # chmod 000 /home/xxxxx/.ssh/authorized_keys … ユーザ xxxxx をロック # chmod 600 /home/xxxxx/.ssh/authorized_keys … ユーザ xxxxx のロックを解除
■ユーザのシェルログイン制御
以下の方法で、シェルの使用を禁止・許可することができる # usermod -s /sbin/nologin xxxxx … ユーザ xxxxx のシェルログインを禁止する # usermod -s /bin/bash xxxxx … ユーザ xxxxx のシェルログインを許可する
■SFTP用ユーザの追加(鍵認証なし)
※SFTPは実質SSHなので、ユーザ追加の手順はSSHと同じ # vi /etc/ssh/sshd_config
PasswordAuthentication yes
# useradd webmaster # passwd webmaster # usermod -a -G apache webmaster
■FTP用ユーザの追加(グループで管理)
※公開ディレクトリ上位の権限をapacheに変更、 グループに読み書き実行権限を付与、 FTPユーザにapacheグループを追加、 という手順でアップロードを許可している。以下参考。 # adduser --shell /sbin/nologin --home /var/www/vhosts/main/ refirio-main # passwd refirio-main # adduser --shell /sbin/nologin --home /var/www/vhosts/pre/ refirio-pre # passwd refirio-pre # usermod -a -G apache refirio-main # usermod -a -G apache refirio-pre # chown apache. /var/www/vhosts/main/ # chown apache. /var/www/vhosts/pre/ # chmod 775 /var/www/vhosts/main/ # chmod 775 /var/www/vhosts/pre/
■cronを使用する
# vi /etc/crontab /etc/crontabと/etc/cron.d設定ファイルの書き方 | server-memo.net http://www.server-memo.net/tips/etc-crontab.html 「crontab -e」でも設定できるが危険 crontab -e は「絶対に」使ってはいけない http://d.hatena.ne.jp/ozuma/20120711/1342014448 ただしcrontabコマンドで編集すれば、書式に問題があれば教えてくれるというメリットはある viでファイルを直接編集する場合は、書式チェックはされないので注意 書式自体に問題がある場合、Cron自体が動かずにエラーメールも届かないみたい ユーザごとのcronは /var/spool/cron/ 内に実行ユーザ名のファイルに記録される 具体的には以下のようなファイルに記録される(Webminでcronを登録した場合も、ここに記録される) /var/spool/cron/apache /var/spool/cron/root Cronの実行結果は以下に記録される /var/log/cron ■Cron実行結果のエラーを無視する 以下のように「 >> /dev/null 2>&1」を追加すると、処理中にエラーや警告が発生してもメール通知されない ただしエラーを無視する場合、別途実行ログを残す仕組みの構築を推奨
*/5 * * * * root /root/monitor.sh >> /dev/null 2>&1
いい加減覚えよう。 `command > /dev/null 2>&1`の意味 - Qiita https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea [Server & Network] Crontab: スクリプトを定期的に実行しログを残す http://www.d-wood.com/blog/2013/09/16_4644.html cron で > /dev/null して椅子を投げられないための3つの方法 http://sfujiwara.hatenablog.com/entry/20120613/1339547638 ■Cron実行結果を任意のログファイルに記録 「 >> 」でのリダイレクト先をファイルにすると、ログを記録できる
*/1 * * * * apache /usr/bin/php /var/www/html/cron/test.php >> /var/www/html/cron/cron.log 2>&1
■定期実行用のファイルを置く場合 以下のディレクトリ内にもcron用のファイルを置くことができる /etc/cron.d ... 1分に1回実行される /etc/cron.daily ... 1日に1回実行される /etc/cron.hourly ... 1時間に1回実行される /etc/cron.monthly ... 1ヶ月に1回実行される /etc/cron.weekly ... 1週間に1回実行される /etc/anacrontab ... 1日に1回実行される。その時間に電源が入っていなかったなどがあっても遅延実行される ■Cronの利用を許可する・禁止する 以下のファイルに、Cronの利用を許可する・禁止するユーザの名前を登録できる ファイルがなければ新規に作成する /etc/cron.allow /etc/cron.deny Linux、「/etc/cron.allow」「/etc/cron.deny」とはなんぞや?|マコトのおもちゃ箱 〜ぼへぼへ自営業者の技術メモ〜 http://piyopiyocs.blog115.fc2.com/blog-entry-703.html ■Cronを2サーバで1分ごとに実行する 「*/2」と書くと「0, 2, 4, 6 ...」分に実行され、 「1-59/2」と書くと「1, 3, 5, 7 ...」分に実行される この設定を2つサーバに行うと、2サーバで1分ごとに実行できる
*/2 * * * * … サーバ1 1-59/2 * * * * … サーバ2
crontabで奇数分や偶数分などに実行する指定を簡単に書く方法 - Qiita https://qiita.com/kawaz/items/e9050dd409cfa56dec6a ■Cronを15秒ごとに実行する よほどのことがなければ1分ごとで問題ないはずだが、参考程度に
* * * * * /var/www/cron/test.php & sleep 15; /var/www/cron/test.php & sleep 15; /var/www/cron/test.php & sleep 15; /var/www/cron/test.php
■Cronを特定の時間以外に実行する 以下のようにすると、3時を除いて実行できる
0 0-2,4-23 * * *
Crontabで特定の時間を除いて毎時実行 #Pistatium http://kimihiro-n.appspot.com/show/5871384039260160
■Apacheにレスポンスタイムを記録
ログフォーマットに %D を追加するとマイクロ秒単位で、%T を追加すると秒単位でレスポンスタイムが記録される 以下は設定例 LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined これで、各行の最後に「16255」のような数値が記録されるようになる この場合、処理に16255マイクロ秒、つまり0.016255秒かかったことになる ※1秒 = 1,000ミリ秒 = 1,000,000マイクロ秒 Apacheのレスポンスタイムをログ記録する http://d.hatena.ne.jp/stfuawsc/20090608/1244438262 Apacheのリクエスト処理時間(%T or %D)は正確には何の時間か http://dev.ariel-networks.com/Members/inoue/response-time/ Apacheのレスポンス分析に必要なスクリプトまとめ http://koduki.hatenablog.com/entry/2012/11/24/171534 Apacheのログから応答速度分布やエラー状況を分析する(原始的な方法) http://www.teradas.net/archives/5298/
■Apacheでバーチャルホスト
※一つのサーバに複数のドメイン・サブドメインを割り当てて使用する ※バーチャルホストの作成場所は任意だが、 /var/www/html 内に作ると、各バーチャルホスト用に非公開ディレクトリを設けられないので避ける(/var/www/html 自体が公開ディレクトリのため) ここでは /var/www/vhosts 内に作成するものとする。その際の各ディレクトリ名を /var/www/vhosts/example.com/ /var/www/vhosts/pre.example.com/ のようにすると、ドメインが未決定の場合に問題になる また、ドメインが変更される可能性もあるし、複数ドメインが割り当てられる可能性もある よって /var/www/vhosts/example/ /var/www/vhosts/pre_example/ のように作成するほうが良さそう 複数サイトを管理しないのなら、単に product や staging や develop でいいかもしれない が、後から他サイトがつかされる可能性はあるので、案件名が判る文字をディレクトリ名に含めておく方が無難 ※IPアドレスでアクセスしたときはIPアドレスもしくはサーバ名だけが表示されるページにアクセス、 ドメインを指定してアクセスしたら対応するページにアクセス。 とすると管理しやすいかも ※バーチャルホストが不要な案件でも、後々検収環境が追加されたりを想定して、常にバーチャルホストにしておくといいかも ※SSL用の設定は丸ごと移行させないと、デフォルト値が上書きされない状態で反映されるかも?要検証 名前ベースの仮想ホスト http://www.adminweb.jp/apache/virtual/index2.html バーチャルホスト設定(Apache) http://centossrv.com/apache-virtualhost.shtml # mkdir -p /var/www/vhosts/main/html … バーチャルホスト用ドキュメントルートディレクトリ作成 # vi /etc/httpd/conf/httpd.conf … Apache設定ファイル編集
# # Use name-based virtual hosting. # NameVirtualHost *:80 … コメント解除(バーチャルホスト有効化) # # NOTE: NameVirtualHost cannot be used without a port specifier # (e.g. :80) if mod_ssl is being used, due to the nature of the # SSL protocol. #
# vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル作成
<VirtualHost *:80> … httpアクセス ServerName refirio.net … refirio.net でアクセスされた場合 DocumentRoot /var/www/vhosts/main/html … /var/www/vhosts/main/html をドキュメントルートとする <Directory "/var/www/vhosts/main/html"> Options Includes ExecCGI FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
※最低限、以下の記述だけで動作する。Directoryの指定は一箇所にまとめておくとメンテナンスしやすそう
<VirtualHost *:80> ServerName refirio.net DocumentRoot /var/www/vhosts/main/html </VirtualHost>
■SSL(必要に応じて) 続いて、SSL用の設定を行う apacheで複数のSSL設定を行う http://y-stream.blogspot.jp/2011/09/apachessl.html Apache2.2 の VirtualHost を SSL を使うサイトにも適用 http://qiita.com/da0shi/items/70572e1da228795e0d4b vi http://ext.omo3.com/vi/index.html ApacheでSSL(https)で複数のバーチャルホストの設定 http://istks.net/2322 # vi /etc/httpd/conf/httpd.conf
NameVirtualHost *:80 NameVirtualHost *:443 … 追加する
# vi /etc/httpd/conf.d/ssl.conf … ApacheSSL設定ファイル編集 <VirtualHost _default_:443> の項目をすべてコメントアウトする (「<VirtualHost _default_:443>」と「</VirtualHost>」の行も含めてコメントアウトする) たとえ内容がカラでも、後で設定する「<VirtualHost *:443> 〜 </VirtualHost>」が反映されないため # vi /etc/httpd/conf.d/virtualhost.conf … バーチャルホスト設定ファイル編集
<VirtualHost *:443> … httpsアクセス ServerName refirio.net … refirio.net でアクセスされた場合 DocumentRoot /var/www/vhosts/main/html … /var/www/vhosts/main/html をドキュメントルートとする ErrorLog logs/ssl_error_log … 以降はSSL用の設定 TransferLog logs/ssl_access_log LogLevel warn SSLEngine on SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:!RC4:!3DES:!RSA SSLCertificateFile /etc/httpd/conf/ssl.crt/refirio.net.20170410.crt SSLCertificateKeyFile /etc/httpd/conf/ssl.key/refirio.net.20170410.key SSLCertificateChainFile /etc/httpd/conf/ssl.crt/ica.refirio.net.20170410.crt </VirtualHost>
もともと ssl.conf の VirtualHost 内にあった設定を記載し、 さらに ServerName や SSLCertificateFile の設定を追加している ■動作確認 # chown refirio. /var/www/vhosts/main/html/ … ドキュメントルートの所有者を「refirio」に変更 # 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 # service httpd configtest … 設定ファイルの構文をチェック # service httpd restart … httpdを再起動 httpd を起動中: [ OK ] # vi /var/www/vhosts/main/html/index.html … テストページ作成
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>テスト / main</title> </head> <body> <p>テスト / main</p> </body> </html>
■サブドメインなしでのアクセス refirio.net で /var/www/html を表示し、 test.refirio.net で /var/www/vhosts/test/html を表示するような場合、 上の設定を行うと /var/www/html へアクセスできなくなる可能性がある。 その場合、以下のように /var/www/html へのアクセスを明示的に設定する。 <VirtualHost *:80> ServerName refirio.net DocumentRoot /var/www/html </VirtualHost> IPアドレス経由でのアクセスなら、以下のように設定できる。 <VirtualHost *:80> ServerName 203.0.113.1 DocumentRoot /var/www/html </VirtualHost> ■ログでバーチャルホストを区別 バーチャルホスト https://httpd.apache.org/docs/2.0/ja/logs.html#virtualhosts バーチャルホストごとにApacheログを分けない場合、どのアクセスがどのバーチャルホストに対してのアクセスなのか区別できなくなる LogFormatに「%v」と書いておくと test.refirio.net のような値として記録されるので、必要なら調整する 以下は設定例 LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i %v" combined test.refirio.net のような値ではなく、例えばサブドメイン「test」でアクセスした際に「test」と記録したい場合、以下のように設定する 「combined_test」の部分は、他のログ設定と重複しない値にする 以下は設定例 <VirtualHost *:80> ServerName test.refirio.net DocumentRoot /var/www/test LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i test" combined_test CustomLog logs/access_log combined_terraport env=!no_log </VirtualHost> ただしバーチャルホストが増えると管理しづらいので、前に挙げた方法を推奨
■1サーバに複数のSSL証明書を設定する
※SNIの証明書を入れた場合、ドメインの追加や証明書の更新作業はどうなるか?要確認 1台のサーバに複数のSSLサーバ証明書をインストールできますか https://knowledge.digicert.com/ja/jp/solution/SO24217.html 1つのIPアドレスに対して1つのSSL証明書。というのが原則 複数のドメインでSSLを利用する場合 | COMODO JAPAN https://comodo.jp/guide/multidomain.html 複数のドメインでSSLを利用したければ、マルチドメインタイプもしくはワイルドカードの証明書が必要 ワイルドカードは複数サブドメインに対応するためのものなので、まったく異なるドメインならマルチドメインタイプが必要 1つのサーバーで複数の証明書が使える、SNIって?|SSL基礎知識|Zenlogic - ファーストサーバ株式会社のレンタルサーバー https://zenlogic.jp/user-support/knowledge/ssl/sni.html SNIで1台のサーバ上に複数のSSLサイトを運用 - 前編 | さくらのナレッジ https://knowledge.sakura.ad.jp/3160/ 1個の IP アドレスで複数の SSL サイトを設置する方法 | BestSSL https://www.bestssl.net/support/others/how-to-set-multi-ssl-site/ 1サーバで複数のドメイン&証明書を使いたいという要望は多いため、SNIという技術が作られた ただし対応ブラウザの制約がある(WindowsXP、IE6、Android2、フィーチャーフォンなどは非対応) マルチドメイン | SSLサーバ証明書 |GMOグローバルサイン【公式】 https://jp.globalsign.com/service/ssl/products_price/mdomainssl.html 一例として、グローバルサインによるマルチドメインの解説と価格表 ■AWSの場合 EC2の場合、上と同じ状況 ELBの場合、そもそもSNIに対応していないので不可 ALBの場合、SNIに対応しているので可 ALBで複数証明書 | ナレコムAWSレシピ https://recipe.kc-cloud.jp/archives/10771 AWS Developer Forums: 複数ドメインのSSL証明書を1つのELB ... https://forums.aws.amazon.com/thread.jspa?threadID=239338 ELBに複数のSSLを割り当てる @AWS | https://shoroji.com/2017/11/3879/ EC2に複数の固定IPを設定することは可能みたい これなら通常のSSL証明書でも使えるかも。要検証 EC2に複数のグローバルIPを付与してみた - サーバーワークスエンジニアブログ http://blog.serverworks.co.jp/tech/2016/11/01/attach_eip/ ■さくらのクラウドの場合 さくらのクラウドで複数の固定IPを設定する場合、 共有セグメントではなく専用セグメントにする必要があるみたい。要検証 さくらのクラウド基礎知識 https://www.slideshare.net/sakura_pr/elementary-knowledge-of-sakura-cloud さくらのクラウド導入セミナー(2016.10) 第一部 導入編 https://www.slideshare.net/sakura_pr/20161018-sakura-cloud-introduction-67339981 ■単体サーバに設定する手順 /etc/httpd/conf.d/virtualhost.conf で証明書などの設定を行う際に以下のように設定するが、
<VirtualHost *:443> ServerName refirio.net DocumentRoot /var/www/vhosts/main/html 〜略〜 </VirtualHost>
以下のようにIPアドレスを指定することで、IPアドレスごとに証明書を設定できるみたい(要検証)
<VirtualHost 203.0.113.1:443> ServerName refirio.net DocumentRoot /var/www/vhosts/main/html 〜略〜 </VirtualHost>
マルチドメインでのSSLの設定(CentOS7) - Qiita https://qiita.com/oinuman/items/365f70b31a825db15ed7 SNI がまだそこまでポピュラーではないのでサーバ証明書を扱うには 1 枚に 1 つの IP address が要るのでお困りのそこのあなた!! - してみむとて http://d.hatena.ne.jp/blooper/20121027/1351360911 ■疑問 以前、固定IPを1つだけ持つさくらの専用サーバに対して、複数ドメインのSSLを設定している マルチドメイン証明書では無いはずだが、難なく設定できたのは謎 ■COMODO JAPAN INC への問い合わせ内容 マルチドメインのSSL証明書を https://comodo.jp/ で購入する前提で、実際に問い合わせたときの内容
> 対象サイトが2つあり、両方ともSSLに対応させたいです。(今後3つ以上に増える可能性もあります。) > ただしコストを抑えるために、サーバは1つでバーチャルホストで構築する予定です。 > サーバはAWSのEC2(1台単独)か、さくらのクラウド(1台単独)を予定しています。 > この場合、以下の認識が正しいか確認したいです。 かしこまりました。 > ・固定IPが1つのサーバに、通常のSSL証明書を複数設定することは不可 はい。仰る通りでございます。 固定IPを複数追加可能でしたら、通常の証明書を複数設定可能です。 > ・マルチドメイン証明書なら、2つ以上のドメインに対応できる。SSLの導入手順は、通常のSSL証明書と変わりない はい。仰る通りでございます。 > ・通常の証明書でも複数IPを設定(AWSでEIPを複数設定、さくらクラウドの専用セグメントで複数IP)すれば、2つ以上のドメインに対応できる はい。上述の通りです。 > ・2サイト運用中に3サイト目を追加したい場合、SSL証明書の差し替え作業が3サイト分必要 マルチドメインSSLは、 1枚の証明書で複数のコモンネームに対応することができますので、 証明書の差し替えは、1枚のみとなります。 > その他懸念点や注意すべき点、「こういう場合は利用できない」などございましたら、お知らせいただけると幸いです。 今後追加させるドメインが5ドメイン以内でしたら、 コストメリットが高いマルチドメインおトクパックをお勧めさせていただきます。 https://comodo.jp/products/otokupack.html CSRを作成する際、代表となる一つのコモンネームを決めていただき、 そのコモンネームにてCSRを生成してください。 その他、他認証局と同様ではありますが、注意点を挙げさせていただきます。 ・Apache1系では、ご利用になれません。 ・フィーチャーフォンからのアクセスには対応しておりません。 引き続き、どうぞ宜しくお願い申し上げます。 その他、ご不明な点等がございましたら、お気軽にお問い合わせください。
■Apacheでユーザディレクトリ
http://example.com/~refirio/ のようなURLを使えるようにする # vi /etc/httpd/conf/httpd.conf … httpdの設定ファイルを編集
<IfModule mod_userdir.c> # # UserDir is disabled by default since it can confirm the presence # of a username on the system (depending on home directory # permissions). # #UserDir disabled UserDir enabled … enabledに変更 (Apache再起動時に「UserDir "enable" keyword requires」のエラーなるようなら、コメントアウトする) # # To enable requests to /~user/ to serve the user's public_html # directory, remove the "UserDir disabled" line above, and uncomment # the following line instead: # #UserDir public_html UserDir "/home/*/public_html" … ユーザディレクトリの場所を設定 </IfModule>
# service httpd configtest … 設定ファイルの構文をチェック # service httpd restart … Apacheを再起動 httpd を停止中: [ OK ] httpd を起動中: [ OK ] 上の場合、/home/refirio/public_html/index.html には /~refirio/ でアクセスできるようになる ApacheでUserDir公開の、メモ書き http://qiita.com/ms2sato/items/299278b2492c96cb80ae
■Apache+SSLでRC4暗号化を外す
サーバのセキュリティチェックなどで、SSLの設定で「SSLCipherSuite」に「RC4」が使用されている …と指摘されたときの対応方法について 以下、指摘内容
SSL/TLS が弱い RC4 暗号を使用: RC4 は、出力に一定のバイアスがあるため、暗号文を統計的に解析できる現実性が高いことが発見されています。 想定される攻撃としては、ブラウザに悪質な JavaScript をインジェクトするものがひとつの例として考えられます。 これにより、ターゲットの Web サイトとの間に複数の接続が確立され、 同じ HTTP Cookie が暗号化された形で複数回 Web サイトに送信されるようになります。 そこから、攻撃者は大量の暗号文サンプルを入手でき、それを統計的な解析に利用できるようになります。
具体的な対内容は以下のとおり confファイルで
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
を以下のように変更して、Apacheを再起動する(CentOS6の場合)
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:!RC4:!3DES:!RSA
上記設定は、以下などのファイルに書かれていることが多い /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/virtualhost.conf 設定内容の意味やCentOS7での設定方法は、以下のページに詳しく書かれている CentOS6.9/CentOS7.4でWebサーバのSSLのセキュリティ対策 - Qiita https://qiita.com/qiitamatumoto/items/f93286fc82ec9a0cdff7
■TLS1.2の対応状況を確認する
決済システムを導入している案件で、決済会社から以下のメールが送られてきた TLS1.2に対応している必要があるらしいので調査
この度ペイジェントでは、決済システムのセキュリティをより安全に保つため 暗号化通信プロトコルTLS1.2未満の使用を停止することにいたしました。 加盟店様システムの環境によりましては、TLS1.2未対応の場合、 決済することができなくなります。 まずは加盟店様にて影響有無をご確認頂き、 TLS1.2のシステム対応を進めて頂ければと存じます。
SSL/TLSの暗号化通信をTLS1.2 のみに制限する - ex1-lab https://ex1.m-yabe.com/archives/3054 適当なサーバから、対象サーバに対して以下を実行(以下は refirio.net に実行する場合) 「Protocol : TLSv1.2」と表示されているので大丈夫そう # openssl s_client -connect refirio.net:443 -tls1_2 New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1.2 WindowsVistaやIE10など、古い環境もサポートが切られることになる 対応状況などは以下のページが解りやすい Yahoo!セキュリティセンター | 2018年6月1日以降、古いブラウザー、パソコン、スマートフォンなどでは、Yahoo! JAPANのウェブサービスが順次ご利用いただけなくなります。 https://security.yahoo.co.jp/news/tls12.html
■Apacheでfavicon.icoの404エラーを記録させない
favicon.icoを設置しない場合でaccess_logにfavicon.icoの404エラーを記録させたくない場合、 /etc/httpd/conf/httpd.conf に以下の設定を追加する SetEnvIf Request_URI "favicon\.ico" no_log error_log にも記録させたくない場合、以下の設定も追加する (404エラーを記録させないだけなら、ErrorDocumentなしでも十分かも?要確認) Redirect 404 /favicon.ico ErrorDocument 404 "File Not Found" 【Apache】favicon.icoをログに出さない! http://dblog3024.blog.fc2.com/blog-entry-2.html Apache > favicon.icoをエラーログに残さず、ファイルIOも発生させない方法 http://d.hatena.ne.jp/tama0905/20110820/1313824404
■nginxでリクエストを操作する
■リダイレクトする /etc/nginx/nginx.conf で以下のように設定する
# /hoge/foo.html にアクセスしたら302リダイレクト location /hoge/foo.html { rewrite ^(.*)$ http://example.com/hoge/foo.html redirect; } # /foo/bar.html にアクセスしたら301リダイレクト location /foo/bar.html { rewrite ^(.*)$ http://example.com/foo/ permanent; }
Nginxのリダイレクト設定のメモ - Qiita https://qiita.com/kt_higa/items/f26ba1453164c82d6ad5 nginxのrewriteを使ったリダイレクト | Skyarch Broadcasting https://www.skyarch.net/blog/?p=7088 ■URLを書き換える(Apacheのmod_rewriteに相当) /etc/nginx/nginx.conf で以下のように設定する
# /test/ にアクセスしたら /test.html の内容を表示 location /test/ { rewrite /(.*)/ /$1.html last; }
■nginxにレスポンスタイムを記録
/etc/nginx/nginx.conf で以下のように設定する 以下の例では、あわせてアクセス元プロキシのIPアドレスとプロトコルも記録している
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ↓以下のように変更 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $http_x_forwarded_for $http_x_forwarded_proto';
ELB経由のnginxでアクセス元IPアドレスをアクセスログの$remote_addrとして書くようにする - Qiita https://qiita.com/toshihirock/items/1de2613bb7c95d486dc1 nginx: ログ出力形式の変更と、ログにレスポンスタイムを出力する方法 - エラーの向こうへ https://tech.mktime.com/entry/259
■nginxでリバースプロキシを使う
※ロードバランサーのように負荷分散を行うが、ロードバランサーとは異なりレスポンスはリバースプロキシが返す これにより、リバースプロキシがレスポンスをキャッシュして負荷を軽減させたりなどができる 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をロードバランサーにする
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/
■Apache・Nginxのエラーログフォーマットを変更
error_log に記録するIPアドレスを、Proxyを考慮したものにしたい…という場合に調べたもの 公式の解説によると、「情報を追加したり削除したりしてエラーログをカスタマイズすることは できません。」とのこと。 Nginxも同様 ログファイル - Apache HTTP サーバ http://httpd.apache.org/docs/2.0/ja/logs.html#errorlog nginxのerror_logはformat指定できない. - としたにあんの左脳 http://toshitanian.hatenablog.com/entry/2013/10/25/023838 上記Apacheのドキュメントには 「情報を追加したり削除したりしてエラーログをカスタマイズすることはできません。 しかし、リクエストに対するエラーログのエントリは、 対応するエントリがアクセスログにあります。 例えば、上の例のエントリはアクセスログのステータスコード 403 のエントリに対応します。 アクセスログはカスタマイズ可能ですので、 そちらを使うことによりエラーの状況に関する情報をより多く手に入れることができます。」 と書かれているので、アクセスログを併用する前提みたい。恐らくNginxも同じ思想
■rsync(一方向同期)
※web1サーバの /var/www/html/rsync の内容を、web2サーバの /var/www/html/rsync に同期 rsyncとlsyncdでEC2サーバーを同期する http://qiita.com/katsukii/items/5c2cbd8f69ffd7cb213f ポートや鍵のファイルを指定 http://ikm.hatenablog.jp/entry/2013/05/27/140336 ■同期元サーバ:キーを作成 ※rootユーザ、保存先はデフォルトのまま、パスワードなしで作成する場合 # ssh-keygen -t rsa # cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA 〜略〜 93ciNXZFZSlzXfqfZwD/7809G7 root@web1.refirio.net ■同期先サーバ:ユーザを作成 ※rsyncが配置したファイルだと分かるように、同期用にrsyncユーザを作成する場合 # useradd rsync # usermod -G wheel rsync # usermod -a -G apache rsync # visudo
# %wheel ALL=(ALL) ALL %wheel ALL=(ALL) ALL … コメント解除していなければ解除
■同期先サーバ:キーの設定 ※同期用ユーザが接続できるようにする # mkdir -p /home/rsync/.ssh … 公開鍵格納用ディレクトリを作成 # chmod 700 /home/rsync/.ssh … 公開鍵格納用ディレクトリのパーミッションを変更 # vi /home/rsync/.ssh/authorized_keys … 公開鍵をauthorized_keysに保存
ssh-rsa xxxxxxxxxx … 作成した公開鍵の内容を全てコピーして貼り付ける
# chmod 600 /home/rsync/.ssh/authorized_keys … authorized_keysのパーミッションを変更 # chown -R rsync:rsync /home/rsync … ユーザディレクトリの所有者を変更 ■同期元サーバ:接続確認 同期元サーバから同期先サーバへSSH接続を確認 接続できなければ、鍵ファイルやや上位ディレクトリの所有者とパーミッションを確認する (rsyncユーザから読み込めるようにする) # ssh -p 10022 rsync@10.0.1.17 ■同期元サーバ:lsyncdインストール # yum install --enablerepo=epel lsyncd 以下でrsyncコマンドの動作を確認できる # rsync -e "ssh -p 10022" -avz --delete /var/www/html/rsync rsync@10.0.1.17:/var/www/html ■同期元サーバ:自動同期設定 # vi /etc/lsyncd.conf
settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.stat", maxProcesses = 2, statusInterval = 1, insist = 1 } sync { default.rsync, source = "/var/www/html/rsync", target = "rsync@10.0.1.17:/var/www/html/rsync", delay = 2, exclude = { "*.swp" }, rsync = { archive = true, compress = false, rsh = "ssh -p 10022" } }
# service lsyncd start … lsyncdを起動 # chkconfig --add lsyncd # chkconfig lsyncd on … lsyncdの自動起動を設定 ■同期元サーバ:動作確認 # tail /var/log/lsyncd/lsyncd.log … 同期されるたびにログが記録される 何も記録されていない場合、以下で設定ファイルの文法チェックをするといい # lsyncd -nodaemon -log scarce /etc/lsyncd.conf 以下で指定したファイルは、環境によってはあらかじめ作成しておく必要があるかも? logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.stat", lsyncdでサーバ間のファイルを双方向に同期させる https://2017.l2tp.org/archives/314 以下のようなエラーが表示される場合、ディレクトリやファイルのパーミッションを確認する 直上のディレクトリのパーミッションが大丈夫でも、さらに上位のディレクトリのパーミッションも影響する rsync: ERROR: cannot stat destination "/home/centos/html": Permission denied (13) rsync error: errors selecting input/output files, dirs (code 3) at main.c(565) [Receiver=3.0.9] rsync: connection unexpectedly closed (9 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] 今回の場合、以下のように「centos」のパーミッションが原因で同期できなかった 「chmod 0775 centos」とすれば同期できるようになった(アクセスをグループで制御しているものとする) パーミッション最後のピリオドは、SELinuxに由来するもので関係ない # cd /home # ll 合計 0 drwx------. 3 centos centos 133 12月 5 15:34 centos drwx------ 3 rsync rsync 95 12月 2 21:46 rsync
■rsync(双方向同期)
※web1サーバとweb2サーバの /var/www/html/rsync が双方向に同期したい場合、 「rsync(一方向同期)」の設定を、同期元と同期先を逆にして追加設定する ※ただしそれだけだと、意図しないファイルの削除や復元が発生する場合がある 以下の設定を追加することで対応する ※ロードバランサー経由でアクセスしている際に、同期されるまでのタイムラグが問題になる場合、 スティッキーセッションを使うなどしてアクセスされるサーバを固定するといい lsyncdで双方向同期するなら、delete='running' がいい http://iga-ninja.hatenablog.com/entry/2015/02/28/230014 rsyncとlsyncdを使ったディレクトリの双方向同期 http://qiita.com/kaihei777/items/5bb4f381c6b4c31be055 lsyncdでサーバ間ファイルを同期をさせてみた https://www.didgedil.li/2016/07/17/lsyncd/ # vi /etc/lsyncd.conf
sync { default.rsync, source = "/var/www/html/rsync", target = "rsync@10.0.1.17:/var/www/html/rsync", delay = 2, delete = "running", … 追加(意図しないファイルの削除を避ける) init = false, … 追加(意図しないファイルの復元を避ける) exclude = { "*.swp" }, rsync = { archive = true, compress = false, rsh = "ssh -p 10022" } }
# service lsyncd restart … lsyncdを再起動 ※rsyncに「owner = true」「group = true」を設定すると所有者を含めて複製されるらしいが、反映されなかった 「同じグループのユーザからはファイルの読み書きを許可する」のような指定ができないことになり、これだと問題がある 仮に「web-userでアップロード&web-userで同期」としても PHPが作成したファイルやディレクトリは所有者apacheとなり、同期によってやはり所有者が変わることになる 同期はrsyncユーザで行い、「FTPでアップロードするのはweb1のみで、web2には原則としてアップロードしない」なら運用できるかも ※上の解決策。前提として所有者は含めない方が、アップロードされたファイルなのか同期されたファイルなのかが明確になって良さそう 代わりに chmod g+s /var/www/html/rsync として、rsyncディレクトリ内で作成されたファイル・ディレクトリのグループを親ディレクトリのグループに合わせると良さそう そうすればファイルの読み書きに支障はなくなるし、アップロードされたのか同期されたのかも明確になる
■メールのキューを削除する
メールを正しく送信できなかった場合、 /var/spool/clientmqueue/ ... MSPモード(MTAを使わないメール送信)の場合 /var/spool/mqueue/ ... MTAの場合 に一時的に貯められる ここに大量のメールが溜まってしまった場合、送信してしまうかファイルを削除してしまうかになる 削除する場合、以下のコマンドを実行する rm -f /var/spool/clientmqueue/* rm -f /var/spool/mqueue/* clientmqueueディレクトリ以下に吐き出される大量ファイルの対処法 http://ameblo.jp/itboy/entry-10024985559.html MSP(メール配信プログラム)モードで実行する http://seesaawiki.jp/w/engineernochiebukuro/d/MSP%A1%CA%A5%E1%A1%BC%A5%EB%C7%DB%BF%AE%A5%D7%A5%ED%A5...
■root宛のメールを削除する
cat /dev/null > /var/spool/mail/root 新しいメールが /var/spool/mail/root にありますを停止する方法 https://genchan.net/server/9970 気付いたらrootメールが溢れてる http://multix.jp/rootmail-overflow/ /var/spool/mail/rootを削除する https://cloudpack.media/1024
■MySQLのデータベース文字コード
utf8_unicode_ciではなく、utf8_general_ciにしておくのが無難 MySQLのutf8_general_ciとutf8_unicode_ciの違い http://program.sagasite.info/wiki/index.php?MySQL%E3%81%AEutf8_general_ci%E3%81%A8utf8_unicode_ci%E3... utf8_unicode_ci に対する日本の開発者の見解 http://blog.kamipo.net/entry/2015/03/08/145045 MySQLの照合順序 http://qiita.com/Vit-Symty/items/159c27d7d62c78ee9ce7 ※今はutf8だけでなく、utf8mb4についても検討する
■MySQLで外部キー制約を無視してインポート
データの移植時、外部キー制約があるとSQLを丸ごとインポートできないことがある SQLファイルの最初に以下を追加し、
SET FOREIGN_KEY_CHECKS=0;
最後に以下を追加すればインポートできる
SET FOREIGN_KEY_CHECKS=1;
■PostgreSQLでEUC_JPのデータベースを作成
psql -l … データベースの文字コードを確認 dropdb test … 一旦testデータベースを削除する場合 createdb -E EUC_JP --locale=ja_JP.EUC_JP test --template=template0 … 文字コードを指定してtestデータベースを作成 PostgreSQLのinitdbと違うロケールでDB作成 http://wsjp.blogspot.jp/2012/04/postgresqlinitdbdb.html PostgreSQLエラー「createdb: データベースの生成に失敗しました: ERROR: 符号化方式 EUC_JP がロケール ja_JP.UTF-8 に合いません」の原因と解決方法 http://nobuneko.com/blog/archives/2011/10/postgresqlcreatedb_error_euc_j.html 以下、「他にこのデータベースを使っている 1 個のセッションがあります。」のように表示された場合の対象方法 アクセスしているユーザを調べて強制的に追い出す psql test … testデータベースに接続 SELECT * FROM pg_stat_activity; … アクセスしているユーザを調べる SELECT pg_terminate_backend(567) FROM pg_stat_activity WHERE usename = 'usename'; … procidとusernameを指定して追い出す \q … ログアウト 具体例 SELECT pg_terminate_backend(7960) FROM pg_stat_activity WHERE usename = 'postgres'; SELECT pg_terminate_backend(5484) FROM pg_stat_activity WHERE usename = 'postgres'; SELECT pg_terminate_backend(7404) FROM pg_stat_activity WHERE usename = 'postgres'; 「WHERE usename = 'postgres'」は無くても大丈夫かも? 参考 http://blog.kter.jp/?cat=80
■SSIを使用する
拡張子 .shtml でSSIを有効にする場合、httpd.conf か .htaccess に以下の内容を追加
Options +Includes AddType text/html shtml AddHandler server-parsed shtml
拡張子 .html でもSSIを有効にする場合、AddHandler の行を以下のように変更
AddHandler server-parsed html shtml
■処理の進捗を表示
Linux環境なら、pvをインストールしておくと便利そう MySQL インポートの進捗表示 - Qiita http://qiita.com/hiroq/items/efd8c3580c9c9457c869 Linuxメモ : パイプ処理の進捗を表示するpv(Pipe Viewer)の使い方 - もた日記 http://wonderwall.hatenablog.com/entry/2017/08/03/072500
■サーバ2台構成でWordPress(rsyncでファイル双方向同期、MySQLレプリケーションでデータベース同期)
■前提 AWSに環境を構築したときのメモ web1とweb2の二台に、WordPressの動作する環境が構築済みとする ■ホスト名の設定(web1、web2とも) # hostnamectl set-hostname web1.refirio.net # vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 refirio.net refirio.net ↓ 127.0.0.1 localhost web1.refirio.net localhost4 localhost4.localdomain4 refirio.net refirio.net
# vi /etc/sysconfig/network
HOSTNAME=web1.refirio.net
※web2では「web1.refirio.net」という名前で同様の設定を行う ■レプリケーションの設定 web1をMaster、web2をSlaveとする □Master $ curl http://10.0.1.42/ # vi /etc/my.cnf
[mysqld] log-bin=mysql-bin server-id = 1001
# systemctl restart mysql # mysql -u root -p mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@10.0.1.42 IDENTIFIED BY 'gV0+8k6BM#z7'; mysql> FLUSH PRIVILEGES; mysql> SELECT host,user FROM mysql.user; mysql> FLUSH TABLES WITH READ LOCK; … データ手動コピー前にテーブルロック mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 633 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) # cd /var/lib/mysql # ll # tar czf wordpress.tar.gz wordpress … MySQLのデータをバックアップ mysql> UNLOCK TABLES; … データ手動コピー後にテーブルロック解除 # cp /var/lib/mysql/wordpress.tar.gz /usr/share/nginx/html/wordpress.tar.gz □Slave $ wget http://10.0.1.253/wordpress.tar.gz # cd /home/centos # cp /home/centos/wordpress.tar.gz /var/lib/mysql/wordpress.tar.gz $ curl http://10.0.1.253/ … 疎通テスト $ mysql -h 10.0.1.253 -u repl -p … 疎通テスト ※最初MySQLで通信できなかった。内部通信を許可するために、セキュリティグループに「default」を追加 http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-network-security.html#default-securit... # systemctl stop mysql # cd /var/lib/mysql … MySQLのデータをバックアップから復元 # mv wordpress wordpress.backup # tar xvzf wordpress.tar.gz # vi /etc/my.cnf … レプリケーション設定
[mysqld] server-id=1002
# systemctl start mysql # mysql -u root -p mysql> CHANGE MASTER TO … Masterへの接続情報を設定 MASTER_HOST='10.0.1.253', MASTER_USER='repl', MASTER_PASSWORD='gV0+8k6BM#z7', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', … 「SHOW MASTER STATUS」で確認した「File」 MASTER_LOG_POS=633; … 「SHOW MASTER STATUS」で確認した「Position」 mysql> FLUSH PRIVILEGES; mysql> START SLAVE; … レプリケーションを開始 □いったん動作確認 Master側でテーブルを作成&データを登録し、Slave側にも反映されていることを確認する ■WordPressの接続設定を調整 □Master mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@10.0.1.253 IDENTIFIED BY 'Hy8R63mAdF'; … WordPress用ユーザ追加 mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@10.0.1.42 IDENTIFIED BY 'Hy8R63mAdF'; … WordPress用ユーザ追加 mysql> FLUSH PRIVILEGES; mysql> SELECT host,user FROM mysql.user; □両方のサーバにHyperDBをインストール # cd # wget http://downloads.wordpress.org/plugin/hyperdb.zip # unzip hyperdb.zip # cd hyperdb # cp db-config.php /home/kusanagi/wordpress/DocumentRoot/ # chown kusanagi. /home/kusanagi/wordpress/DocumentRoot/db-config.php # cp db.php /home/kusanagi/wordpress/DocumentRoot/wp-content/ # chown kusanagi. /home/kusanagi/wordpress/DocumentRoot/wp-content/db.php # cd /home/kusanagi/wordpress/DocumentRoot/ … 公開ディレクトリへ移動 # vi db-config.php 217行目あたり
$wpdb->add_database(array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, ));
以下のように編集(「write」と「read」の指定を追加)
$wpdb->add_database(array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 1, 'read' => 1, ));
228行目あたり
$wpdb->add_database(array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 0, 'read' => 1, 'dataset' => 'global', 'timeout' => 0.2, ));
以下のように編集(「host」の指定を変更)
$wpdb->add_database(array( 'host' => DB_HOST_RO, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => 0, 'read' => 1, 'dataset' => 'global', 'timeout' => 0.2, ));
# cp -p wp-config.php wp-config.php.backup … WordPressの設定ファイルをバックアップ # vi wp-config.php … WordPressの設定ファイルを編集 32行目あたり
define('DB_HOST', 'localhost');
以下のように編集
//define('DB_HOST', 'localhost'); define('DB_HOST', '10.0.1.253'); define('DB_HOST_RO', '10.0.1.42');
■rsync設定(一方向同期) □同期元サーバ:キーを作成 # ssh-keygen -t rsa # cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC 〜略〜 JKFwq52AwP root@web1.refirio.net □同期先サーバ:ユーザを作成 # useradd rsync # usermod -G wheel rsync # usermod -a -G apache rsync # usermod -a -G kusanagi rsync □同期先サーバ:キーの設定 # mkdir -p /home/rsync/.ssh # chmod 700 /home/rsync/.ssh # vi /home/rsync/.ssh/authorized_keys
ssh-rsa xxxxxxxxxx
# chmod 600 /home/rsync/.ssh/authorized_keys # chown -R rsync:rsync /home/rsync □同期元サーバ:接続確認 # ssh -p 22 rsync@10.0.1.42 □同期元サーバ:lsyncdインストール # yum install --enablerepo=epel lsyncd # chmod 0775 /home/kusanagi # mkdir /home/kusanagi/rsync # chown kusanagi. /home/kusanagi/rsync # chmod 0775 /home/kusanagi/rsync # cd /home/kusanagi/rsync # rsync -e "ssh -p 22" -avz --delete /home/kusanagi/rsync rsync@10.0.1.42:/home/kusanagi … 動作確認 □同期元サーバ:自動同期設定 # vi /etc/lsyncd.conf
settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.stat", maxProcesses = 2, statusInterval = 1, insist = 1 } sync { default.rsync, source = "/home/kusanagi/rsync", target = "rsync@10.0.1.42:/home/kusanagi/rsync", delay = 2, exclude = { "*.swp" }, rsync = { archive = true, compress = false, rsh = "ssh -p 22" } }
# systemctl start lsyncd.service # systemctl enable lsyncd.service # systemctl is-enabled lsyncd.service ■rsync設定(双方向同期) 「rsync(一方向同期)」の設定を、同期元と同期先を逆にして追加設定する # cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC 〜略〜 kATrJQOJ+J root@web2.refirio.net # ssh -p 22 rsync@10.0.1.253 # rsync -e "ssh -p 22" -avz --delete /home/kusanagi/rsync rsync@10.0.1.253:/home/kusanagi ■WordPress同期 □同期を停止させておく web1&web2: # sudo su - # systemctl stop lsyncd.service □公開フォルダを退避 web1&web2: # cd /home/kusanagi/wordpress # mv DocumentRoot DocumentRootTmp # mkdir DocumentRoot # chown kusanagi. DocumentRoot # chmod 0775 DocumentRoot □上位ディレクトリのパーミッションを調整 # chmod 0775 /home/kusanagi □公開フォルダで同期をテスト web1: # vi DocumentRoot/index.php # rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.42:/home/kusanagi/wordpress web2: # vi DocumentRoot/test.php # rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.253:/home/kusanagi/wordpress □自動同期対象を変更 web1&web2: # vi /etc/lsyncd.conf
/var/www/html/rsync ↓ /home/kusanagi/wordpress/DocumentRoot
※2箇所あるパスを修正 # systemctl start lsyncd.service 自動同期を確認後、また停止させておく # systemctl stop lsyncd.service □公開フォルダを戻す web1で公開ディレクトリ内をWordPressに戻す (web2では公開ディレクトリ内をカラにしておく) # mv DocumentRoot DocumentRootTmp2 # mv DocumentRootTmp DocumentRoot □ファイルの所有者を調整 web1&web2: /home/kusanagi/wordpress 内で作られたファイルの所有者を kusanagi にする # chown kusanagi. /home/kusanagi/wordpress # chmod 0775 /home/kusanagi/wordpress # chmod g+s /home/kusanagi/wordpress # chmod g+s /home/kusanagi/wordpress/DocumentRoot web1: # find /home/kusanagi/wordpress -type d -print | xargs chown kusanagi. # find /home/kusanagi/wordpress -type f -print | xargs chown kusanagi. □WordPressを同期 web1の公開ディレクトリ内はWordPress、 web2の公開ディレクトリ内はカラ、 という状態でweb1で以下を実行。同期テストする # rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.42:/home/kusanagi/wordpress 完了したら、web2からも同期をテストする # rsync -e "ssh -p 22" -avz --delete /home/kusanagi/wordpress/DocumentRoot rsync@10.0.1.253:/home/kusanagi/wordpress どちらも大丈夫なら、自動同期を開始してテストする # systemctl start lsyncd.service 自動同期も大丈夫なら、管理画面から記事の登録やメディアのアップロードなどをテストする
■独自ドメインを設定する(ムームードメイン)
■WHOIS情報 情報公開 … 弊社情報代理公開 ■ネームサーバ設定変更 サービス … ムームーDNS ムームーDNSセットアップ ネームサーバ1 … dns01.muumuu-domain.com ネームサーバ2 … dns02.muumuu-domain.com ■ムームーDNSのセットアップ情報(カスタム設定) No サブドメイン 種別 内容 優先度 1 A 153.121.33.84 2 www A 153.121.33.84
■コントロールパネルからリモートコンソールを使う(さくらの専用サーバ)
リモートコンソールを実行できない場合Javaのセキュリティが影響している可能性がある Windowsのコントロールパネルから「Java」を選択し、 「セキュリティ」タブの「例外サイト・リスト」に以下のURLを追加する (契約者によってURLが違う可能性があるので要確認。) http://ds-proxy30-u.sakura.ne.jp
■OS再インストール(さくらのVPS)
OS再インストール https://help.sakura.ad.jp/app/answers/detail/a_id/2408
■システム障害対策
障害対策の資料では、以下のような略語が使われることがある S/W ... SoftWare ソフトウェア H/W ... HardWare ハードウェア N/W ... NetWork ネットワーク I/F ... InterFace インターフェース I/O ... Input/Output 入出力 C/S ... Client/Server クライアントサーバシステム
■接続元引越時のTODO
オフィスの移転(引っ越し)を行う場合、アクセス制限用のIPアドレスを調整する必要がある 以下などは要確認 ・コントロールパネルでの設定 ・/etc/sysconfig/iptables ・/etc/hosts.deny ・/etc/hosts.allow ・その他 httpd.conf や .htaccess など