phpとか

自分用備忘録なので、自分が分かる程度にしか書いてません。

SSLチェック 警告対策

SSL設定後に以下のサイトでチェック & 修正したことのメモ。

https://cryptoreport.websecurity.symantec.com/checker/views/certCheck.jsp

【警告】

Warnings TLS1.2

Warnings SSLv3

This server is vulnerable to:Poodle (SSLv3)

httpd.confに以下追記

httpdのバージョンが2.4未満

SSLProtocol All -SSLv2 -SSLv3

or

SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2


※上記どちらも同じ意味(SSLv2,SSLv3を無効化して、TLS追加)

httpdのバージョンが2.4以上

SSLProtocol All -SSLv3

Info BEAST

無視する。

対策として RC4暗号をサポートする必要があるが、この暗号は度々脆弱性が報告されているため、サポートするべきではない。設定してしまうと判定はBに下がる。

Warnings RC4

ssl.confの以下部分を以下のように(RC4無効化)
RC4以外の部分については適弁

SSLCipherSuite ALL:!SSLv2:!SSLv3:!EXP!MD5!RC4!ADH!DSS!RSA:+HIGH:!eNULL:!aNULL
  • !は暗号スイートを使わせない。
  • -は暗号スイートを削除する。後ろで追加すれば使用することも可能
  • +は暗号スイートの追加。

スマートフォンを除く多くの携帯電話等の端末においてはAESや3DESがサポートされておらず、RC4を含む暗号スイートをすべて無効化した場合、携帯電話等の端末からのHTTPSによるアクセスができなくなる可能性があり



Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

AWS 再起動後のElasticIP再割り当て

全く大したことないことなんですが、嵌ったのでメモします。

EC2-Classicのインスタンスを再起動(停止→開始)すると、eipの紐づけが解除されるようです。(EC2-VPCインスタンスの場合は確か大丈夫)

再割り当てしようとEC2ダッシュボードのElasticIP画面で、IPを選択して、「アドレスの関連付け」を選択

インスタンス」と「プライベート IP」を入力して「関連付け」をクリックしたら、
以下のエラーが・・・


The parameter 'privateIpAddress' may not be used in combination with a non-VPC instance



検索してもでてこない・・・
結局、「インスタンス」だけ入力したらいけました。


作成されるインスタンスの種類
※EC2ダッシュボードの「アカウントの属性」で「EC2」しかないと、EC2-Classicのインスタンスが作成されます。
※「VPN」しかない場合、「EC2-VPC」で作成される。

EC2-ClassicのインスタンスにEIPを割り当てようとすると、上記の現象が発生。

どうやら「プライベート IP」の入力は「EC2-VPCインスタンスだけのようですね。
EC2スコープのEIPの割り当てのときはテキストボックス出さないようにしてくれればいいのに。


Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

AWS ボリューム容量増加手順

ルートデバイスでない、アタッチしていたボリュームの使用容量が99%になってしまったので、ボリュームの容量を増やしました。

以下、簡単にですが手順です。

1.インスタンスの停止

2.該当ボリュームの決定

AWSの管理画面にて、EC2ダッシュボードのインスタンスを選択。
インスタンス一覧が表示されるので、該当のインスタンをクリックすると、
下の「説明」にアタッチされているボリュームが表示されます。

該当ボリュームがどれか分からない場合は、以下で確認。

df -ah

表示例

Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G  1.1G  6.8G  13% /
proc                     0     0     0   -  /proc
sysfs                    0     0     0   -  /sys
devpts                   0     0     0   -  /dev/pts
tmpfs                 829M     0  829M   0% /dev/shm
/dev/xvdf              50G   47G  634M 99% /product
none                     0     0     0   -  /proc/sys/fs/binfmt_misc

上記の場合だと、/product/のデバイスがいっぱいなので、
該当のボリュームは/dev/xvdfになります。

※公式によると、先ほどのAWS管理画面だとsvdfなのに、サーバ内で見るとxvdfってこともあるようです。

3.ボリュームのスナップショット作成

4.スナップショットから新しいボリュームを作成

※作成したスナップショットのステータスが[completed] に変わるのを待ちます。
※この作成時にボリュームのサイズを増やします。

5.該当ボリュームをデタッチする

6.新ボリュームをアタッチする

7.インスタンスを再起動

8.マウント

lsblk

上記で、追加したはずのボリュームがない場合、もともとマウントされていたディレクトリをマウントします。
今回の場合、以下のような感じです。

*アタッチした新ボリューム

