20200521のlaravelに関する記事は7件です。

Laravel勉強 その1 サーバのセットアップ、DockerでのLaravel環境構築

目的

  • 勉強のため、Laravel 7.xの公式ドキュメントを読み解いていく。
  • 今回はそのための準備として、Dockerを使用して環境を構築する。

EC2の構築~セットアップ

今回は勉強なので、AWSの無料枠を利用する。
インスタンスタイプはt2.micro、OSはAmazon Linux2で作成。

参考

EC2(Amazon-Linux-2)にNginxを入れてブラウザで確認するまで2018冬 [画像で解説] Nginx編

rootでのPWログインをON

セキュリティ的には微妙なところもあるかもしれないが、いちいちsudo打たなければいけないのも面倒なので。。。

rootのPWを設定

# sudo su
# passwd

sshの設定ファイル変更

# vi /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes

sshd再起動

# systemctl restart sshd

ec2-userの無効化

セキュリティ的に消した方がいいよ、という記事を見つけた。確かに。

# userdel ec2-user

EC2を日本時間と日本語に対応させる

# yum update -y
# timedatectl set-timezone Asia/Tokyo
# localectl set-locale LANG=ja_JP.UTF-8
# localectl set-keymap jp106

パッケージを自動更新させる

yum-cronのインストール

# yum install yum-cron -y

yum-cronとは?
 yum-cron パッケージは、アップデートを自動的に確認し、ダウンロードし、適用するための便利な方法を提供します。
 パッケージをインストールするとすぐに yum-cron パッケージの cron ジョブが有効になり、特別な設定は必要ありません。通常の日次 cron ジョブの実行時に、このジョブが実行します。

yum-cronを編集

  # vi /etc/yum/yum-cron.conf
/etc/yum/yum-cron.conf
apply_updates = yes

cronの自動起動をON

# systemctl status yum-cron
# systemctl start yum-cron
# systemctl enable yum-cron

Laravel開発環境構築

参考

Docker × PHP7.3 × Laravel環境作ってみた

Docker・Docker Composeのインストール

Dockerインストール
# amazon-linux-extras install docker

Dockerサービス起動
# systemctl start docker.service

サービスの起動確認
# systemctl status docker

Dockerの自動起動設定
# systemctl enable docker

試しにDockerコマンド実行
# docker info
Docker Composeインストール
# curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Docker Composeのインストールを確認
# docker-compose --version
docker-compose version 1.25.4, build 8d51620a

ディレクトリ作成

以下の構成を想定しています。
project
├ docker-compose.yml
docker
│  ├ db
│  │  ├ data
│  │  ├ sql
│  │  └ my.cnf
│  ├ nginx
│  │  ├ default.conf
│  ├ php
│  │  ├ php.ini
│  │  └ Dockerfile
server

とのこと。(太字はディレクトリ)

# cd /var
# mkdir project
# mkdir project/docker project/server
# mkdir project/docker/{php,nginx,db}
# ll -d `find ./project`
drwxr-xr-x 4 root root 34 May 21 19:08 ./project
drwxr-xr-x 4 root root 30 May 21 19:08 ./project/docker
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/docker/db
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/docker/nginx
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/docker/php
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/server

別にvarじゃなくてもいいけど、なんとなくvarで。

swap領域の有効化

過去の経験上、これをやらないとこける。

# /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 13.537 s, 79.3 MB/s

# /sbin/mkswap /var/swap.1
mkswap: /var/swap.1: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=8be78b55-de6d-4ed4-9f9a-7a48f3dc30ae

# /sbin/swapon /var/swap.1
swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.

docker-compose.yml作成

docker-composer.yml
version: '3'

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./server:/var/www

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./server:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  db:
    image: mysql:5.7
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: ****(パスワードを記載しておく)
      MYSQL_DATABASE: test_db
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306

Dockerfile作成

phpコンテナの構築時に、以下のDockerfileを使用する。

Dockerfile
FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
    && apt-get install -y zlib1g-dev libzip-dev mariadb-client \
    && docker-php-ext-install zip pdo_mysql

#Composer install
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

RUN composer global require "laravel/installer"

各行の処理については、Dockerfileリファレンスを参照。

php.ini作成

phpの設定ファイル。

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

default.conf作成

nginxの設定ファイル。

default.conf
server {
  listen 80;

  root  /var/www/public;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   php:9000;
    fastcgi_index  index.php;

    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
}

php.ini作成

mysqlの設定ファイル。

my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

Laravelプロジェクト作成

docker起動
# docker-compose up -d
(略)
Creating php     ... done
Creating db-host ... done
Creating nginx   ... done

