WEB技術

PHP7.3でFTPS通信

php7.3にてftps通信をしました。
ftp_nlistやftp_put・ftp_getが使用できませんでした。
色々と試してみると、ftp_set_optionでFTP_USEPASVADDRESSをオフにしてからパッシブモードに移行すると関数が使えるようになりました。
悩んでる方はぜひためしてみてください。

//FTP通信でファイルを取得する
$connection = ftp_ssl_connect(Configure::read(‘FtpServerHost’));
$login_result = ftp_login(
$connection,
Configure::read(‘FtpUser’),
Configure::read(‘FtpPassword’)
);
//=======================================================オプションを設定
ftp_set_option($connection, FTP_USEPASVADDRESS, false);
//=======================================================パッシブモードに変更
ftp_pasv($connection, true);
//=======================================================ディレクトリの内容を得る
$files = ftp_nlist($connection, Configure::read(‘RemoteDir’));
ftp_close($connection);

ワイルドカードでLet’s Encrypt を設定する

環境

cat /etc/redhat-release
CentOS release 6.8 (Final)

certbot-autoを取得する

curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
chmod 700 /usr/bin/certbot-auto

コマンド実行

/usr/bin/certbot-auto certonly --manual \
-d *.rexius.co.jp \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory

途中でyumが走り必要なパッケージがインストールされる
コマンド実行中にtxtレコードが出てくるのでそれをvaluedomainに設定

txt _acme-challenge XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

反映後にコマンドを実行する

apacheの設定を変更


ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/home/htdocs/rexius.co.jp"
ServerName *.rexius.co.jp
ServerAlias *.rexius.co.jp
ErrorLog "logs/rexius.co.jp-error_log"
CustomLog "logs/rexius.co.jp-access_log" common
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/rexius.co.jp/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/rexius.co.jp/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/rexius.co.jp/chain.pem

更新コマンドでコケたのでマニュアル更新

/usr/bin/certbot-auto certonly

Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Apache Web Server plugin (apache)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 1

Plugins selected: Authenticator apache, Installer None
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): *.rexius.co.jp

Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/rexius.co.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Renewing an existing certificate

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/rexius.co.jp/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/rexius.co.jp/privkey.pem
Your cert will expire on 2019-06-26. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

30日以内なら更新してApacheを再起動
certbot-auto renew -q --no-self-upgrade --post-hook "service httpd reload"

上記だと発行直後なのでエラーが出てこないので強制的に発行
certbot-auto renew -q --force-renewal --post-hook "service httpd reload"

crontabに設定

00 07 * * * certbot-auto renew -q --no-self-upgrade --post-hook "service httpd reload"
毎日朝7時に自動更新

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: