PG WORKS

PHPやLinux(サーバー)などのノウハウや、便利なツールを紹介していきます。

【CentOS7】PHP5.6からPHP7.4へのアップグレード手順

CentOS7でPHPのバージョンアップするときの方法です。
※CentOS8では、yumコマンドに代わる、dnfコマンドになりますので変更点があれば追記します。

PHP7パッケージがインストールできるEPELをインストール

yum install epel-release

リポジトリの追加

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

リポジトリの確認

ls -l /etc/yum.repos.d

インストールできるPHP一覧が確認できます。
今回はPHP7.4をインストールします。(PHP8は正式リリース版でなかったため)

-rw-r--r--  1 root root  456 Aug 17 19:29 remi-php54.repo	
-rw-r--r--  1 root root 1314 Aug 17 19:29 remi-php70.repo	
-rw-r--r--  1 root root 1314 Aug 17 19:29 remi-php71.repo	
-rw-r--r--  1 root root 1314 Aug 17 19:29 remi-php72.repo	
-rw-r--r--  1 root root 1314 Aug 17 19:29 remi-php73.repo	
-rw-r--r--  1 root root 1314 Aug 17 19:29 remi-php74.repo	
-rw-r--r--  1 root root 1314 Aug 17 19:29 remi-php80.repo

PHPと必要なパッケージも一緒にインストール

yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-mysql php-xml php-bcmath

php.confファイルの変更(変更されないこともあるので確認)
Apacheではない場合不要

vi /etc/httpd/conf.d/php.conf
mod_php5.c
↓
mod_php7.c

Webサーバーソフトウェア(Apache/Nginx)を再起動して対応完了です。
再起動をかけるとPHP5.6からPHP7.4に切り替わるのでPHP5.xでしか使えない関数があるとエラーがでるので注意!
WordPressやライブラリなど使用していた場合、事前にテストサーバーで確認したほうがいいです。(プラグインなどエラーがでる可能性有り)

【Laravel】大量INSERTする際に使う関数(chunk)

INSERT時にテーブルのカラム数が異常なほど多い場合やテキストデータのサイズが大きいと下記のエラーが出ます。

<?php
//General error: 1390 Prepared statement contains too many placeholders
?>

調べてみると、Laravelに何回か分けてINSERTできる関数があるそうでそれが「chunk」というものだそうです。

500件ずつデータを追加する場合

<?php
//サンプルの配列は1つですが、$inserts配列に1000個以上あるのと過程します。
$inserts[] = array('id'=>1’,'name'=>'テスト'); 
$insert_data = collect($inserts);
foreach ($insert_data->chunk(500) as $chunk) {
   DB::table('sample')->insert( $chunk->toArray());
}
?>

【CentOS】SSHの不正アクセスをBANするFail2banの設定

SSHからの不正アクセスを監視するFail2banの設定手順になります。

ほぼ海外からの総当たり攻撃なので、随時SSHの接続ログを確認して不正アクセスがないか確認しましょう。
※あまりにも多い場合、契約した先に確認し報告することをおすすめします。

不正アクセスがないかログから確認

less /var/log/secure

Fail2banのインストールと設定手順

yum install fail2ban
vi /etc/fail2ban/fail2ban.local
[Definition]
loglevel = NOTICE
vi /etc/fail2ban/jail.local
[DEFAULT]
# 1時間以内に5回不審なアクセスがあったら1日BAN
bantime  = 86400
findtime  = 3600
maxretry = 5

#CentOS7の場合systemd
backend = systemd

# SSHのアクセスに対する設定
[sshd]
enabled = true
banaction = firewallcmd-ipset

攻撃側にエラーメッセージを返さないように

vi /etc/fail2ban/action.d/iptables-common.conf
blocktype = DROP

fail2ban起動と確認コマンド

# 起動コマンド
systemctl start fail2ban

# 停止コマンド
systemctl stop fail2ban

# 自動起動を有効
systemctl enable fail2ban

# 自動起動の確認
systemctl is-enabled fail2ban