起動の確認
# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
9fdcb0da6745        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp                  nginx
e1394b974a68        project_php         "docker-php-entrypoi…"   3 minutes ago       Up 2 minutes        9000/tcp                            php
cbc7a83db192        mysql:5.7           "docker-entrypoint.s…"   3 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   db

phpコンテナに入る
# docker-compose exec php bash
root@eec8f5f9ebe2:/var/www#

Laravelプロジェクト作成
# laravel new
(略)
Application ready! Build something amazing.

Laravelまわりのディレクトリのパーミッション変更

# sudo chmod 2775 /var/project/server
# find /var/project/server -type d -exec sudo chmod 2775 {} +
# find /var/project/server -type f -exec sudo chmod 0664 {} +
# sudo chmod -R 777 /var/project/server/storage/
# sudo chmod -R 777 /var/project/server/bootstrap/cache

セキュリティグループの編集

今回環境を作成したEC2について、PORT:80からのインバウンド通信を許可するように編集する。

動作確認

動作確認をして、Laravelの白い画面が出てくればOK。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで構築したLaravel環境に、PHPStormでステップ実行デバッグを仕掛ける

元記事 Windows10 に PHP7+Laravel環境をDockerで構築
← 元元記事 最強のLaravel開発環境をDockerを使って構築する【新編集版】

目的

Dockerで構築したLaravel環境で実行されているPHPコードに対して、
JetBrains社の「PHPStorm」からステップ実行デバッグができるようにしたい。

ステップ実行デバッグとは

  • コードの好きな行で実行を停止させて、その瞬間の変数リストや変数の中身を覗き見する。
  • 1行ずつ実行させて、どこでエラー落ちするか追跡する。

といったことができる、例のアレ↓です。

image.png

概要

