WEB技術

AWSにはswap領域がない。

AWSのEC2には、Swap領域がないため仮想メモリを使えずphpでエラーになったり、MySqlが止まってしまったりします。
なので下記のように対策します。

対策

[root@rexius ~]# cat /var/log/mysqld.log
181001 10:48:01 [Note] Plugin 'FEDERATED' is disabled.
181001 10:48:01 InnoDB: The InnoDB memory heap is disabled
181001 10:48:01 InnoDB: Mutexes and rw_locks use GCC atomic builtins
181001 10:48:01 InnoDB: Compressed tables use zlib 1.2.8
181001 10:48:01 InnoDB: Using Linux native AIO
181001 10:48:01 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
181001 10:48:01 InnoDB: Completed initialization of buffer pool
181001 10:48:01 InnoDB: Fatal error: cannot allocate memory for the buffer pool
181001 10:48:01 [ERROR] Plugin 'InnoDB' init function returned error.
181001 10:48:01 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
181001 10:48:01 [ERROR] Unknown/unsupported storage engine: InnoDB
181001 10:48:01 [ERROR] Aborting

181001 10:48:01 [Note] /usr/libexec/mysql55/mysqld: Shutdown complete

[root@rexius lib]# free
total used free shared buffers cached
Mem: 4048016 1698908 2349108 416 25408 165964
-/+ buffers/cache: 1507536 2540480
Swap: 0 0 0

