Ubuntu20.04 Server + nginx + php-fpm 7.4 の動作環境を構築する

Ubuntu20.04 Serverにnginxをインストール。
php-fpmを使用してphpが動作する環境を作成してみます。

Ubuntu18.04にインストールしたときの手順を参考にしました。
Ubuntu18.04 Server + nginx + php-fpmの動作環境を構築する


php-fpmのインストール



aptでphp-fpmをインストール。


$ sudo apt install php-fpm




php 7.4がインストールされました。


$ php -v
PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies




php-fpmの設定ファイルは
「/etc/php/7.4/fpm/php-fpm.conf」

phpの設定ファイルは
「/etc/php/7.4/fpm/php.ini」

にそれぞれ作成されます。

動作モードを確認するため、php-fpmの設定ファイルを確認します。


$ tail /etc/php/7.4/fpm/php-fpm.conf
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
; - the global prefix if it's been set (-p argument)
; - /usr otherwise
include=/etc/php/7.4/fpm/pool.d/*.conf



「/etc/php/7.4/fpm/pool.d/」にある設定ファイルを読み込んでいます。
このディレクトリにはwww.confがあるので、この中身を見てみます。


$ vi /etc/php/7.4/fpm/pool.d/www.conf



「listen」の項目を確認。


; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
; 'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /run/php/php7.4-fpm.sock



「/run/php/php7.4-fpm.sock」でリクエストを待ち受けていることがわかりました。
nginxからは、このソケットにリクエストを転送するよう指定します。



php-fpmの起動と自動起動設定



systemctlでOS起動時にサービスが開始されるか確認してみます。


$ systemctl list-unit-files --type=service | grep php
php7.4-fpm.service                     enabled         enabled    
phpsessionclean.service                static         enabled    



自動起動が有効になっています。
aptでインストールした直後から起動し、ソケットファイルも作成されていました。


$ ls /run/php | grep php
php-fpm.sock
php7.4-fpm.pid
php7.4-fpm.sock





nginxのインストール



続いてnginxのインストールを行います。


$ sudo apt install nginx



nginx 1.17がインストールできました。


$ nginx -v
nginx version: nginx/1.17.10 (Ubuntu)



インストール後、サービスの状態を確認。


$ systemctl list-unit-files --type=service | grep nginx
nginx.service                         enabled         enabled    



php-fpm同様、自動起動が有効になっています。
ブラウザでhttp://[サーバーIP]/を表示すると、nginxが起動していることが確認できました。

a28_01.png



nginxの設定



拡張子phpのリクエストがきたら、php-fpmにリクエストを転送するよう設定します。
編集する設定ファイルは「/etc/nginx/sites-enabled/default」


$ sudo vi /etc/nginx/sites-enabled/default



56行目付近にphp設定のサンプルがコメントアウトされた状態で記載されています。
socketを使用する箇所のコメントを解除し、有効にします。


        # pass PHP scripts to FastCGI server
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #     # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        #     # With php-cgi (or other tcp sockets):
        #     fastcgi_pass 127.0.0.1:9000;
        }




編集が終わったらnginxの設定ファイルを再読込。


$ sudo service nginx reload




wwwのルートはデフォルトで「/var/www/html」となっています。
/var/www/html/info.phpを作成


$ sudo vi /var/www/html/info.php



phpinfoを表示してみます。


  1. <?php phpinfo();



http://[サーバーIP]/info.phpを表示。

a28_02.png

無事動いてくれたようです。

PHP 7.3 画像を円でくり抜き、背景を透過する(GD使用)

PHPで画像の真ん中を円形でくり抜き。
円形以外の領域は透過している画像をGDを使用して作成してみます。


使用する画像



こちらで作成した500px x 500pxの画像を使用します。
PHP 7.3 画像の一部を切り取り、別の画像ファイルに保存する(GD使用)

a07_01.png



作戦



まず、元の画像と同じサイズの画像を用意。
真ん中を円で塗りつぶします。
この時、塗りつぶす色は透過色を指定しておきます。

元画像と、円形の透過した画像を重ね合わせます。


  1. <?php
  2. // 画像ファイルを読み込み
  3. $src_image = imagecreatefrompng('src.png');
  4. // 画像ファイルは縦横500px
  5. $rect = 500;
  6. // 真ん中が透過色のマスク画像を用意
  7. $mask = imagecreatetruecolor($rect, $rect);
  8. // 背景色に緑(0, 255, 0)を指定して塗りつぶし(色は任意)
  9. $green = imagecolorallocate($mask, 0, 255, 0);
  10. imagefill($mask, 0, 0, $green);
  11. // ここで一旦デバッグ出力
  12. imagepng($mask, 'mask1.png');
  13. // マスクの透過色を指定(255, 0, 255)
  14. $mask_transparent = imagecolorallocate($mask, 255, 0, 255);
  15. imagecolortransparent($mask, $mask_transparent);
  16. // 中央の円を透過色で塗りつぶし
  17. imagefilledellipse($mask, $rect/2, $rect/2, $rect, $rect, $mask_transparent);
  18. // 確認用にマスク画像を出力
  19. imagepng($mask, 'mask2.png');
  20. // 元画像とマスク画像を重ね合わせ
  21. imagecopymerge($src_image, $mask, 0, 0, 0, 0, $rect, $rect, 100);
  22. // ここまでの結果を確認
  23. imagepng($src_image, 'debug.png');




デバッグ用に出力した中間画像はこのようになります。

・mask1.png
a08_01.png

・mask2.png
a08_02.png

・debug.png
a08_03.png

元画像の真ん中だけくり抜くことができました。
最後に、緑色で塗りつぶしている箇所を透過色に変更します。

最終的なソースはこのようになりました。


  1. <?php
  2. // 画像ファイルを読み込み
  3. $src_image = imagecreatefrompng('src.png');
  4. // 画像ファイルは縦横500px
  5. $rect = 500;
  6. // 真ん中が透過色のマスク画像を用意
  7. $mask = imagecreatetruecolor($rect, $rect);
  8. // 背景色に緑(0, 255, 0)を指定して塗りつぶし(色は任意)
  9. $green = imagecolorallocate($mask, 0, 255, 0);
  10. imagefill($mask, 0, 0, $green);
  11. // マスクの透過色を指定(255, 0, 255)
  12. $mask_transparent = imagecolorallocate($mask, 255, 0, 255);
  13. imagecolortransparent($mask, $mask_transparent);
  14. // 中央の円を透過色で塗りつぶし
  15. imagefilledellipse($mask, $rect/2, $rect/2, $rect, $rect, $mask_transparent);
  16. // 元画像とマスク画像を重ね合わせ
  17. imagecopymerge($src_image, $mask, 0, 0, 0, 0, $rect, $rect, 100);
  18. // 余分な背景色の緑(0, 255, 0)を透過色に指定
  19. $src_transparent = imagecolorallocate($src_image, 0, 255, 0);
  20. imagecolortransparent($src_image, $src_transparent);
  21. // 結果を出力
  22. imagepng($src_image, 'result.png');




狙い通りの画像が得られました。

・result.png
a08_04.png

ちゃんと透過されているかわかりにくいのですね。
画像ビューワーで表示した結果はこのようになりました。

a08_05.png

PHP 7.3 画像の一部を切り取り、別の画像ファイルに保存する(GD使用)

PHPでGDライブラリを使用し、画像の一部を切り取り。
別のファイルに保存してみます。


GD



大抵のレンタルサーバーにインストール済だと思います。

imagecreatefromjpegという関数を呼び出して、


PHP Fatal error: Uncaught Error: Call to undefined function imagecreatefromjpeg



というようなエラーが表示された場合はGDがインストールされていません。
以下のコマンドでインストールします。


$ sudo apt install php-gd





画像の切り抜き



切り抜いた箇所を貼り付ける画像リソースをimagecreatetruecolorで作成。


  1. imagecreatetruecolor(int $width , int $height)



imagecopyresampledで切り抜き範囲を指定し貼り付け。


  1. imagecopyresampled (
  2.     resource $dst_image ,
  3.     resource $src_image ,
  4.     int $dst_x ,
  5.     int $dst_y ,
  6.     int $src_x ,
  7.     int $src_y ,
  8.     int $dst_w ,
  9.     int $dst_h ,
  10.     int $src_w ,
  11.     int $src_h
  12. )



imagepngで保存します。


  1. imagepng ( resource $image [, mixed $to [, int $quality [, int $filters ]]] )



サンプル画像はこちらからお借りしました。
http://anihonetwallpaper.com/%e3%83%a9%e3%83%96%e3%83%a9%e3%82%a4%e3%83%96%e5%a3%81%e7%b4%99/16721



サンプルプログラム



矢澤にこの画像を正方形で切り抜いてみます。


  1. <?php
  2. // 画像ファイルを読み込み
  3. $src_image = imagecreatefromjpeg('sample.jpg');
  4. // 切り抜いた画像の貼付け先リソース(正方形)を確保
  5. $new_rect = 500;
  6. $dst_image = imagecreatetruecolor($new_rect, $new_rect);
  7. $src_x = 100;
  8. $src_y = 200;
  9. // 画像の切り抜き実行
  10. imagecopyresampled($dst_image, $src_image, 0, 0, $src_x, $src_y, $new_rect, $new_rect, $new_rect, $new_rect);
  11. // 結果を保存
  12. imagepng($dst_image, 'dst.png');



うまく切り抜けました。

a07_01.png

PHP 7.3をUbuntu Server 18.04へaptでインストール

Ubuntu Server 18.04
aptでインストールできるPHPのバージョンは7.2です。

PHP 7.3のインストールを試してみます。
こちらを参考にしました。
How to install PHP 7.3 on Ubuntu 18.04


現在インストールされているパッケージの最新化



apt update, upgradeで現在インストールされているパッケージを最新に更新しておきます。

$ sudo apt update
$ sudo apt upgrade




PPA(パーソナル・パッケージ・アーカイブ)の追加



PHP 7.3のPPAを追加

$ sudo apt install software-properties-common

$ sudo add-apt-repository ppa:ondrej/php
...
詳しい情報: https://launchpad.net/~ondrej/+archive/ubuntu/php
[ENTER] を押すと続行します。Ctrl-c で追加をキャンセルできます。
(Enterキーを押下)

$ sudo apt update





PHP 7.3のインストール



これまでの操作で、PHP 7.3がインストール候補に追加されます。

$ sudo apt search php7.3



お試しでPHP 7.3のコマンドラインインターフェースをインストール。

$ sudo apt install php7.3-cli



PHPのバージョンを確認

$ php --version
PHP 7.3.10-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Oct 8 2019 05:33:38) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.10-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies



PHP 7.3がインストールできました。


Laravel 5.8 Slackに通知を送信する(laravel/slack-notification-channel)

Laravel 5.8
laravel/slack-notification-channelを利用してSlackへの通知を試してみました。

本家のドキュメントはこちら
https://laravel.com/docs/5.8/notifications#slack-notifications


Slack Webhook URL



プログラムの前に通知先のURLを取得しておきます。
こちらにアクセスしWebhook URLを作成します。
https://slack.com/apps/A0F7XDUAZ

a04_01.png

a04_02.png

a04_03.png


https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
という形式のURLが取得できると思います。

.envファイルに追記しておきます。

・.env


SLACK_URL=https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX




laravel/slack-notification-channel



つづいて、slack通知用のライブラリ「laravel/slack-notification-channel」をインストールします。


$ composer require laravel/slack-notification-channel






Notifiable



Slackへの通知はNotifiableトレイトを使用しているクラスに対して実行可能となります。
サンプルして、デフォルトで存在するApp\Userを変更しSlackへの通知を可能にしています。

・app/User.php


  1. <?php
  2. namespace App;
  3. use Illuminate\Notifications\Notifiable;
  4. use Illuminate\Contracts\Auth\MustVerifyEmail;
  5. use Illuminate\Foundation\Auth\User as Authenticatable;
  6. class User extends Authenticatable
  7. {
  8.     use Notifiable;
  9.     /**
  10.      * The attributes that are mass assignable.
  11.      *
  12.      * @var array
  13.      */
  14.     protected $fillable = [
  15.         'name', 'email', 'password',
  16.     ];
  17.     /**
  18.      * The attributes that should be hidden for arrays.
  19.      *
  20.      * @var array
  21.      */
  22.     protected $hidden = [
  23.         'password', 'remember_token',
  24.     ];
  25.     /**
  26.      * The attributes that should be cast to native types.
  27.      *
  28.      * @var array
  29.      */
  30.     protected $casts = [
  31.         'email_verified_at' => 'datetime',
  32.     ];
  33.     // 以下を追加
  34.     public function routeNotificationForSlack($notification)
  35.     {
  36.         return env('SLACK_URL');
  37.     }
  38. }