今回、PHP定番デバッグツール xdebug を使用して実現していきます。
(Laravel最新版には他にもイケてるデバッグツールがあると思いますが、諸事情で古いバージョンのLaravelを使用しなければならなかったので:sob:

PHPはサーバーサイドプログラミング言語なので、サーバー側に xdebug をインストールしてデバッグ情報を吐き出させるようにしないといけません。

加えて今回はWindowsやMacに構築したDockerコンテナの中でサーバーを動かしているので、ちょっとだけ工夫が必要です。

環境

  • 冒頭に書いた元記事および元元記事の手順でLaravel環境を構築済であること。
  • PHPStorm最新版を使って開発している方。(Windows版 / Mac版 両方で動作確認済。)
  • 開発環境や検証環境。(本番環境ではデバッグツールを入れる必要は無いので。)

方法

サーバー側作業

PHPサーバーに xdebug インストール&有効化する設定を追記する。

PHPサーバーは今回 Docker で構築されるようになっているので、その設定ファイルをいじります。
2行ほど追記します。

docker-laravel\infrastructure\docker\php\Dockerfile
・
・
・
RUN apt-get update && \
  apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  locale-gen en_US.UTF-8 && \
  localedef -f UTF-8 -i en_US en_US.UTF-8 && \
  mkdir /var/run/php-fpm && \
  docker-php-ext-install intl pdo_mysql mbstring zip bcmath && \
  composer config -g process-timeout 3600 && \
  composer config -g repos.packagist composer https://packagist.org && \
# ↓↓↓ 追記 ↓↓↓
  pecl install xdebug && \
  docker-php-ext-enable xdebug && \
# ↑↑↑ 追記 ↑↑↑
  composer global require hirak/prestissimo
・
・
・

PHPサーバーの php.ini に xdebug 設定を追記する。

php.ini には「host.docker.internalというマシンからのデバッグ通信要求を受け付けてね」という設定を追加します。

host.docker.internalって、そんなアドレスのマシン持ってないぞ…?」
と思うかもですが、ご安心ください。
最近の Docker Desktop をお使いであれば、自動でそういう設定をしてくれます。

これはDockerホスト、つまりお手元の Windows や Mac を指し示すようになっています。
(Dockerコンテナの中からlocalhostとやるとDockerコンテナ自身を指してしまいDockerホストを辿れないので、こういう機能を用意してくれています。)

docker-laravel\infrastructure\docker\php\php.ini



[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese

# ↓↓↓ 追記 ↓↓↓
[xdebug]
xdebug.idekey="PHPStorm"
xdebug.remote_host = "host.docker.internal"
xdebug.default_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 0
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_port = 9000
# ↑↑↑ 追記 ↑↑↑

Laravel環境を起動しておく。

これは元記事のまま、コマンド実行するだけです。

初めて実行する場合
cd docker-laravel/infrastructure
make create-project
すでにcreate-projectを実行したことがある場合
cd docker-laravel/infrastructure
make remake

コマンドが完了するまでお待ちください。
数分かかるかもです。

クライアント側作業(お手元のWindows/Mac)

PHPStormを起動する。

ここで初めて起動してください。
もしすでに起動してdocker-laravelプロジェクトを開いてしまっていたら、再起動してください。
(Dockerビルド工程でインポートされたPHPライブラリ群がインクルードされていない場合があるので。)

PHPStormで docker-laravel プロジェクトを開く。

image.png

メインメニューから設定画面を開く。

image.png

左メニューからLanguages & FrameworksPHPを開く。

image.png

画面右側の + を押す。

(ついでに、Include Path欄にPHPライブラリ群がずらーっとインクルードされているか念のため確認してください。)

image.png

docker-laravel を選択して OK を押す。

今回のプロジェクトのルートディレクトリを丸ごとパスに追加します。

image.png

左メニューからLanguages & FrameworksPHPDebugを開き、xdebugDebug port: 9000 にする。

最初から 9000 だったらそのままでOKです。
次へ進みましょう。

余談ですがなぜ 9000 かというと、今回PHPコードを処理するのはポート9000で待ち受けている php-fpm というソフトだからです。WEBアクセスそのものはポート80で待ち受けているWEBサーバーソフト nginx が処理しますが、PHP処理だけ php-fpm に投げる、という動きになります。
(ちょっと前のモダン構成だと、Apache というWEBサーバソフトがポート80で待ち受け、WEBもPHPも一括処理するというのが多かったです。)

image.png

左メニューからLanguages & FrameworksPHPServersを開き + を押す。

image.png

以下の設定をして、最後に Apply ボタンを押す。

設定項目
Name docker-laravel
Host localhost
Port 9000
Debugger Xdebug
User path mappings チェックON

image.png

終わったら閉じてOKです。

メインウィンドウ右上の Add Configuration... を押す。

image.png

左ツリー上部の + を押して PHP Remote Debug を選ぶ。

image.png

以下の設定をして、最後に Apply ボタンを押す。

設定項目
Name docker-laravel
Filter debug connection by IDE key チェックON
Server docker-laravel
IDE key PHPStorm

image.png

終わったら閉じてOKです。

メインウィンドウ右上の 緑色の昆虫 ボタンを押す。

image.png

そうすると、

  • 緑色の昆虫ボタンの右のほうに赤い■ボタンが点灯します。
  • メインウィンドウ下部にデバッグ情報小窓が展開されます。

image.png

これで、デバッグ中の状態になりました。
デバッグをやめるには赤い■ボタンを押せばOKです。

ブラウザでPHPサーバーにアクセスしてみる。

http://localhost/

image.png

普通なら Laravel のサンプルページが開くはずですが、ずっとアクセス中のように見えます。

実は、デバッガーが割り込んで処理を途中で止めているのです!

デバッグ情報小窓→Debuggerタブを開く。

お、デバッグ情報が来てますね!

ただ、何やらエラーが表示されています。
「サーバーコードと手元のソースファイルが関連付けられていないから追跡できないよ!」と怒られています。

なので、設定してあげましょう。
すぐ下の行に表示されている Click to set up path mappings を押して下さい。

image.png

以下の設定をして OK を押す。

  1. この画面、出現当初はすごくウィンドウが小さいので、広げてあげてください。
  2. Use path mappings にチェックを入れます。
  3. 下部にプロジェクトファイルリストが出てくるので、File path on server: に示されているコードに相当するソースファイルを指定してあげます。

image.png

再度PHPサーバーにアクセスしてみる。

http://localhost/

image.png

あれ、今度はすんなりWEBページが表示されて終わってしまいました。
でも大丈夫、正常です!

ソースコードの該当行にブレークポイントを仕掛けてみる。

このページのソースコードは index.php ですね。
では index.php を開いて、停止させてみたい行の冒頭をクリックしてみてください。
赤い●が点灯します。

image.png

再々度PHPサーバーにアクセスしてみる。

http://localhost/

image.png

来ました!
54行目で処理が一時停止され、その瞬間の変数などが丸見えです!

次のブレークポイントまで進めるなら
image.png

次の行、次の行、と一行ずつ進めていくなら
image.png

といったことも可能です。

それでは長くなってしまいましたが、今回はここまで。
お疲れ様でした:thumbsup:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel勉強 その1 EC2にnginxをインストール

目的

  • 勉強のため、Laravel 7.xの公式ドキュメントを読み解いていく。
  • 今回はそのための準備として、EC2上にnginxをインストールする。
  • ちなみに筆者はApacheの経験はあるものの、nginxについては素人。

参考

EC2(Amazon-Linux-2)にNginxを入れてブラウザで確認するまで2018冬 [画像で解説] Nginx編

EC2の構築~セットアップ

今回は勉強なので、AWSの無料枠を利用する。
インスタンスタイプはt2.micro、OSはAmazon Linux2で作成。

EC2を日本時間と日本語に対応させる

# sudo yum update -y
# sudo timedatectl set-timezone Asia/Tokyo
# sudo localectl set-locale LANG=ja_JP.UTF-8
# sudo localectl set-keymap jp106

パッケージを自動更新させる

yum-cronのインストール

# sudo yum install yum-cron -y

yum-cronとは?
 yum-cron パッケージは、アップデートを自動的に確認し、ダウンロードし、適用するための便利な方法を提供します。
 パッケージをインストールするとすぐに yum-cron パッケージの cron ジョブが有効になり、特別な設定は必要ありません。通常の日次 cron ジョブの実行時に、このジョブが実行します。

yum-cronを編集

# sudo vi /etc/yum/yum-cron.conf
/etc/yum/yum-cron.conf
apply_updates = yes

cronの自動起動をON

# systemctl status yum-cron
# sudo systemctl start yum-cron
# sudo systemctl enable yum-cron

rootでのPWログインをON

セキュリティ的には微妙なところもあるかもしれないが、いちいちsudo打たなければいけないのも面倒なので。。。

rootのPWを設定

# sudo su
# passwd

sshの設定ファイル変更

# vi /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes

sshd再起動

# systemctl restart sshd

ec2-userの無効化

セキュリティ的に消した方がいいよ、という記事を見つけた。確かに。

# userdel ec2-user

とりあえずセットアップはこんなところ。

Nginxのインストール

Amazon Linux2にはExtrasレポジトリというものがあるらしい。
yum installではなくこちらを使う。

提供されているトピック(ソフトウェア)の一覧取得

# amazon-linux-extras
NOTE: The livepatch extra is in public preview, not meant for production use

  0  ansible2                 available    [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  8  redis4.0                 available    [ =4.0.5  =4.0.10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0  =stable ]
 11  vim                      available    [ =8.0  =stable ]
 13  ruby2.4                  available    [ =2.4.2  =2.4.4  =2.4.7  =stable ]
 15  php7.2                   available    [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14  =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23  =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5  =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13  =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17  =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23  =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50  =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232  =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10  =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]

詳細を確認

# amazon-linux-extras info nginx1.12
NOTE: The livepatch extra is in public preview, not meant for production use

nginx1.12 has end-of-support date of 2019-09-20
nginx1.12 recommends nginx                      # yum install nginx

インストール

# amazon-linux-extras install nginx1.12
  4 *nginx1.12=latest         enabled      [ =1.12.2 ]

Nginxのバージョン・モジュールを確認

# nginx -v
nginx version: nginx/1.12.2

# nginx -V
nginx version: nginx/1.12.2
built by gcc 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'

Nginxの起動

Nginxプロセスの起動

# systemctl start nginx.service
# systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2020-05-21 17:18:15 JST; 18s ago
  Process: 23185 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 23181 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 23180 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 23188 (nginx)
   CGroup: /system.slice/nginx.service
           tq23188 nginx: master process /usr/sbin/nginx
           mq23190 nginx: worker process

 5月 21 17:18:15 ip-172-31-33-80.ap-northeast-1.compute.internal systemd[1]: Starting The nginx HTTP and reverse proxy server...
 5月 21 17:18:15 ip-172-31-33-80.ap-northeast-1.compute.internal nginx[23181]: nginx: the configuration file /etc/nginx/nginx.conf... ok
 5月 21 17:18:15 ip-172-31-33-80.ap-northeast-1.compute.internal nginx[23181]: nginx: configuration file /etc/nginx/nginx.conf tes...ful
 5月 21 17:18:15 ip-172-31-33-80.ap-northeast-1.compute.internal systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid ...ent
 5月 21 17:18:15 ip-172-31-33-80.ap-northeast-1.compute.internal systemd[1]: Started The nginx HTTP and reverse proxy server.
Hint: Some lines were ellipsized, use -l to show in full.

Nginxにアクセス

# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Thu, 21 May 2020 08:19:18 GMT
Content-Type: text/html
Content-Length: 3520
Last-Modified: Wed, 28 Aug 2019 19:52:13 GMT
Connection: keep-alive
ETag: "5d66db6d-dc0"
Accept-Ranges: bytes

Nginxの自動起動設定

現状の確認

どちらを使用してもOK
# systemctl is-enabled nginx.service
disabled
# systemctl list-unit-files --type=service | grep nginx
nginx.service                                 disabled

有効化、確認

# sudo systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
# systemctl is-enabled nginx.service
enabled

LaravelにあわせてNginxの設定とかもいじる必要がありそうだが、まだLaravelも入れていないので入れてから考えることにする。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TwitterAPIを使用したユーザー検索機能

1.TwitterAPIを使用したTwitterアカウントの検索機能をLaravelと Vue.jsで実装したい

開発中のプロダクトでTwitterアカウントの検索機能を実装する必要があったので、
その方法を備忘録的に残しておきます。
完成形はこんな感じで、キーワードを入力するとそれに紐づくTwitterアカウントが検索結果に表示されるというものです。
スクリーンショット 2020-05-21 13.29.34.png

2.TwitterAPI申請方法について

TwitterAPIを使用するには、TwitterDeveloperへの申請が必要です。
申請方法はこの辺りの記事を参考にすると良いと思います!
画像付きで詳しく説明してくれています。

2020年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説
Laravel5.7でTwitterOAuthを使ってタイムライン取得(申請から説明)

3.Laravelのプロジェクトの変更

TwitterDeveloperへの申請が完了し、API_KeyとTokenが取得できたら、
Laravelのプロジェクトに下記、変更を加えています。

Composerを使ってabraham/twitteroauthをインストール
.envファイルにAPI_KeyとTokenなどの情報をいれる
configディレクトリにファイルを作成し、.envファイルに書いた定数を呼び出す処理を記述

最低限ここまで設定をすれば、Controllerに諸々記述をすることで
TwitterAPIから情報を取得することができます。

Laravel5.7でTwitterOAuthを使ってタイムライン取得(申請から説明)
こちらの記事では①〜③の方法、さらにServiceProviderとFacadesを使ってControllerでの記述を簡単にする方法までを丁寧に説明してくれていますので、こちらの記事を参考にしてください!
(参考にさせていただきました!ありがとうございます^^)
何度もTwitterAPIから情報を取得する場合、設定しておくととても便利です。

今回は①〜③までの手順を書かせていただきます!

①Composerを使ってabraham/twitteroauthをインストール

ターミナルでLaravelプロジェクトがインストールされているディレクトリに移動します。
そこで下記コマンドを打ってください。

composer require abraham/twitteroauth

ターミナルに下記メッセージが表示されたら、成功です!

Package manifest generated successfully.

②.envファイルにAPI_KeyとTokenなどの情報をいれる

続いて、.envファイルに取得したAPI_KeyとTokenなどを追記します。

.env
TWITTER_CLIENT_ID = TwitterAPIkey
TWITTER_CLIENT_SECRET = TwitterAPI SecretKey
TWITTER_ACCESS_TOKEN = AccessToken
TWITTER_ACCESS_TOKEN_SECRET = AccessTokenSecret
TWITTER_CLIENT_CALLBACK = コールバックしたいURL 

③configディレクトリにファイルを作成し、.envファイルに書いた定数を呼び出す処理を記述

.envファイルに記述したAPI keyなどの情報をconfigファイルを介して呼びだすように設定します。
.envファイルに定義した変数をそのまま呼び出すのはダメみたいです。
その辺は【Laravel】環境変数の使い方の記事を参考に。

まず、configディレクトリにtwitter.phpというファイルを作成します。
そして、twitter.phpに下記のコードをコピペしてください。

config/twitter.php
<?php

return [
    'twitter-api' => env('TWITTER_CLIENT_ID',''),
    'twitter-api-secret' => env('TWITTER_CLIENT_SECRET',''),
    'twitter-token' => env('TWITTER_ACCESS_TOKEN',''),
    'twitter-token-secret' => env('TWITTER_ACCESS_TOKEN_SECRET',''),
    'call_back_url' => env('TWITTER_CLIENT_CALLBACK',''),
];

ここまでで、一旦①〜③の設定は完了です!
続いてTwitterAPIから情報を取得していきましょう。

4.アカウント情報を取得する

それでは、ControllerにTwitterAPIから情報を取得するための記述を記入していきます。
TwitterDeveloperのドキュメントを確認すると
アカウント検索の際にはGET users/searchを使用することがわかります。
情報を取得する際の必須パラメーターqに検索クエリを入れます。
その他のパラメータは下記通りです!

名前     必須    説明         
q   必須   検索キーワード  
page オプション 取得する結果のページを指定します。
count オプション ページごとに取得するユーザー結果の数。(最大値は20)
include_entities オプション entitiesの取得を省略

【①〜③のみを設定した場合】

TwitterController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Abraham\TwitterOAuth\TwitterOAuth;

class TwitterController extends Controller
{
    // Twitterのアカウント検索
    public function index(Request $request)
    {
        // Vueファイルで入力された検索されたキーワードの定義
        $q = $request->keyword;

        // API keyなどを定義
        $consumer_key = config('twitter.twitter-api'); 
        $consumer_secret = config('twitter.twitter-api-secret'); 
        $access_token = config('twitter.twitter-token'); 
        $access_token_secret = config('twitter.twitter-token-secret'); 

        $connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret); 
        $twitterRequest = $connection->get('users/search', array( "q" => $q, "count" => 20)); 

        return response()->json(['result'=>$twitterRequest], 200);
    }

※今回は、Vueファイルにデータを返すのでJSON形式で return response()->json(['result'=>$twitterRequest], 200);という記述になってます。

【ServiceProviderとFacadesまで設定した場合】

TwitterController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Abraham\TwitterOAuth\TwitterOAuth;

class TwitterController extends Controller
{
    // Twitterのアカウント検索
    public function index(Request $request)
    {
        // 検索されたキーワードの定義
        $q = $request->keyword;

        // TwitterAPIからユーザー情報を取得
        $twitterRequest = \Twitter::get('users/search', array("q" => $q, "count" => 20));
        return response()->json(['result'=>$twitterRequest], 200);
    }

サービスプロバイダとファサードまで設定しておくと、リクエストを投げるときに簡潔に書くことができます!
Laravel5.7でTwitterOAuthを使ってタイムライン取得(申請から説明)
是非こちらの記事を参考に設定してみてください^^

5.TwitterAPIから取得した情報について

ここまででデータを取得できたのですが、少し問題があります。
GET users/searchは、アカウント名やアカウント画像、認証アカウントなのか・・・
など様々な情報を取得できます。
ただ、アカウント画像に関してはデフォルトでは48x48ピクセルのものになります。
少し小さめですね・・・

オリジナルサイズの画像を取得したい場合、画像のURLを変更することでそれが可能になります〜
TwitterAPIドキュメントにも記載がありますが、画像のURLから_normalを除いてあげればオッケーです。
では、Controllerの記述に追記していましょう〜

TwitterController.php
// 一部省略してます〜 (TwitterAPIからユーザー情報を取得の記述から〜)
        // TwitterAPIからユーザー情報を取得
        $twitterRequest = \Twitter::get('users/search', array("q" => $q, "count" => 20)
        // TwitterAPIからのレスポンス プロフィール画像のURLから _normalの文字列を省く)
        foreach($twitterRequest as $res){
            $image = $res->profile_image_url_https;
            $fullImg = str_replace('_normal', '', $image);
            $res->full_img = $fullImg;
            $twitterRes[] = $res;
        }

その他レスポンスボディについては下記記事が参考になります〜
Tweet objects
Twitter 開発者 ドキュメント日本語訳

これで表示に必要な情報は取得できたかと思います〜!
長くなったので、Vue.jsを使用したインクリメントリサーチの方法などはまた改めて書こうと思います。
読んでくれた方ありがとうございました^^

開発環境

PHP 7.2
Laravel 6.0
Vue 2.5.17

参考リンク

Laravel5.7でTwitterOAuthを使ってタイムライン取得(申請から説明)
2020年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説
【Laravel】環境変数の使い方
Tweet objects
Twitter 開発者 ドキュメント日本語訳
TwitterDeveloperのドキュメント
TwitterAPIドキュメント

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでEloquentやQueryBuilderをきちんと書いているのにDBにデータが挿入されていない問題について

ご挨拶

皆さんこんにちは。tyamahoriです。普段はWEB制作会社でサーバーサイドエンジニアをしています。

俺の屍を越えてゆけ

というわけで、本日(記事執筆日は2020.5.21)の午前中に発覚したしょうもないミスをここに書き残します。みなさんのお役に立つために恥ずかしい部分を晒していきます。

LaravelのTransaction処理でDB::commit()は忘れるな。絶対にだ。

何を当たり前なことを言っている僕でしょうか。。はいそうです。僕です。この処理が漏れていてDBに入るべきデータが入っていないというだめな状況になってしまいました。原因を探るのに2時間位時間を消費してしまったため、猛反省しております。。

気をつけるところ。

例えばTransaction処理を使うところにおいて、以下のような処理があったとします。

misstake.php
        DB::beginTransaction();

        try {

            return $this->sampleRepository
                ->persistSomeData($param1, $param2)
                ->getOrm()
                ->toArray();
        } ...

これではだめですね。。レスポンスは期待したもので正しくても、DB::commitがないためDBにデータが挿入されません。

collect.php
        DB::beginTransaction();

        try {
            $arrayResponse = $this->sampleRepository
                ->persistSomeData($param1, $param2)
                ->getOrm()
                ->toArray();

            DB::commit();

            return $arrayResponse;
        } ...

こういうふうにちゃんとしなくちゃだめですね。。トホホ。。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 7 ビューファイルで指定したアドレスにメールを送信する

目的

  • ビューファイルからのトリガーでメールを送信する処理を追加する際、非常に詰まったため実施方法をまとめる

実施環境

  • ハードウェア環境(下記の二つの環境で確認)
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提情報

  • ローカル開発環境を用いたメール送信処理の追加方法をまとめる。
  • メール送信サーバはGmailを使用する。
  • 下記の方法を実施して当該アプリからテストメールを送信できる状態にしていること。

概要

  1. 入力フォームの作成
    1. ルーティングファイルの編集
    2. コントローラファイルの作成と編集
    3. ビューフィアルの作成と編集
  2. メール送信の準備
    1. クラス作成
    2. 送信内容の作成
  3. 確認

詳細

  1. 入力フォームの作成

    1. ルーティングファイルの編集

      1. Laravelアプリ名ディレクトリで下記コマンドを実行してルーティングファイルを作成する。

        $ vi routes/web.php
        
      2. 開いたルーティングファイルを下記のルーティング情報を追記する。

        アプリ名ディレクトリ/routes/web.php
        Route::get('/input', 'TestMailController@input');
        Route::post('/send', 'TestMailController@send');
        
      3. 保存して閉じる。

    2. コントローラファイルの作成と編集

      1. アプリ名ディレクトリで下記コマンドを実行してメール送信用のコントローラを作成する。

        $ php artisan make:controller TestMailController
        
      2. アプリ名ディレクトリで下記コマンドを実行して先に作成したコントローラファイルを開く。

        $ vi app/Http/Controllers/TestMailController.php
        
      3. 開いたコントローラファイルを下記の様に修正する。

        アプリ名ディレクトリ/app/Http/Controllers/TestMailController.php
        <?php
        
        namespace App\Http\Controllers;
        
        use Illuminate\Http\Request;
        //下記を追記する
        use Illuminate\Support\Facades\Mail;
        use App\Mail\TestSendMail;
        //上記までを追記する
        
        class TestMailController extends Controller
        {
            //下記を追記する
            public function input()
            {
                return view('test_mails.input');
            }
        
            public function send(Request $request)
            {
                $contact = $request->all();
                Mail::to($contact['email'])->send(new TestSnedMail());
                return redirect('/input');
            }
            //上記までを追記する
        }
        
      4. 保存して閉じる

    3. ビューフィアルの作成と編集

      1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

        $ mkdir resources/views/test_mails
        
      2. アプリ名ディレクトリで下記コマンドを実行してビューファイルを開く。

        $ vi resources/views/test_mails/input.blade.php
        
      3. 開いたビューファイルを下記の様に修正する。

        アプリ名ディレクトリ/resources/views/test_mails/input.blade.php
        <form action="/send" method="POST">
            @csrf
            <input type="text" name="email">
            <input type="submit">
        </form>
        
    4. 確認

      1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

        $ php artisan serve
        
      2. 下記にアクセスする。

      3. 下記の様に入力欄と送信ボタンが表示されている事を確認する。

        スクリーンショット 2020-05-18 23.22.36.png

  2. メール送信の準備

    1. アプリ名ディレクトリで下記コマンドを実行してメール送信専用のクラスが記載されたファイルを作成する。

      $ php artisan make:mail TestSendMail
      
    2. アプリ名ディレクトリで下記コマンドを実行して先に作成したメール送信専用のクラスファイルを開く

      $ vi app/Mail/TestSendMail.php
      
    3. 開いたクラスファイルを下記の様に修正する。

      アプリ名ディレクトリ/app/Mail/TestSendMail.php
      <?php
      
      namespace App\Mail;
      
      use Illuminate\Bus\Queueable;
      use Illuminate\Contracts\Queue\ShouldQueue;
      use Illuminate\Mail\Mailable;
      use Illuminate\Queue\SerializesModels;
      
      class TestSendMail extends Mailable
      {
          use Queueable, SerializesModels;
      
          /**
           * Create a new message instance.
           *
           * @return void
           */
          public function __construct()
          {
          }
      
          /**
           * Build the message.
           *
           * @return $this
           */
          public function build()
          {
              //下記を追記
              return $this
                  //メールの件名
                  ->subject('Test Mail')
                  //メールとして表示したいビューファイル
                  ->view('mails.test');
          }
      }
      
    4. アプリ名ディレクトリで下記コマンドを実行してメールとして表示したいビューファイルを格納するディレクトリを作成する。

      $ mkdir resources/views/mails
      
    5. アプリ名で下記コマンドを実行してメールとして表示したいビューファイル作成する。

      $ vi resources/views/mails/test.blade.php
      
    6. 開いたメールとして表示したいビューファイルを下記の様に編集する。

      アプリ名ディレクトリ/resources/views/mails/test.blade.php
      これはテストメールです
      
  3. 確認

    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    2. 下記にアクセスする。

    3. 入力欄にテストメールを送信したいアドレスを入力する(正常に実装できているとメールが送信されるので注意!!!)

    4. 入力したアドレスのメール受信ボックスを確認する。

    5. 下記の様にメールが受信できていれば実装完了である。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel7をGCP Google App EngineへデプロイしてDBマイグレーションしてプロモートする

やりたいこと

  • デプロイとDBマイグレーションとプロモート(サイト公開)をコマンドで実行したい

ソース

composer.json

  • composer gcloud-deploy コマンドを登録する
  • chmod 744 gcloud-deploy.bash で実行権限を付与しておく
    "scripts": {
        "gcloud-deploy": [
            "./gcloud-deploy.bash"
        ],

gcloud-deploy.bash

  • jsonのパースにjqを使うのでインストールしておくこと
#!/bin/bash
#set -eu

# proxy実行しているかチェックする
proxyCommand="cloud_sql_proxy -instances=foo-bar-apps:asia-northeast1:foo-bar-mysql=tcp:3306"
ps auxww|grep "$proxyCommand"|grep -v grep
if [ "$?" = "1" ];then
    echo "You must run proxy to do db migrate."
    echo ""
    echo $proxyCommand
    echo ""
    exit 1
fi

npm run prod

# DBマイグレーションはlocalで実行しproxy経由でproductionに接続されるので
# 設定ファイルを.env.productionからコピーする
# 現在使用中の.envはバックアップしておく
rand=$RANDOM && cp .env .env.backup.$rand && cp .env.production .env
message=`php artisan migrate --pretend`
cp .env.backup.$rand .env

# DBマイグレーションが必要かチェックする
if [ "$message" = "Nothing to migrate." ]; then
    # DBマイグレーションが不要なら通常のデプロイ
    echo "Youd don't need to do db migrate."
    echo "Laravel artisan said: $message"
    gcloud app deploy --quiet --project=foo-bar --verbosity=info
else
    # DBマイグレーションが必要ならデプロイオプションで--no-promote(公開しない)
    echo "Youd need to do db migrate."
    echo "Laravel artisan said: $message"
    gcloud app deploy --quiet --project=foo-bar --verbosity=info --no-promote --format=json | tee gcloud-version.json

    # DBマイグレーションする
    rand=$RANDOM && cp .env .env.backup.$rand && cp .env.production .env
    php artisan migrate --force
    cp .env.backup.$rand .env

    # --promote(公開する)
    appVersion=`jq -r '.versions[0].id' gcloud-version.json`
    gcloud app deploy --promote --quiet --version=$appVersion
fi

.gcloudignore

gcloud-version.json
.env.backup.*

ほか

  • コマンドひとつで実行できるようにはなったが課題はある
    • .env.production.env.localの管理したくない
    • というか、現在使用中の.envを上書きされたくない...
  • マイグレーションの必要がないなら通常のgcloud app deployを実行したい
    • migrate --pretendを判定して分岐してみた
  • デバッグ用にdeploy.logとか出力するとsha mismatchエラーでbuildがコケた
    • .gcloudignoreに追加すると解決したような気がする
Step #0 - "fetcher": Failed to fetch gs://staging.foo-bar-hoge.appspot.com/xxxx, will no longer retry: fetching "gs://staging.foo-bar-hoge.appspot.com/xxxx" with timeout 1h0m0s to temp file "/workspace/.download/xxxx": deploy.log SHA mismatch, got "xxxx", want "xxxx"

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む