[root@rexius ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 56K 2.0G 1% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/xvda1 40G 30G 11G 75% /

[root@rexius ~]# dd if=/dev/zero of=/swapfile bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 61.2381 s, 70.1 MB/s

[root@rexius ~]# mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=0f88c85c-3c01-4e00-821e-39c171b1d344

[root@rexius ~]# swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.

[root@rexius ~]# free
total used free shared buffers cached
Mem: 4048016 3105976 942040 416 26896 1798824
-/+ buffers/cache: 1280256 2767760
Swap: 4194300 0 4194300

[root@rexius ~]# service mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]

[root@rexius ~]# vi /etc/fstab
#
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/swapfile none swap sw 0 0

mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+

vi /etc/my.cnf
innodb_buffer_pool_size=2000M

[root@rexius ~]# /etc/rc.d/init.d/mysqld restart

mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 2097152000 |
+-------------------------+------------+
1 row in set (0.00 sec)

AWSでmysqlが止まる。もしくは、phpでOut Of Memoryのエラーが出る場合

AWSにはswap領域がない。

AWSのEC2には、Swap領域がないため仮想メモリを使えずphpでエラーになったり、MySqlが止まってしまったりします。
なので下記のように対策します。

対策

[root@rexius ~]# cat /var/log/mysqld.log
181001 10:48:01 [Note] Plugin 'FEDERATED' is disabled.
181001 10:48:01 InnoDB: The InnoDB memory heap is disabled
181001 10:48:01 InnoDB: Mutexes and rw_locks use GCC atomic builtins
181001 10:48:01 InnoDB: Compressed tables use zlib 1.2.8
181001 10:48:01 InnoDB: Using Linux native AIO
181001 10:48:01 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
181001 10:48:01 InnoDB: Completed initialization of buffer pool
181001 10:48:01 InnoDB: Fatal error: cannot allocate memory for the buffer pool
181001 10:48:01 [ERROR] Plugin 'InnoDB' init function returned error.
181001 10:48:01 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
181001 10:48:01 [ERROR] Unknown/unsupported storage engine: InnoDB
181001 10:48:01 [ERROR] Aborting

181001 10:48:01 [Note] /usr/libexec/mysql55/mysqld: Shutdown complete

[root@rexius lib]# free
total used free shared buffers cached
Mem: 4048016 1698908 2349108 416 25408 165964
-/+ buffers/cache: 1507536 2540480
Swap: 0 0 0

[root@rexius ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 2.0G 56K 2.0G 1% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/xvda1 40G 30G 11G 75% /

[root@rexius ~]# dd if=/dev/zero of=/swapfile bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 61.2381 s, 70.1 MB/s

[root@rexius ~]# mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=0f88c85c-3c01-4e00-821e-39c171b1d344

[root@rexius ~]# swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.

[root@rexius ~]# free
total used free shared buffers cached
Mem: 4048016 3105976 942040 416 26896 1798824
-/+ buffers/cache: 1280256 2767760
Swap: 4194300 0 4194300

[root@rexius ~]# service mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]

[root@rexius ~]# vi /etc/fstab
#
LABEL=/ / ext4 defaults,noatime 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/swapfile none swap sw 0 0

mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+

vi /etc/my.cnf
innodb_buffer_pool_size=2000M

[root@rexius ~]# /etc/rc.d/init.d/mysqld restart

mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 2097152000 |
+-------------------------+------------+
1 row in set (0.00 sec)

SSL設定

SSLのチェック

https://www.ssllabs.com/ssltest/index.html

B判定で警告がでてきました。

This server uses SSL 3, which is obsolete and insecure. Grade capped to B.

# 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

This server accepts RC4 cipher, but only with older protocols. Grade capped to B.

# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
SSLCipherSuite EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5:!RC4

globalsign ssl pfx 変換

[秘密鍵]
openssl pkcs12 -in example.pfx -nocerts -nodes -out globalsign.key
[証明書]
openssl pkcs12 -in example.pfx -clcerts -nokeys -out globalsign.cer
[中間CA証明書]
ダウンロードする

ProLiant ML310e Gen8 v2にCentOS7のインストール

社内サーバーを数年交換しておらず数年前に買って動かしていなかったサーバー[ProLiant ML310e Gen8 v2]があったのでサーバーをリプレイスすることにしました。
正直当時どういう内容で発注したか全然記憶になかったので箱から出して手探りでの構築です。

ホットスワップ対応のHardRaidを別で購入してあったらしいのですが、うまくつかないのでもともとついていたB120iのRaidで制作しようと思います。

B120i RAID Controllerを使用したいのですが、問題が発生しました。

CentOSが論理ドライブを認識せず物理ドライブを認識してしまう。。。。

Google先生に聞いてみるとドライバをあてれば認識するらしいので挑戦してみました。

CentOSはこれを使用
http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1611.iso
普段はネットインストールをするのですが、ドライバーをあてる際に問題になってしまっても困るのでイメージでインストールしようとおもいます。
rufusでISOをUSBに書き込み

CentOSのバージョンによって
http://downloads.linux.hpe.com/SDR/repo/spp/RedHat/7/x86_64/current/hpvsa-1.2.16-102.rhel7u3.x86_64.dd.gz
これを解凍して下記ファイルを出します。
hpvsa-1.2.16-102.rhel7u3.x86_64.dd
この拡張子を
hpvsa-1.2.16-102.rhel7u3.x86_64.isoに変更してFAT32でフォーマットしたUSBにコピーします。

CentOSのインストール画面が出たらESCを押してコマンドモードに
boot:linux modprobe.blacklist=ahci inst.dd
と入力してドライバーの入っているUSBを選択します。

参考にしたサイト
URL:http://josafatisai.blogspot.jp/2016/01/installing-centos-7-on-hp-proliant.html

post送信した内容がかける[max_input_varsの設定]

post送信した内容をPHPで取得すると項目数が少ない!

この問題は過去の案件でも何度かあったんですが、想定していたpost数よりも多くpostしていることがあり、過去の案件のお客様からのご連絡で判明することがありました。
postの項目数をなるべく少なくしてプログラムを組まなきゃいけないんですが、どうしてもこの制限を超えてしまうことがあります。
内容の確認・設定の仕方をまとめておきたいと思います。

現在の設定の確認

max_input_varsはPHP5.3.9から導入されたらしいんですが、5.3.3でもこの制限にひっかかることがあります。
デフォルトでは1000に設定されていました。

まず現在の設定を確認しましょう。
通常php.iniにデフォルト値が書いてありますが、5.3.3ではphp.iniに書いてありませんでした。
てっとり早い方法はinfo.phpを作成してサーバーにアップロードしてアクセスしてください。
現在の設定が表示されたらmax_input_varsという項目を探します。
info.php

  phpinfo();

※レンタルサーバー上にある場合はレンタルサーバーのコンパネでphp.iniの設定を見れるところが多いのでそこで探すのも方法の一つです。

max_input_varsの変更

ここでは2種類の設定方法をご紹介いたします。

.htaccessで設定

php_value max_input_vars 2000

php.iniで設定

max_input_vars = 2000

値が変更されたか確認

上記内容で値を変更した場合は再度info.phpにアクセスして値が更新されていることを確認してください。

まとめ

postの項目数が少ないにこしたことはありません。
なるべく項目数が少なくシステムが稼働するように組むことは原則です。
ですが、案件や内容によってはどうしても1000件を超えてしまう場合はあると思います。
その場合は納品前にmax_input_varsの件数をもともと増やしておくことをおすすめします。

社外向けFTPユーザーの追加

CENTOS
VSFTPD

社外向けFTPユーザーの追加

ディレクトリ指定
suログイン無
useradd -d /var/www/html -s /sbin/nologin username

パスワードの設定
passwd username
Changing password for user xpadmin.
New UNIX password:
Retype new UNIX password:

Cakephp 2.X 日付型の文字列変更 form date controller

CakePHPでformで入力されたdate型のデータがcontrollerでは下記のように配列できてました。
これを処理する際に配列から文字列への変更をする方法が何個かあるんですが、
元々用意されている関数を使うと下記のような処理の仕方になると思います。

単一フィールド
$this->request->data["Post"]["post_date"] = $this->Order->deconstruct("post_date",$this->request->data["Post"]["post_date"]);
一括
$this->request->data = $this->Post->create($this->request->data["Post"]);
このやり方が一番スマートな方法なのかどうかはなんともいえませんが。。。

Cakephp 2.X 文字列の変換ユーティリティ 複数形 単数形 大文字

今日はCakePHPのInflectorユーティリティのメモです。

これを使うと色々効率よく関数を書けるのでたまに使用しております。

[php]
$name = Inflector::pluralize($singular);
入力: Apple, Orange, Person, Man
出力: Apples, Oranges, People, Men
[/php]

[php]
$name = Inflector::singularize($plural)
入力: Apples, Oranges, People, Men
出力: Apple, Orange, Person, Man
[/php]

[php]
$name = Inflector::camelize($underscored)
入力: Apple_pie, some_thing, people_person
出力: ApplePie, SomeThing, PeoplePerson
[/php]

[php]
$name = Inflector::underscore($camelCase)
underscoreはキャメルケースの文字列をアンダースコア(_)に変換します。
入力: applePie, someThing
出力: apple_pie, some_thing
[/php]

[php]
$name = Inflector::humanize($underscored)
入力: apple_pie, some_thing, people_person
出力: Apple Pie, Some Thing, People Person
[/php]

[php]
$name = Inflector::tableize($camelCase)
入力: Apple, UserProfileSetting, Person
出力: apples, user_profile_settings, people
[/php]

[php]
$name = Inflector::classify($underscored)
入力: apples, user_profile_settings, people
出力: Apple, UserProfileSetting, Person
[/php]

[php]
$name = Inflector::variable($underscored)
入力: apples, user_result, people_people
出力: apples, userResult, peoplePeople
[/php]

[php]
$name = Inflector::slug($word, $replacement = ‘_’)
slugは特殊文字をラテン文字に変換したり、スペースをアンダースコアに変換します。slugはUTF-8を前提とします。
入力: apple purée
出力: apple_puree
[/php]

Cakephp 2.X Modelの論理削除の実装

自社のサイトを更新していたらブログを全然書いていないことに気付いたのでたまにはメモ書きしようと思います。

今回は、CakePHP2.X系で論理削除を実装する流れです。

何件かbehaviorがあるようですが今回はCakeDCという所のBehaviorを紹介します。

1、まずbehaviorをダウンロードして/Model/Behaviorディレクトリにいれます。(MITライセンス)
https://github.com/CakeDC/utils/blob/master/Model/Behavior/SoftDeleteBehavior.php

2、論理削除する対象のモデルに下記項目を追加する
[php]
`deleted` tinyint(1) NOT NULL DEFAULT 0,
`deleted_date` DATETIME DEFAULT NULL,
[/php]

3、/Model/AppModel.phpに下記関数を記述します。
[php]
public function exists($id = null) {
if ($this->Behaviors->attached(‘SoftDelete’)) {
return $this->existsAndNotDeleted($id);
} else {
return parent::exists($id);
}
}

public function delete($id = null, $cascade = true) {
$result = parent::delete($id, $cascade);
if ($result === false && $this->Behaviors->enabled(‘SoftDelete’)) {
return (bool)$this->field(‘deleted’, array(‘deleted’ => 1));
}
return $result;
}
[/php]

4、対象となるモデルでSoftDeleteBehaviorの呼び出し
[php]
class Post extends AppModel {
public $actsAs = array( ‘SoftDelete’ );
[/php]

5、後は自動で論理削除されます。

6、削除されたレコードも表示した場合はdetachします。
[php]
$this->Behaviors->detach(‘SoftDelete’);
$posts= $this->Post->find("all", $params);
[/php]