Notification



通知する内容はNotificationクラスで指定します。
以下のコマンドでクラスの雛形を作成。


$ php artisan make:notification SampleNotification




app/Notifications/SampleNotification.phpが出力されます。
内容を以下のように編集。

・app/Notifications/SampleNotification.php


  1. <?php
  2. namespace App\Notifications;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Notifications\Notification;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Notifications\Messages\MailMessage;
  7. use Illuminate\Notifications\Messages\SlackMessage;
  8. class SampleNotification extends Notification
  9. {
  10.     use Queueable;
  11.     public function __construct()
  12.     {
  13.     }
  14.     public function via($notifiable)
  15.     {
  16.         return ['slack'];
  17.     }
  18.     public function toArray($notifiable)
  19.     {
  20.         return [
  21.         ];
  22.     }
  23.     public function toSlack($notifiable) {
  24.         return (new SlackMessage)
  25.             ->from('Bomb', ':bomb:') // 送信元
  26.             ->to('#general ') // 送信先
  27.             ->content('Slackへの通知テスト'); // メッセージ
  28.     }
  29. }




送信テスト用のコマンドを作成します。
・app/Console/Commands/SampleCommand.php


  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use App\User;
  6. use App\Notifications\SampleNotification;
  7. class SampleCommand extends Command
  8. {
  9.     protected $signature = 'my:command';
  10.     protected $description = 'コマンドサンプル';
  11.     public function __construct()
  12.     {
  13.         parent::__construct();
  14.     }
  15.     public function handle()
  16.     {
  17.         // Notifiableなオブジェクトを作成
  18.         $user = new User();
  19.         // 対象にSlackメッセージ配信
  20.         $user->notify(new SampleNotification());
  21.         
  22.     }
  23. }




