「Linux」カテゴリーアーカイブ

【Linux】phpバージョンが変わるとnginxの設定を変えなくちゃいけないのがめんどくさい。

これは、元々VPSにブログサーバを立ち上げるのに

VPSにPHPを入れる | 自分、ぼっちですが何か? (taki-lab.site)

こんな感じでnginxの設定ファイルを書いたのですが、

これはいろいろ調べ上げて自力で書いたやつなんですが、

ubuntuのバージョンアップグレードを実施すると、phpのバージョンが変わってしまい、

毎回設定を書き換えないとWordPressが動いてくれません。

で、最近解決方法が分かりまして、

(いろいろ現場の数をこなして学びました)

上がubuntu22.04のスクショ。

phpのバージョンは8.1です。

で、この下がnginxの記述。

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

.phpファイルはphp7.4-fpm.sockに送る設定になっています。(ubuntu 18.04時の設定)

が、スクショの中の水色の所を見ると、

シンボリックリンクphp-fpm.sockが存在しているのが分かると思います。

この先をたどってみると、

となっていて、さらにシンボリックリンクが設定されていて、php8.1-fpm.sockにリンクしているのが分かります。

なので、「nginxの設定ファイルの中で、このシンボリックリンクを参照するようにすればいいんじゃね?」

って思いました。

なので、こんな感じになります。

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php-fpm.sock;
        }

こんなかんじで、

  • 外部からはシンボリックリンクを参照する。
  • 参照先を更新する場合は、同じ名前のシンボリックリンクを、リンク先を変更して作成し直す。

これは現場でも使用されるテクニックなので、覚えておいた方が良いです。

【Linux】MySQLのrootパスワードを忘れてしまった場合の再設定方法

こちらのサイトを参考にしました。

https://www.sejuku.net/blog/83286
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

以下の記載を追加

skip-grant-tables
skip-networking

MySQL再起動

$ sudo systemctl restart mysql.service

mysqlでログインできるようになっているので、

$ mysql

パスワード再設定

ALTER USER root@localhost IDENTIFIED BY 'fugifugi';

mysqld.cnfの設定を元に戻してmysqlを再起動。

$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
$ sudo systemctl restart mysql.service

rootログインを確認する。

【Linux】スワップファイルを作成する。

sudo dd if=/dev/zero of=/var/swap.1 bs=1M count=4096
sudo mkswap /var/swap.1
sudo chmod 600 /var/swap.1
sudo swapon /var/swap.1

これでスワップファイルが作れるのだが・・・

再起動するたびに作成しなくちゃいけないのがめんどくさい。

起動すると勝手に作ってくれる方法は無いだろうか?

こちらに答えが書いてありました。

https://kazmax.zpp.jp/linux_beginner/mkswap.html#ah_4

sudo vi /etc/fstab

このファイルに、

/var/swap.1                    swap           swap    defaults 0 0

と記入すればOK。

Let’s EncryptのSSL証明書の有効期限が切れていました。(解決済み)

いやー焦った焦った。

ブログの様子を見ようと思ったらこれだよ。

ERR_CERT_DATE_INVALID

というメッセージから読み取るに、

エラー、証明書、日付、不正。

ああ、証明書の日付がおかしな事になっているのね。

このサイトのSSL証明書はLet’s Encryptというツール(?)で発行しているので

ただ、自動更新する設定になっているはずだが、それがたまたま上手くいっていないのだろう。

SSHでサーバにログインし、証明書の日付を確認する。

コマンドはこれ。

$ sudo openssl x509 -in /etc/letsencrypt/live/【ドメイン名】/fullchain.pem -noout -dates

notAfterが証明書の有効期限が切れる日付です。

なるほど、8月20日午前7時11分(標準時刻)で期限が切れていたみたい。

$ sudo letsencrypt renew

で、手動による証明書更新を試みたものの、なぜかスキップされたので、

強制的に更新させました。

$ sudo letsencrypt renew --force-renewal

11月19日午前11時32分(標準時刻)に更新されました。

あ、標準時刻だから、日本時間はこれに+9時間する必要があるからね。

そして、忘れてはいけない、nginxの再起動。

$ sudo systemctl restart nginx.service

エラーは解消されました!!

【ラズパイ】Raspberry PI4が届いた!

買いました。

Raspberry Pi 4 Model B 2GB RAM。