手順2と同様に、AWS管理画面のインスタンス画面から、インスタンスについている新ボリュームを確認してください。


mkdir /product
mount /dev/xvdf(=「*アタッチした新ボリューム」) /product

9.ボリューム容量が増加しているか確認

df -ah
容量が増えていない場合、ファイルシステムの拡張が必要です。

【公式】
docs.aws.amazon.com

まずは新ボリュームのファイルシステムがなんなのか確認します。

sudo file -s /dev/*
※以下はext2ext3、および ext4の手順です。違うファイルシステムの場合は上記公式サイトをご参照ください。

htaccess適用の範囲

いまだによくわかっていないんですが、htppd.confで、特定のパスの場合だけ違うディレクトリのプログラムを起動してる場合でも変更前のdocumentRootにあるhtaccessを見に行くんですね。

何を言ってるのか意味わからないと思うのですが、下記みたいな感じです。

【通常】
[URL] http://test.jp
[PATH] /var/www/

【「/admin」の場合】
[URL] http://test.jp/admin
[PATH] /home/admin/www/「rubyで書いたプログラムを起動」

上記の設定をhttpd.confに書いたとしても、
「/admin」で来た場合も、「/var/www/.htaccess」をみるんですね。

ただ、プログラムの起動ではなく、普通にリダイレクトするようにした場合は、リダイレクト先しか見ないようですね。


その場しのぎに調べるんじゃなくて、ちゃんと勉強しないとダメですね・・・




Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

apache maxClientsについて

httpだとアクセス集中してるのに、httpsで接続すると普通に閲覧できるということがありました。

maxClientsってhttpとhttpsでそれぞれ適用されるんですね。

※maxClientsが2の場合、httpとhttpsがそれぞれ2プロセス(合計4プロセス)まで起動する





Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

mysql5.5を再インストール & 以前のデータ復元

サーバが動かなくなりました。
専有レンサバでしたが、一か月経過し、やっと復旧の連絡がきました。

新サーバに以前のデータを新しくマウントしたらしいです。

下記のような構成です。
=======================================
【復旧前】
/root

【復旧後】
/mount/root
=======================================

これだと物理データは取れるけど、サービスなんも動かない・・・
とりあえずなんとかしてDBのdump取得しないと。しかしmysqlが動かない。

mysqlの場合、my.cnfの「datadir」に指定のディレクトリ内に物理データがあるらしいです。

試しにmysql起動

やはりできない。本体置いてある場所がマウント先(/mount/var/lib/mysqlみたいな)になっちゃってて、設定ファイルとかいろんなとこに絶対パスで書かれてるので、全部直すのめんどい。というか無理

/var/lib/に同バージョンのmysqlインストール

mysql公式のリポジトリをインストール

・・・しようとしましたが、yumで失敗。

yum install http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm

以下もなぜかエラー

wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm

しょうがないので、クライアントマシンでブラウザから落としたものをftpでサーバにアップして、インストール。
リポジトリのURL】
http://dev.mysql.com/downloads/repo/yum/

ここから自分のサーバのOSバージョン64bitかなどを確認して適切なものを選択。

アップしたリポジトリのインストール

sudo yum localinstall mysql57-community-release-el6-8.noarch.rpm

インストールしましたが、リポジトリの設定ファイルを見るとmysql5.6と5.7しかなかった・・・

cat /etc/yum.repos.d/mysql-community.repo

直接mysql5.5をインストール

これもクライアントマシンでブラウザから落としたものをftpでサーバにアップしました。

rpmのURL】
http://dev.mysql.com/downloads/mysql/5.5.html#downloadsMySQL :: Download MySQL Community Server

「Select Version:」を5.5.54
「Select Platform:」をLinux - Genericとして選択。

以下をダウンロード。
※64bitかなどを確認して適切なものを選択

  • Client Utilities
  • MySQL Server
  • Compatibility Libraries
sudo yum localinstall MySQL-server-5.5.54-1.linux2.6.i386.rpm

エラーでたので「nogpgcheck」オプションを付与して再実行

sudo yum localinstall MySQL-server-5.5.54-1.linux2.6.i386.rpm --nogpgcheck

「nogpgcheck」は、パッケージの出自の証明を確認しないオプションです。今回はmysqlの公式サイトからダウンロードしたものなので、
チェックしなくても大丈夫でしょう。

このままだとmy.cnfがないので作成します。最低限だけ書いて、あとは「datadir」を指定

「datadir」を以前のdatadir(マウント先にある)に指定するとエラー・・・

以下で立ち上がるか確認。

sudo mysqld_safe


メッセージはでるけど終わらない。ctr + Cも効かないので、ssh別セッション起動
するとmysql起動してました。


これでmysqldumpで障害発生前のデータを取得できました。




Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

datepickerでDBにデータある日付のみ選択可能に

タイトルに関わる箇所だけ抜粋
パラメータとかは見ずらくなるので抜いてます。

project.calendar= function () {
    var options= this;
    options.month;
    options.dateArray = [];
  options.url = '/test/';
  options.timeout = 5000;
};

//dbにある日付か
project.calendar.prototype.invalidateion = function (date) {
  var ieFlg = project.calenar.prototype.validataionIe(),ymdArr = date.toLocaleDateString().split('/');
  if(ieFlg){
    ymdArr= [date.getFullYear(),date.getMonth() + 1,date.getDate()];
  }
  var y = ymdArr[0],m = ("0" + ymdArr[1]).slice(-2),d = ("0" + ymdArr[2]).slice(-2), ymd = y + m + d;
  if (m !== options.month) {
    if (parseInt(d) > 1) {
      if (parseInt(m) === 12) {
        y = parseInt(y) + 1;
        m = '01';
      } else {
        m = ("0" + (parseInt(m) + 1)).slice(-2);
      }
    }
    //データある日付
    project.calendar.prototype.getDateAjax(y + m)
      .done(function (data) {
        options.dateArray = data['result'];
      })
      .fail(function () {
        options.dateArray = [];
      });
    options.month = m;
  }
  return $.inArray(ymd, options.dateArray ) !== -1 ? result = [true, ''] : [false, ''];
}

//データ取得
project.calendar.prototype.getDateAjax = function (ym) {
  var dfd = $.Deferred();
  $.ajax({
    async: false,
    url: options.url + '?ym=' + ym,
    type: 'get',
    dataType: 'json',
    timeout: options.timeout,
    success: function (data) {
      if (data['err'] !== '') {
        return dfd.reject();
      }
      return dfd.resolve(data);
    },
    error: function () {
      return dfd.reject();
    }
  });
  return dfd.promise();
}

//initialization
var calendar= new project.calendar();
$('.datepicker').datepicker({
  beforeShowDay: function (date) {
    return calendar.invalidateion(date)
  }
});

1.datepicker設定

var calendar= new project.calendar();
$('.datepicker').datepicker({
  beforeShowDay: function (date) {
    return calendar.invalidateion(date)
  }
});

「beforeShowDay」で、[真偽値, '']の形式で返すことにより、選択の可否を設定できます。

[true, '']は有効、[false, '']は無効。
 第二引数はクラス名

2.「beforeShowDay」で渡される、表示される月のカレンダーの日付を分割

var ieFlg = project.calenar.prototype.validataionIe(),ymdArr = date.toLocaleDateString().split('/');
if(ieFlg){
  ymdArr= [date.getFullYear(),date.getMonth() + 1,date.getDate()];
}

ieやedgeだと、日付の形式が他のブラウザとちがうので、分けてます。
ie判定はユーザエージェントで
てか、全部getFullYear()とかでやればいいですね・・・

3.表示可否決定

if (m !== options.month) {
  if (parseInt(d) > 1) {
    if (parseInt(m) === 12) {
      y = parseInt(y) + 1;
      m = '01';
    } else {
      m = ("0" + (parseInt(m) + 1)).slice(-2);
    }
  }
  //データある日付
  project.calendar.prototype.getDateAjax(y + m)
    .done(function (data) {
      options.dateArray = data['result'];
    })
    .fail(function () {
      options.dateArray = [];
    });
  options.month = m;
}
return $.inArray(ymd, options.dateArray ) !== -1 ? result = [true, ''] : [false, ''];

if (m !== options.month)で、月が変わったときだけやってます。
もっといいやり方いっぱいありそうですね。

表示された全ての日付に対して処理するのは無駄なので上記制限します。
最初に取得したデータを使いまわします。

if (parseInt(d) > 1)は、カレンダーの始まりが前の月の日付かの判定です。
前の月の場合、月に+1したりしてます。

あとはajaxでとってきたデータに、「beforeShowDay」で渡される日付があるかを調べて、あるなら選択可能。なければ選択不可として結果を返してます。

※非同期だとカレンダーに値をセットする前に表示される可能性があるので、同期に設定してます。

async: false


Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unity5の教科書 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)