実行


$ php artisan my:command



お手軽にSlackへ通知できました。

a04_04.png


複数人への一括配信



複数人に一括で配信したい場合は、Notification::sendが便利です。


  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use App\User;
  6. use App\Notifications\SampleNotification;
  7. use Illuminate\Notifications\Notification;
  8. class SampleCommand extends Command
  9. {
  10.     protected $signature = 'my:command';
  11.     protected $description = 'コマンドサンプル';
  12.     public function __construct()
  13.     {
  14.         parent::__construct();
  15.     }
  16.     public function handle()
  17.     {
  18.         // Notifiableなオブジェクトを作成
  19.         //$user = new User();
  20.         // 対象にSlackメッセージ配信
  21.         //$user->notify(new SampleNotification());
  22.         $users = [];
  23.         $users[] = new User();
  24.         \Notification::send($users, new SampleNotification());
  25.         
  26.     }
  27. }





ユーザーごとにメッセージ内容を変更



SampleNotificationのtoSlackは、Notifiableトレイトをuseしているオブジェクトが渡されます。
今回の例だとUserオブジェクトが$notifiableとして渡されます。

ユーザーごとにメッセージを変更したい場合は、$notifiableの内容により処理を変更すればOKです。

・SampleNotification.php


  1. <?php
  2. namespace App\Notifications;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Notifications\Notification;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Notifications\Messages\MailMessage;
  7. use Illuminate\Notifications\Messages\SlackMessage;
  8. class SampleNotification extends Notification
  9. {
  10.     use Queueable;
  11.     public function __construct()
  12.     {
  13.     }
  14.     public function via($notifiable)
  15.     {
  16.         return ['slack'];
  17.     }
  18.     public function toArray($notifiable)
  19.     {
  20.         return [
  21.         ];
  22.     }
  23.     public function toSlack($notifiable) {
  24.         return (new SlackMessage)
  25.             ->from('Bomb', ':bomb:') // 送信元
  26.             ->to('#general ') // 送信先
  27.             ->content('Slackへの通知テスト:'.$notifiable->name); // メッセージ
  28.     }
  29. }




・SampleCommand.php


  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use App\User;
  6. use App\Notifications\SampleNotification;
  7. use Illuminate\Notifications\Notification;
  8. class SampleCommand extends Command
  9. {
  10.     protected $signature = 'my:command';
  11.     protected $description = 'コマンドサンプル';
  12.     public function __construct()
  13.     {
  14.         parent::__construct();
  15.     }
  16.     public function handle()
  17.     {
  18.         $users = [];
  19.         $userA = new User();
  20.         $userA->name = 'Aさんへのコメント';
  21.         $users[] = $userA;
  22.         $userB = new User();
  23.         $userB->name = 'Bさんへのコメント';
  24.         $users[] = $userB;
  25.         $userC = new User();
  26.         $userC->name = 'Cさんへのコメント';
  27.         $users[] = $userC;
  28.         \Notification::send($users, new SampleNotification());
  29.         
  30.     }
  31. }




実行結果

a04_05.png

その他の使い方は、本家のドキュメントが詳しいです。
https://laravel.com/docs/5.8/notifications#slack-notifications



【参考URL】
https://laravel.com/docs/5.8/notifications#slack-notifications
Slack 通知を送信する
LaravelでFacadeを作ってSlackに通知してみた

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