これの一個前がRaspberry Pi 2 Model Bだったから、それより大幅なパワーアップです。

メモリもプロセッサーも強化されていますが、わかりやすいところで言うと、

HDMIポート1個から、Micro HDMIのポート2つになりました。

4K出力もできるみたいよぉ。

Micro HDMI対応のケーブルなんてほとんど出回っていないので、本体と一緒に注文しました。

Micro HDMI – HDMIのケーブルです。

これが無いと、ディスプレイに画面を表示できません。

そして、もう一つ、左側にあるのが電源です。

端子はUSB-Cなのですが、これを動かすのに3Aの出力が必要なので、一般に出回っているUSB-Cケーブルでは動きません。

これも本体と同時に対応電源を注文しました。

あとは、ストレージとなるMicro SDカード。

これだけでこのラズパイは動かせるのですが、ついでなので、もうちょっと遊べるパーツを買いました。

このボードに温度計、湿度計などなど、あと右下にジョイスティック、8×8のLEDディスプレイが付いているパーツです。

ラズパイ4でも動くはず。

さあ、セットアップするぞ。

この一式はこちらのサイトで購入しました。

https://raspberry-pi.ksyic.com

【Laravel】【ホテル予約管理】解錠APIを追加する

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

さて、前回からだいぶ期間が空いてしまいましたが、

続きやります。(思い出すのに時間かかった)

今回は、前回メールに添付したQRコードに書かれた解錠コードを使って解錠する処理を実装するのですが、

実際に解錠を行うのは、外部のデバイスを使用する、という前提として考え、ここではデバイスに入力した解錠コードをサーバに送信し、照合結果を返すAPIを実装します。

このAPIのレスポンスをデバイスが受信して、デバイスが実際に解錠を行います。そういう想定で実装します。

まず、APIのルーティングを作成します。

routes配下のapi.phpに以下を追加します。

Route::group(['middleware' => ['api']], function(){
    Route::post('/unlock', 'Api2Controller@unlock');
});

なぜ、今までのようにweb.phpではないかというと、web.phpには

Auth::routes();

がかかれてあり、ログイン状態でアクセスしなければAPIは受け付けられません。

デバイス側にログイン状態というのは意識できないので、この制約が入らないルートに設定しなければなりません。

では、コントローラーを作成します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Repository\RegisterManagementRepository;
use App\Repository\RoomRepository;
use App\Repository\UserRepository;

class Api2Controller extends Controller
{
    public function __construct()
    {
        $this->registerManagement = new RegisterManagementRepository();
        $this->room = new RoomRepository();
        $this->user = new UserRepository();
    }

    public function unlock(Request $request)
    {
        \Log::debug(print_r($request->input('number'), true));
        \Log::debug(print_r($request->input('room'), true));

        $registers = $this->registerManagement->getItemsByDate(date('Y-m-d'));
        if(is_null($registers) == false)
        {
            foreach ($registers as $register)
            {
                $room = $register->rooms()->first();
                if(is_null($room) == false)
                {
                    if($room->id == $request->input('room') &&
                        strcmp($register->lock_number, $request->input('number')) == 0)
                    {
                        return response()->json(['result' => true]);
                    }
                }
            }
        }
        return response()->json(['result' => false]);
    }
}

Api2Controller.phpを追加しました。

ApiController.phpでは、コンストラクタに

        $this->middleware('auth');

と記述しているため、これも上記と同じ理由で使用できません。

入力は部屋番号と解錠コードをjsonで入力します。

現在の日付から予約情報を取得し、部屋番号を解錠コードの比較を行い、一致したときにtrue、一致しない場合はfalseを返します。

思ったように動いているようです。

ただし、このままだと誰でもアクセスできてしまうので、セキュリティ的にガバガバ状態です。

デバイス情報を登録して、それも入力情報に含めるようにしましょうか。

次回やります。

【Laravel】まっさらな状態のLinuxから環境構築

この記事、定期的にアップデートしていこう。

MySQLのセットアップ

composerのインストール

$ sudo apt-get install composer

phpの足りないモジュールをインストール

$ sudo apt-get install php7.2-mbstring
$ sudo apt-get install php7.2-xml
$ sudo apt-get install php7.2-zip
$ sudo apt-get install php7.2-gd
$ sudo apt-get install php7.2-mysql