#現在のBAN状況
fail2ban-client status sshd

参考サイト様

qiita.com

【Laravel】PDO(mysql)を使ったSQL操作

Laravel版のPDOを紹介。

最初は使い方がわからず戸惑いましたが、今はページ送りやGET/POST関連の操作が気軽に実装できて重宝しています。

1件だけデータを取得

<?php
$sample = $DB::table('テーブル名')->where('id',1)->first();
// IDを表示
echo $sample->id;
?>

あいまい検索(sampleという名前がつくものすべてを検索)

<?php
$sample = $DB::table('テーブル名')->where('name','like','%sample%')->first();
// IDを表示
echo $sample->name;
?>

名前がNULLになっている番号を検索

<?php
$sample = $DB::table('テーブル名')->whereNull('name')->first();
// IDを表示
echo $sample->id;
?>

名前がNOT NULLの番号を検索

<?php
$sample = $DB::table('テーブル名')->whereNotNull('name')->first();
// IDを表示
echo $sample->id;
?>

複数のデータを取得

<?php
$samples = $DB::table('テーブル名')->get();
if( isset($samples) && count($samples)>=1){
  // あるだけIDを表示
  foreach( $samples as $row ){
    echo $sample->id;
  }
}
?>

ページ送り付きで検索

<?php
// Contoroller内で定義
// samplesview.bladeというファイルがあることを前提
$limit = 30;
$samples = $DB::table('テーブル名')->paginate($limit);
return view('samplesview',compact('samples'));

// samplesview.blade内で定義
// ページ送りを表示
{{ $samples->render(); }}

//検索したinputデータを引き継ぎしたい場合
{{ $samples->appends('id', @$inputs['id'])->render(); }}
?>

OFFSETとLIMITの指定

<?php
$samples = $DB::table('テーブル名')->offset(0)->limit(5)->get();
if( isset($samples) && count($samples)>=1){
  // あるだけIDを表示
  foreach( $samples as $row ){
    echo $sample->id;
  }
}
?>

データ編集系(トランザクション込み)

<?php
// データの追加
DB::beginTransaction();
try
{
   $DB::table('テーブル名')->insert(array('id'=>1));
   $id = DB::getPdo()->lastInsertId();  //新規追加したIDを取得
   DB::commit();
} catch( \exception $e ) {
   DB::rollback();
}

// データ更新
DB::beginTransaction();
try
{
   $DB::table('テーブル名')->where('id',1)->update(array('name'=>'samplename'));
   DB::commit();
} catch( \exception $e ) {
   DB::rollback();
}

// データ削除
DB::beginTransaction();
try
{
   $DB::table('テーブル名')->where('id',1)->delete();
   DB::commit();
} catch( \exception $e ) {
   DB::rollback();
}
?>

Let’s Encrypt(レッツエンクリプト)でワイルドカードを設定する方法

#「ドメイン名」は設定するドメインに変更
#「*」はワイルドカード指定
#「メールアドレス」こちらも自前のアドレスに変更
./certbot-auto certonly --manual -d 「*.ドメイン名」 -m 「メールアドレス」 --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

上記のコマンドを流すと、TXTレコードにドメインと、認証コードを設定してくださいと案内が表示されますので、レジストラにて設定します。
↑(認証コードは、コマンドを流すたびに変更されるため、浸透されるまでそのまま放置)

ムームードメインだと下記の記述になります。

サブドメイン 種別 内容
_acme-challenge TXT 認証コード

即時反映されないため、下記のコマンドで確認します。

#「ドメイン名」は確認するドメインに変更
nslookup -q=txt _acme-challenge.「ドメイン名」

下記の内容が表示されれば、浸透したことになります。
※浸透に時間かかる場合もあるため、何回か試すことをおすすめします。

Non-authoritative answer:
_acme-challenge.「設定したドメイン」    text = 「設定した認証コード」

確認出来た後、認証コードが表示された画面で放置したのを進めることで、証明書が発行されます。