カテゴリー: サーバー管理

  • AWS Amazon SESの利用

     稼働するドメインを追加して、メールを利用しようとしたところ、逆引きDNSは1IPアドレスにつき一つしか設定できなくて、満足な認証がされない。

     そこで、Amazon SESを利用することにした。DKIMも使えるし、十分信頼されそうだ。

     まずは、Amazon SESの利用を開始する。初期状態では、以下の送信制限がある。

    • 事前に登録したメールアドレス以外へ送れない
    • 1日に200通しか送れない
    • 1秒に1通しか送れない

     Amazon SESの利用を開始する。 

    https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html

    • Amazon SESコンソールを開く
    • Manage Identitiesの+をクリックする
    • Domainsページが開かれているので、Verify a New Domainをクリックする
    • ドメイン名を入力、Generate DKIM Settings をオンにしておく
    • Verify This Domainボタンを押す
    • 表示された情報をDNSに追加する
      • _amazonses.sample.com TXT xxxxxxx
      • xxx1._domainkey.sample.com CNAME xxx1.dkim.amazonses.com
      • xxx2._domainkey.sample.com CNAME xxx2.dkim.amazonses.com
      • xxx3._domainkey.sample.com CNAME xxx3.dkim.amazonses.com
      • sample.com MX 10 inbound-smtp.us-east-1.amazonaws.com
    • 最後のMXレコードはS3バケット経由でメールを受信する場合に使用する。
    • 検証が完了すると、DKIM setup SUCCESS for ドメイン という件名のメールがAWSアカウントに届く。

     外部のメールアドレスも登録しておく

    • 左ペインのEmail Addressesを選ぶ。
    • Verify a New Email Addressボタンを押す。
    • メールアドレスを入力して、Verify This Email Addressボタンを押す。
    • 入力したメールアドレスに、Amazon Web Services – Email Address Verification Request in region xxxという件名のメールが届くので、リンクを開く。

     次に、SMTP認証情報を作成する。

    • 左ペインのSMTP Settingsを選び、Create My SMTP Credentalsボタンを押す。
    • IAMユーザー名はデフォルトのses-smtp-user.xxxのままでかまわない。
    • 表示された内容をメモしておく。再度表示されないので、忘れると別のIAMユーザーを作るしかないらしい。

     WordPressのWP Mail SMTPプラグインにAmazon SESのSMTP認証情報を設定する。

    • メーラー:Other SMTP
      • Amazon SESは無料版では利用できない
    • SMTPホスト:email-smtp.ap-northeast-1.amazonaws.com
    • 暗号化:TLS
    • SMTPポート:25, 465 or 587
    • 認証:ON
    • SMTP Username:表示されたユーザー名
    • SMTP Password:表示されたパスワード

     Email TestタブでAmazon SESに登録しておいたメールアドレスに送信できれば完了。

  • WordPress 5.5への更新

     ある日、WordPressの更新があると表示されていた。

     とりあえず試験サイトで更新を行うが、PHPのタイムアウトで失敗した。

     現在のバージョンは5.4.1。サイトの構成は以下のとおり。

    サイトwwwwww2
    wordpressフォルダーC:¥xampp¥htdocs¥wordpress¥C:¥xampp¥htdocs¥wordpress¥
    アップロードフォルダーwp-content\uploadswp-content\uploads\www2
    データベース名wp-01wp-02

    PHPのタイムアウトを10分に変更してapacheを再起動。

    C:\xampp\php\php.ini
      max_execution_time=600

    ダッシュボードからwordpressを更新。

    • 約2分かかった
    • データベースの更新
    • wordpressのzipファイルのダウンロード
    • wp-content\upgradeフォルダーへの展開
    • ファイルの上書き

     テーマ及びプラグインを更新する。

     www2のダッシュボードを開くと、データベースの更新を要求されるので更新する。

     www2のテーマや、プラグインは更新されている。

    書き変えていた設定ファイルの反映。

    wordpress\wp-content\themes\twentytwenty\

    function.php
    function my_theme_widgets_init() {
      register_sidebar( array(
        'name' => 'Main Sidebar',
        'id' => 'main-sidebar',
      ) );
    }
    add_action( 'widgets_init', 'my_theme_widgets_init' );
    
      index.php
        <?php get_sidebar(); ?><!-- sidebar -->
      style.css
        /*
            h2.entry-title {
                font-size: 6.4rem;
            }
         */
    sidebar.php
    	<?php
    	if ( ! is_active_sidebar( 'main-sidebar' ) ) {
    		return;
    	}
    	?>
    
    	<div id="primary-sidebar" class="primary-sidebar widget-area" role="complementary">
    	  <?php dynamic_sidebar( 'main-sidebar' ); ?>
    	</div><!-- #primary-sidebar -->

    wordpress\

      .htaccess,index.php 変更なし。サイトアドレス(URL)変更への影響はなし。
      wp-config.php 変更なし。認証用ユニークキーがあるせいだろうか。

     変更された点。

    • ブロック移動用のグリップがなくなった。
    • 段落の先頭で/を押すとブロックの種類を選べるらしいが、かな漢字変換中では効かない。
    • 編集中のブロックに青枠が表示されることがある。
  • WordPress バックアップ その2

     その1で設定ファイルやデータベースをバックアップすることにしたが、いつまでも増えていくのは気持ちが悪い。

     古い方から削除することにした。

    Backup.bat

    echo off
    echo %DATE%-%TIME: =0% : Excecuting ... %0 %*
    rem DATEの出力で、先頭に曜日が漢字一文字で表示されることがある。
    rem その場合は設定-時計と言語-日付と時刻-日付と時刻の形式を変更するで、
    rem 日付(短い形式)でyyyy/MM/ddを選ぶと曜日が出力されなくなるようだ。
    rem OSのバージョンによっては、設定-時刻と言語-日付と時刻-日付、時刻、地域の書式設定-データ形式を変更する
    if not "%1" == "" goto :BACKUP
    
    setlocal
    
    if not exist %~d0%~p0log mkdir %~d0%~p0log
    
    set LOG_FILE=%~d0%~p0log\%COMPUTERNAME%_Backup_%date:~-10,4%-%date:~-5,2%-%date:~-2,2%.log
    
    if "%WORDPRESS_BACKUP%" == "" (
        echo no backup placement >> %LOG_FILE% 2>&1
        echo set WORDPRESS_BACKUP=xxx >> %LOG_FILE% 2>&1
        endlocal
    
        EXIT /B
    )
    
    if not exist %LOG_FILE% (
        rem ログファイルへ出力するため、あえてファイルを通して呼び出す
        for %%f in (ProgramData Squid xampp) do call %0 %%f >> %LOG_FILE% 2>&1
    
        call BackupMySQL.bat 30 >> %LOG_FILE% 2>&1
    
        call DeleteOldFile.bat %~d0%~p0log %COMPUTERNAME%_backup_*.log 30 >> %LOG_FILE% 2>&1
    
        call DeleteOldFile.bat C:\ProgramData\win-acme\acme-staging-v02.api.letsencrypt.org\Log log-*.txt 90 >> %LOG_FILE% 2>&1
        call DeleteOldFile.bat C:\ProgramData\win-acme\acme-v02.api.letsencrypt.org\Log         log-*.txt 90 >> %LOG_FILE% 2>&1
    )
    
    endlocal
    
    EXIT /B
    
    
    :BACKUP
    
    setlocal
    
    if exist \%1 (
      if not "%WORDPRESS_BACKUP%" == "" (
          echo robocopy  \%1 %WORDPRESS_BACKUP%\%1 /S /XJ /XO /XX /XL /NP
          robocopy  \%1 %WORDPRESS_BACKUP%\%1 /S /XJ /XO /XX /XL /NP
      )
    )
    
    endlocal
    
    EXIT /B

    BackupMySQL.bat

    @echo off
    echo %DATE%-%TIME: =0% : Excecuting ... %0 %*
    rem MAX_FILES 残す個数
    
    setlocal
    
    set /a MAX_FILES=0
    if not "%1" == "" set /a MAX_FILES=%1
    
    for %%i in (wp-01 wp-02) do call :MYSQLDUMP %%i %MAX_FILES%
    endlocal
    
    EXIT /B
    
    
    :MYSQLDUMP
    
    setlocal
    
    if not exist %~d0%~p0MySQL mkdir %~d0%~p0MySQL
    set SQL_FILE=%~d0%~p0MySQL\%COMPUTERNAME%_%1_%date:~-10,4%-%date:~-5,2%-%date:~-2,2%.sql
    
    if not exist %SQL_FILE% (
        echo C:\xampp\mysql\bin\mysqldump -u -p %1
        C:\xampp\mysql\bin\mysqldump -u ユーザー名 -pパスワード %1 > %SQL_FILE%
        if errorlevel 1 goto :NO_FILE
        
        for %%f in (%SQL_FILE%) do (
            if %%~zf == 0 goto :NO_FILE
            if "%%~zf" == "" goto :NO_FILE
        )
    
        if not "%WORDPRESS_BACKUP%" == "" (
            if not exist %WORDPRESS_BACKUP%\xampp\Tools\MySQL mkdir %WORDPRESS_BACKUP%\xampp\Tools\MySQL
            echo copy /Y %SQL_FILE% %WORDPRESS_BACKUP%\xampp\Tools\MySQL\
            copy /Y %SQL_FILE% %WORDPRESS_BACKUP%\xampp\Tools\MySQL\
        )
    
        call DeleteOldFile.bat %~d0%~p0MySQL %COMPUTERNAME%_%1_*.sql %2
    )
    
    endlocal
    
    EXIT /B
    
    :NO_FILE
    
    echo SQL output fail.
    
    endlocal
    
    EXIT /B 1
    

     DeleteOldFile.bat

    @echo off
    echo %DATE%-%TIME: =0% : Excecuting ... %0 %*
    rem FOLDER フォルダー
    rem PATERN ファイルパターン
    rem MAX_FILES 残す個数
    
    setlocal enabledelayedexpansion
    
    set FOLDER=%1
    set PATERN=%2
    set /a MAX_FILES=0
    if not "%3" == "" set /a MAX_FILES=%3
    
    if %MAX_FILES% LEQ 0 (
        endlocal
        EXIT /B
    )
    
    rem "日時"+"ファイル名"の形式で一覧を作成する。本来はファイルへのマッチなので?*は使えない
    set files=
    for %%f in (%FOLDER%\%PATERN%) do (
      echo %%~nxf %%~tf
      for /F "usebackq delims=" %%a in (`forfiles /P %FOLDER% /M "%%~nxf" /C "cmd /c echo \"@fdate-@ftime\""+@file`) do (
          rem echo %%a
          set files=!files! %%a
      )
    )
    
    echo files=%files%
    rem 逆順にソートする
    for /F "usebackq delims=" %%a in (`qsort2.bat /r !files!`) do set filess=%%a
    echo filess=%filess%
    
    if "%filess%" == "" (
        echo stack overflow
        endlocal
        exit /b 1
    )
    
    
    set /a FILE_COUNT=0
    for %%g in (%filess%) do (
      set /a FILE_COUNT=!FILE_COUNT! + 1
      if !FILE_COUNT! GTR %MAX_FILES% (
        for /F "tokens=2 delims=+" %%b in (%%g) do (
          set FILE=%%b
          del %FOLDER%\!FILE:~1!
        )
      )
    )
    
    endlocal

    qsort.bat

    @echo off
    rem echo %DATE%-%TIME: =0% : Excecuting ... %0 %*
    rem https://qa.codeflow.site/questions/133154/how-do-i-implement-quicksort-using-a-batch-file
    
    setlocal enabledelayedexpansion
    
    set REVERSE=
    
    set sorted=
    call :func_sort %*
    
    echo %sorted%
    endlocal
    
    exit /b
    
    
    :func_sort
    
    rem shiftは%*を変更しないので、%*で呼ばれた後にshiftを使う
    if /I "%1" == "/r" (
      set REVERSE=1
      shift /1
    )
    
    :sort_loop
      rem If we've only got one left, we're done.
      if /%2/ == // (
        set sorted=%sorted% %1
        rem You need to do this so that sorted is actually set before printing. 
        exit /b
      )
    
    rem Check if it's in order.
    if "%REVERSE%" == "" (
      if %1 LEQ %2 (
        rem add first value to sorted: 
        set sorted=%sorted% %1
        shift /1
        goto :sort_loop
      )
    ) else (
      if %1 GEQ %2 (
        rem add first value to sorted: 
        set sorted=%sorted% %1
        shift /1
        goto :sort_loop
      )
    )
    
    rem Out of order.
    rem Reverse them and recursively resort.
    set redo=%sorted% %2 %1
    set sorted=
    shift /1
    shift /1
    
    :redo_loop
      if not /%1/ == // (
        set redo=%redo% %1
        shift /1
        goto :redo_loop
      )
    
    
    Call :sort_loop %redo%
    rem When we get here, we'll have already echod our result.
    exit /b

     batファイルで完結するソート方法であったが、ファイルが29個以上だとスタックの制限を超え、戻り値は””となった。

     仕方がないので、sort.exeを利用するバージョンを最終的に採用した。

    qsort2.bat

    @echo off
    rem echo %DATE%-%TIME: =0% : Excecuting ... %0 %*
    
    setlocal enabledelayedexpansion
    
    set REVERSE=
    if /I "%1" == "/r" (
      set REVERSE=/R
      shift /1
    )
    
    :TEMP_NAME
    set TEMP_FILE=%TEMP%\sort_%RANDOM%.tmp
    set TEMPO_FILE=%TEMP%\sorto_%RANDOM%.tmp
    if exist %TEMP_FILE% goto :TEMP_NAME
    
    rem ファイルに1行ずつ出力する
    :LOOP
    
    if "%1" == "" goto :LOOP_END
    
    echo %1 >> %TEMP_FILE%
    shift /1
    goto :LOOP
    
    :LOOP_END
    
    sort.exe %REVERSE% %TEMP_FILE% /O %TEMPO_FILE%
    if ERRORLEVEL 1 goto :ERR
    
    set sorted=
    for /F "delims=" %%a in (%TEMPO_FILE%) do set sorted=!sorted! %%a
    
    del %TEMP_FILE%
    del %TEMPO_FILE%
    
    echo %sorted%
    endlocal
    
    exit /b
    
    :ERR
    
    endlocal
    
    exit /b