nginxのインストール

Laravelの設定

$ composer global require "laravel/installer"
$ cd /var/www
$ sudo chmod 777 html
$ cd html

リポジトリからLaravelのソースをclone

$ git clone リポジトリのURL
$ chmod 777 storage/
$ chmod 777 bootstrap/cache/

.envを作成して、設定を記入

$ composer install
$ php artisan key:generate

node.jsのセットアップ

$ sudo apt-get install npm
$ sudo apt-get install libpng-dev
$ npm install
$ npm run dev

データベースを設定

$ php artisan migrate
$ php artisan db:seed --class=実行するseederクラス

【Linux】mysqlをセットアップしたら躓いたので

忘れないようにメモしておく。

MySQLのインストール

$ sudo apt-get install mysql-server

rootパスワード設定

$ sudo mysql_secure_installation

問い合わせはすべてyを入力。

rootでログインを確認

$ sudo mysql -u root -p

MySQLにユーザーを追加

mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'

ユーザーに権限を設定

mysql> GRANT all ON *.* TO 'user'@'localhost'

【LARAVEL】【ホテル予約管理】QRコードをメールに添付して送信する

前回までの状況はこちら

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

さて、前回作成したQRコードをメールに添付して送信する実装を行います。

メーラーはGMAILを使用します。

自前のsmtpサーバを使おうとしたけど、うまくいかなかった。

smtpサーバの設定を.envに記入します。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxxx@gmail.com
MAIL_PASSWORD=xxxxx
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=xxxxx@gmail.com
MAIL_FROM_NAME=xxxxxx

内容を使用しているアカウント情報に合わせてください。

tinkerを使って、設定が正しいかを確認することができます。

$ php artisan tinker
>>> Mail::raw('test mail',function($message) {$message->to('xxxxx@gmail.com')->subject('test');});
=> null

正しく設定されていれば、メールが届くはずです。

※エラーが表示される場合は、GMAIL側の設定の問題だったりします。セキュリティ設定を変えてみてください。

では、メールを扱う処理を書いていきましょう。

以下のコマンドでメールクラスを作成します。

$ php artisan make:mail SendQRcodeMail

以下のように書き換えます。

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendQRcodeMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($img)
    {
        $this->img = $img;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.mail')
            ->from('manager@gmail.com','manager')
            ->subject('予約しました')
            ->attach($this->img);
    }
}

コンストラクタでQRコードの画像パスを受け取り、buildメソッドの中でattachで添付する、という処理になっています。

では、これを使用する処理を記入します。

use App\Mail\SendQRcodeMail;
use Mail;

    public function add($param, $room, $user)
    {
        Log::debug(print_r($param ,true));
        $model = new ReserveManagement;
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->lock_number = $this->generateLockNumber();
        QrCode::format('png')->size(100)->generate($model->lock_number, public_path('/img/qr.png'));
        $model->save();
        $this->attachToRoom($model, $room);
        $this->attachToSchedule($model);
        $this->attachToUser($model, $user);

        $to = [
            [
                'email' => $user->email, 
                'name' => $user->fullname,
            ]
        ];
        Mail::to($to)->send(new SendQRcodeMail('/var/www/html/hotel-mng/public/img/qr.png'));

    }

base64を添付しようと思いましたが、うまく行かなかったので、generateで画像をファイルに出力します。

Mailクラスを使用して、$toに宛先(ユーザー登録時に入力したものを使用します。)を設定し、sendで先程のクラスを使用します。

コンストラクタの引数には、画像のフルパスを設定します。

最後に、メールの本文。

[添付ファイル]

画像を表示できればいいので、シンプルなテンプレートにしました。

これをresources/views/emails/mail.blade.phpとして、保存します。

これで、正しく動いていれば、予約登録時にメールでQRコードが届きます。

【Laravel】【ホテル予約管理】解錠ナンバーをQRコードに変換する

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/hotel-mng

さて、今回は、前回作成したコードで生成した解錠コードをQRコードに変換します。

使用するのは、simplesoftwareio/simple-qrcodeというライブラリ。

Laravelのプロジェクトディレクトリにて、以下のコマンドを実行。

$ composer require simplesoftwareio/simple-qrcode

いま使用しているLaravelのバージョンは5.5.*なのでこれだけでライブラリが使用可能になります。

