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)

AWS WindowsServer2016+Apache24+PHP7.2にてintlが有効にならない

環境

Amazon EC2
WindowsServer2016
Apache24
PHP7.2

現象

Apacheは通常通り起動し、phpも問題ないがintlが読み込めないとapacheのログにエラーがでる。

PHP Warning: PHP Startup: Unable to load dynamic library 'intl' (tried: C:\\php\\ext\\intl (\xef\xbf\xbdw\xef\xbf\xbd\xe8\x82\xb3\xef\xbf\xbd\xea\x82\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdW\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd[\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc2\x82\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xdc\x82\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdB), C:\\php\\ext\\php_intl.dll (\xef\xbf\xbdw\xef\xbf\xbd\xe8\x82\xb3\xef\xbf\xbd\xea\x82\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdW\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd[\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc2\x82\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xdc\x82\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdB)) in Unknown on line 0

解消方法

ググってみるとicuライブラリというものをインストールするという記事がでてきた。
ただ、phpのディクレクトリにicuのdllが存在していた。(c:\phpディレクトリ)

なのでWindowsで環境変数のパスをとおして解消しました。

システム環境変数のPathに下記を追加してApacheを再起動で解消しました。
C:\php

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

Raspberry pi 3 初期設定

OSの準備

・日本のミラーサイトからダウンロード
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

・今回は下記zipを使用
http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2017-09-08/2017-09-07-raspbian-stretch.zip

win32diskimagerでSDに書き込み[Windowsの場合]
ソフトは下記サイトから取得
https://forest.watch.impress.co.jp/docs/review/1067836.html

後はラズパイに指して起動するだけ。

環境の構築

アップデート処理
sudo apt-get update
APTライブラリのインデックスを更新します。
この更新をするとapt時の取得先が日本のJAISTさんになるようです。
これをしておかないとvimのインストールでこけます。

既存のvimの削除
sudo apt-get --purge remove vim-common vim-tiny

vimのインストール
sudo apt-get install vim

sambaのインストール
sudo apt-get -y install samba
バージョンの確認
smbd -V
Version 4.5.12-Debian

sudo vi /etc/samba/smb.conf
//末尾に追記
[pi]
comment = Raspberry Pi
path = /home/pi
guest ok = yes
read only = no
public = yes
browsable = yes
force user = pi

sudo /etc/init.d/samba restart

globalsign ssl pfx 変換

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

iOSアプリの審査でIPv6環境でwebviewが真っ白だということでリジェクトされる

過去の作ったアプリのバージョンアップ申請をしました。

今回は過去に制作したアプリの最新OSへの対応ということでバージョンアップ申請をしてみました。
開発環境では正常に動いており、コード部分も問題がなさそうなのでitunesconnectにアップロードしました。

1.IPv6環境にてwebviewが正常に表示されないということでリジェクトされる。

アップルは2016年から審査にIPv6環境での動作チェックも含みますと宣言していたのでIPv6環境で正常に動作するかチェックが行われるようです。

今回、そのIPv6環境での動作に問題があるということでリジェクトされたみたいです。

1.アップルさんの回答

Performance - 2.1

We discovered one or more bugs in your app when reviewed on iPad running iOS 10.2.1 on Wi-Fi connected to an IPv6 network.

Your app displays blank page upon launch.

The steps to reproduce are:

1. Launch the app
2. Blank page is displayed

Please see attached screenshots for details.

Next Steps

Please run your app on a device while connected to an IPv6 network (all apps must support IPv6) to identify any issues, then revise and resubmit your app for review.

If we misunderstood the intended behavior of your app, please reply to this message in Resolution Center to provide information on how these features were intended to work.

For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue. For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue.

Resources

For information about supporting IPv6 Networks, please refer to Supporting IPv6 DNS64/NAT64 Networks and About Networking.

2.IPv6時に動作しないコードやIPv4のIPアドレスなどがないかチェック

IPv6時に動作しないコードやIPv4のIPアドレスなどがないかチェックしました。
コードは問題ないようです。

4.そもそもIPv6とか関係なくないか?

やれることがなくなってしまったので、じっくりと考えてみました。
そもそもIPv6環境だろうがIPv4環境だろうが現在正常に動いているのであれば問題ないのではないか?

IPv6環境からの名前解決は下記の順番

1、IPv6で名前解決
2、あれば終了。なければ3へ
3、IPv4で名前解決
4、Ipv6のローカル用にIpv6に変換してiPadに返す

やはり考えてみるとIPv4環境で名前解決ができていればIpv6環境でも名前解決するはず。

5.それでは何をチェックするべきなのか

1、IPv6環境でも動くソースコードになっているかチェック
2、IPv4環境でアクセスできていて正常動作しているかチェック
3、Appleさんが公開しているIpv6環境で正常に動くかチェック

この3つをチェックして大丈夫であれば、原因はAppleの審査環境でのネットワークの問題ではないだろうか。

Googleで色々調べていると再度審査をお願いすると通ったりするらしい。

つまりDNS64/NAT64 Transitionalが正常に動作していないのだろう。

6.実際にはどのようにして審査を通したか

ソースコードも環境もこちらでは問題ありませんでした。
どうしたらいいのかわかりませんでしたが、そのままの文面でAppleにコメントを返しました。
「推奨されている方法でIPv6環境を構築しチェックをかけたが正常に動作しています。ほかに考えられる問題はありますか?」

すると。。。。

7.Appleさんからの回答

Hello,

Thank you for your response. We will continue the review, and will notify you if there are any further issues.

Best regards,

App Store Review

また問題があれば連絡するよ。とりあえず審査してみるわ風な回答がきました。

8.まとめ

Appleさんから新しくコメントをもらってすぐにPending Developer Releaseになり無事審査を追加しました。

この場合DNSの問題などもあるので色々とやっかいですが、トラブルシューティング自体はそんなに難しくないと思います。

100%審査を通すならIPv6の割り当てられているサーバーでIPv6の名前解決が正常にできる環境がいいでしょう。
Appleの環境に左右されないので。

ただ、サーバー側を管理や選定が自分の会社ではない場合は多いはずです。

その場合は必要なチェックをかけAppleにチェック結果を報告し、いい担当者(いい審査環境?)にあたるのを待つしかないのかもしれません。

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: