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

なぜか突然VPSにアクセス出来なくなる問題。

なぜかここ最近になって、突然VPSのブログにアクセスできない事態がおきまして、

ブラウザからブログにアクセスしてもタイムアウトが発生。

SSHでの接続もダメ、タイムアウト発生。

でも、ブラウザからVPSのコンソールにはログイン可能。

いくら調べても、原因が分からない。

という状況でした。

で、ChatGPTにも相談していたのですが、

「一旦ファイアーウォールを止めてみろ。」

と言われました。

まぁ、仕事中(しかも忙しい)ので、調査もままならず、

再起動してブログサーバの運用を保っていたのですが、

1日後ぐらいにまた不通になる。

というのを繰り返しました。

で、ここで冷静になって考えてみました。

VPSに接続するためのドメインをお名前.comのDNSサーバに登録して使用しているのですが、

状況的にお名前.comからVPSに繋げる経路が無くなっているように見えます。

でも、お名前.comの設定は一切弄っていないので、

もしかしたら、VPSの瀬亭でお名前.comのDNSサーバの動きに影響を与えているのでは?

と考えました。

そこで、もう一度ファイアーウォールの設定を疑ってみることに。

例えば、お名前.comからVPSに対して何かしら通信を行っていて、

それをファイアーウォールがブロックしてしまっていることによって、

お名前.comからVPSへの経路を遮断させてしまったのでは?という説。

DNSはポート番号53番のTCP/UDPを使用しているようなので、

たぶん、その設定は全く意識してなかった。

で、突然お名前.comからアクセス出来なくなったのは、

何かしらお名前.comの動きが変わったか、

って考えてみました。

とりあえず、今はファイアーウォールを止めているので、このまま問題無く使用できたなら、ほぼ確定でしょうね。

【VPS】Ubuntuを24.04にアップグレードしたらiptablesはレガシーになってました。

VPSを構築したときはファイアウォールをiptablesで設定したのですが、

VPSにファイアーウォールを設定する | 自分、ぼっちですが何か?

iptableの設定を保存する | 自分、ぼっちですが何か?

どうやら24.04へアップグレードした時点でiptablesはレガシーとなってしまって、

デフォルトでnftablesを使用するように変わったらしい。

で、アップグレードした時点で勝手に切り替わってしまい、

ファイアウォールの設定が適用されていませんでした。

という事で設定作業開始。

過去のiptablesの設定内容は、以下の場所に残っているらしい。

$ sudo cat /etc/iptables/rules.v4

で、この設定をnfttablesAIに読み込ませてnfttableの設定に書き換えて貰いました。

$ sudo vi /etc/nftables.conf

テキストファイルを編集。

!/usr/sbin/nft -f

flush ruleset

table inet filter {
chain input {
type filter hook input priority 0;
policy drop;

    ct state established,related accept
    ip protocol tcp tcp flags & (fin|syn|rst|psh|ack|urg) == 0 drop
    ct state new ip protocol tcp tcp flags & (fin|syn|rst|ack) != syn drop
    ip protocol tcp tcp flags & (fin|syn|rst|psh|ack|urg) == (fin|syn|rst|psh|ack|urg) drop
    iif "lo" accept
    ip protocol icmp accept

    # 許可するポート(tcp/udp)
    tcp dport 80 accept
    tcp dport 443 accept
    tcp dport 20 accept
    tcp dport 21 accept
    tcp dport 3306 accept
  :
}

chain forward {
    type filter hook forward priority 0;
    policy accept;
}

chain output {
    type filter hook output priority 0;
    policy accept;
}

}

ファイルを保存したら、以下のコマンドで適用。

$ sudo nft -f /etc/nftables.conf

このときエラーがあれば、エラー内容が出力されます。

エラーがなければ再起動しても適用されるようにします。

$ sudo systemctl enable nftables
$ sudo systemctl start nftables

そして、適用されている設定内容を確認。

$ sudo nft list ruleset

設定内容と一致してたらOK。

【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'