では、解錠コード生成処理を修正します。

use QrCode;

    public function add($param, $room, $user)
    {
        Log::debug(print_r($param ,true));
        $model = new ReserveManagement;
        foreach($this->paramNames as $name)
        {
            $model->$name = $param[$name];
        }
        $model->lock_number = $this->generateLockNumber();

        $src = base64_encode(QrCode::format('png')->size(100)->generate($model->lock_number));
        Log::debug(print_r($src ,true));
        $model->save();
        $this->attachToRoom($model, $room);
        $this->attachToSchedule($model);
        $this->attachToUser($model, $user);
    }

QrCodeクラスを使って解錠コードをpngファイルで生成、それをbase64に変換しています。

これは、とりあえずログに出力させています。

[2020-02-07 10:06:26] local.DEBUG: iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB3UlEQVR4nO2b24rEIBAFd8L+/yeHfRMWQbrsNjozVa+Ty1CcQ4zG133fPxLj2v0H3gllAZQFUBZAWQBlAZQFUBZAWQBlAZQFUBZAWQBlAZQFUBZAWYDfudOuK2W5Tc/21+lnbtsxg7Pm7k4xWQBlASZr2ECRHpRurlnJu1NMFkBZgGwNG4OQD8oyeNJVVaxwYdRkAZQFKKthFck+LsVkAZQFOKWGkZfE7ZgsgLIAZTWca01V157prMkCKAuQrWFy3iPybjgYneZnXRAmC6AswOuQsZ+D0k9DWYCF64ZoBTCycjH3WCyc8zFZAGUBsk/D8vX3yOlVV6aYLICyAPU17El2BL0ALh3KmiyAsgD1M6XJkSe6V4TC9UeTBVAWYPJpGMl2VfvQlOnS0anJAigLMPk0jCS5Pwa990V4+EsbkwVQFmDzDou5acy5L1EdlD6KsgCbd1hUHbzuPfTfX6q60DegLMDmHRYRkh/PuG64B2UBNn/aPahGcgEx8hPFZAGUBTh3h0WjamdxHpMFUBZg8w6LwemtUMkJmcJimiyAsgCbd1j010FLIX7Mdi7KApyyw+ItMFkAZQGUBVAWQFkAZQGUBVAWQFkAZQGUBVAWQFkAZQGUBVAWQFkAZQH+AEkJCJS/ZGd/AAAAAElFTkSuQmCC  

これは後ほど、HTMLメールのimgタグのsrc要素に書き込んで使用することを考えています。

これをブラウザで表示させてみましょう。

以下をアドレスバーに入力するとQRコードが表示されます。

data:image/jpeg;base64, iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB3UlEQVR4nO2b24rEIBAFd8L+/yeHfRMWQbrsNjozVa+Ty1CcQ4zG133fPxLj2v0H3gllAZQFUBZAWQBlAZQFUBZAWQBlAZQFUBZAWQBlAZQFUBZAWYDfudOuK2W5Tc/21+lnbtsxg7Pm7k4xWQBlASZr2ECRHpRurlnJu1NMFkBZgGwNG4OQD8oyeNJVVaxwYdRkAZQFKKthFck+LsVkAZQFOKWGkZfE7ZgsgLIAZTWca01V157prMkCKAuQrWFy3iPybjgYneZnXRAmC6AswOuQsZ+D0k9DWYCF64ZoBTCycjH3WCyc8zFZAGUBsk/D8vX3yOlVV6aYLICyAPU17El2BL0ALh3KmiyAsgD1M6XJkSe6V4TC9UeTBVAWYPJpGMl2VfvQlOnS0anJAigLMPk0jCS5Pwa990V4+EsbkwVQFmDzDou5acy5L1EdlD6KsgCbd1hUHbzuPfTfX6q60DegLMDmHRYRkh/PuG64B2UBNn/aPahGcgEx8hPFZAGUBTh3h0WjamdxHpMFUBZg8w6LwemtUMkJmcJimiyAsgCbd1j010FLIX7Mdi7KApyyw+ItMFkAZQGUBVAWQFkAZQGUBVAWQFkAZQGUBVAWQFkAZQGUBVAWQFkAZQH+AEkJCJS/ZGd/AAAAAElFTkSuQmCC

スマホで読み取ると、

データベース上では、

うまくできているようです!