- 投稿日:2020-05-21T20:51:06+09:00
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 # passwdsshの設定ファイル変更
# vi /etc/ssh/sshd_configPermitRootLogin yes PasswordAuthentication yessshd再起動
# systemctl restart sshdec2-userの無効化
セキュリティ的に消した方がいいよ、という記事を見つけた。確かに。
# userdel ec2-userEC2を日本時間と日本語に対応させる
# 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 -yyum-cronとは?
yum-cron パッケージは、アップデートを自動的に確認し、ダウンロードし、適用するための便利な方法を提供します。
パッケージをインストールするとすぐに yum-cron パッケージの cron ジョブが有効になり、特別な設定は必要ありません。通常の日次 cron ジョブの実行時に、このジョブが実行します。yum-cronを編集
# vi /etc/yum/yum-cron.conf/etc/yum/yum-cron.confapply_updates = yescronの自動起動をON
# systemctl status yum-cron # systemctl start yum-cron # systemctl enable yum-cronLaravel開発環境構築
参考
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 infoDocker 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.ymlversion: '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:3306Dockerfile作成
phpコンテナの構築時に、以下のDockerfileを使用する。
DockerfileFROM 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.confserver { 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=utf8mb4Laravelプロジェクト作成
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。
- 投稿日:2020-05-21T19:51:27+09:00
Dockerで構築したLaravel環境に、PHPStormでステップ実行デバッグを仕掛ける
元記事 Windows10 に PHP7+Laravel環境をDockerで構築
← 元元記事 最強のLaravel開発環境をDockerを使って構築する【新編集版】目的
Dockerで構築したLaravel環境で実行されているPHPコードに対して、
JetBrains社の「PHPStorm」からステップ実行デバッグができるようにしたい。ステップ実行デバッグとは
- コードの好きな行で実行を停止させて、その瞬間の変数リストや変数の中身を覗き見する。
- 1行ずつ実行させて、どこでエラー落ちするか追跡する。
といったことができる、例のアレ↓です。
概要
今回、PHP定番デバッグツール xdebug を使用して実現していきます。
(Laravel最新版には他にもイケてるデバッグツールがあると思いますが、諸事情で古いバージョンのLaravelを使用しなければならなかったので)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 プロジェクトを開く。
メインメニューから設定画面を開く。
左メニューから
Languages & Frameworks
→PHP
を開く。画面右側の
+
を押す。(ついでに、
Include Path
欄にPHPライブラリ群がずらーっとインクルードされているか念のため確認してください。)docker-laravel を選択して
OK
を押す。今回のプロジェクトのルートディレクトリを丸ごとパスに追加します。
左メニューから
Languages & Frameworks
→PHP
→Debug
を開き、xdebug
→Debug port:
9000 にする。最初から 9000 だったらそのままでOKです。
次へ進みましょう。余談ですがなぜ 9000 かというと、今回PHPコードを処理するのはポート9000で待ち受けている php-fpm というソフトだからです。WEBアクセスそのものはポート80で待ち受けているWEBサーバーソフト nginx が処理しますが、PHP処理だけ php-fpm に投げる、という動きになります。
(ちょっと前のモダン構成だと、Apache というWEBサーバソフトがポート80で待ち受け、WEBもPHPも一括処理するというのが多かったです。)左メニューから
Languages & Frameworks
→PHP
→Servers
を開き+
を押す。以下の設定をして、最後に
Apply
ボタンを押す。
設定項目 値 Name docker-laravel Host localhost Port 9000 Debugger Xdebug User path mappings チェックON 終わったら閉じてOKです。
メインウィンドウ右上の
Add Configuration...
を押す。左ツリー上部の
+
を押してPHP Remote Debug
を選ぶ。以下の設定をして、最後に
Apply
ボタンを押す。
設定項目 値 Name docker-laravel Filter debug connection by IDE key チェックON Server docker-laravel IDE key PHPStorm 終わったら閉じてOKです。
メインウィンドウ右上の
緑色の昆虫
ボタンを押す。そうすると、
緑色の昆虫
ボタンの右のほうに赤い■
ボタンが点灯します。- メインウィンドウ下部にデバッグ情報小窓が展開されます。
これで、デバッグ中の状態になりました。
デバッグをやめるには赤い■
ボタンを押せばOKです。ブラウザでPHPサーバーにアクセスしてみる。
普通なら Laravel のサンプルページが開くはずですが、ずっとアクセス中のように見えます。
実は、デバッガーが割り込んで処理を途中で止めているのです!
デバッグ情報小窓→
Debugger
タブを開く。お、デバッグ情報が来てますね!
ただ、何やらエラーが表示されています。
「サーバーコードと手元のソースファイルが関連付けられていないから追跡できないよ!」と怒られています。なので、設定してあげましょう。
すぐ下の行に表示されているClick to set up path mappings
を押して下さい。以下の設定をして
OK
を押す。
- この画面、出現当初はすごくウィンドウが小さいので、広げてあげてください。
Use path mappings
にチェックを入れます。- 下部にプロジェクトファイルリストが出てくるので、
File path on server:
に示されているコードに相当するソースファイルを指定してあげます。再度PHPサーバーにアクセスしてみる。
あれ、今度はすんなりWEBページが表示されて終わってしまいました。
でも大丈夫、正常です!ソースコードの該当行にブレークポイントを仕掛けてみる。
このページのソースコードは
index.php
ですね。
ではindex.php
を開いて、停止させてみたい行の冒頭をクリックしてみてください。
赤い●
が点灯します。再々度PHPサーバーにアクセスしてみる。
来ました!
54行目で処理が一時停止され、その瞬間の変数などが丸見えです!といったことも可能です。
それでは長くなってしまいましたが、今回はここまで。
お疲れ様でした
- 投稿日:2020-05-21T17:30:48+09:00
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 -yyum-cronとは?
yum-cron パッケージは、アップデートを自動的に確認し、ダウンロードし、適用するための便利な方法を提供します。
パッケージをインストールするとすぐに yum-cron パッケージの cron ジョブが有効になり、特別な設定は必要ありません。通常の日次 cron ジョブの実行時に、このジョブが実行します。yum-cronを編集
# sudo vi /etc/yum/yum-cron.conf/etc/yum/yum-cron.confapply_updates = yescronの自動起動をON
# systemctl status yum-cron # sudo systemctl start yum-cron # sudo systemctl enable yum-cronrootでのPWログインをON
セキュリティ的には微妙なところもあるかもしれないが、いちいちsudo打たなければいけないのも面倒なので。。。
rootのPWを設定
# sudo su # passwdsshの設定ファイル変更
# vi /etc/ssh/sshd_configPermitRootLogin yes PasswordAuthentication yessshd再起動
# systemctl restart sshdec2-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: bytesNginxの自動起動設定
現状の確認
どちらを使用しても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 enabledLaravelにあわせてNginxの設定とかもいじる必要がありそうだが、まだLaravelも入れていないので入れてから考えることにする。
- 投稿日:2020-05-21T15:52:46+09:00
TwitterAPIを使用したユーザー検索機能
1.TwitterAPIを使用したTwitterアカウントの検索機能をLaravelと Vue.jsで実装したい
開発中のプロダクトでTwitterアカウントの検索機能を実装する必要があったので、
その方法を備忘録的に残しておきます。
完成形はこんな感じで、キーワードを入力するとそれに紐づくTwitterアカウントが検索結果に表示されるというものです。
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などを追記します。
.envTWITTER_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ドキュメント
- 投稿日:2020-05-21T11:50:09+09:00
LaravelでEloquentやQueryBuilderをきちんと書いているのにDBにデータが挿入されていない問題について
ご挨拶
皆さんこんにちは。tyamahoriです。普段はWEB制作会社でサーバーサイドエンジニアをしています。
俺の屍を越えてゆけ
というわけで、本日(記事執筆日は2020.5.21)の午前中に発覚したしょうもないミスをここに書き残します。みなさんのお役に立つために恥ずかしい部分を晒していきます。
LaravelのTransaction処理でDB::commit()は忘れるな。絶対にだ。
何を当たり前なことを言っている僕でしょうか。。はいそうです。僕です。この処理が漏れていてDBに入るべきデータが入っていないというだめな状況になってしまいました。原因を探るのに2時間位時間を消費してしまったため、猛反省しております。。
気をつけるところ。
例えばTransaction処理を使うところにおいて、以下のような処理があったとします。
misstake.phpDB::beginTransaction(); try { return $this->sampleRepository ->persistSomeData($param1, $param2) ->getOrm() ->toArray(); } ...これではだめですね。。レスポンスは期待したもので正しくても、DB::commitがないためDBにデータが挿入されません。
collect.phpDB::beginTransaction(); try { $arrayResponse = $this->sampleRepository ->persistSomeData($param1, $param2) ->getOrm() ->toArray(); DB::commit(); return $arrayResponse; } ...こういうふうにちゃんとしなくちゃだめですね。。トホホ。。。。
- 投稿日:2020-05-21T11:27:09+09:00
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を使用する。
- 下記の方法を実施して当該アプリからテストメールを送信できる状態にしていること。
概要
- 入力フォームの作成
- ルーティングファイルの編集
- コントローラファイルの作成と編集
- ビューフィアルの作成と編集
- メール送信の準備
- クラス作成
- 送信内容の作成
- 確認
詳細
入力フォームの作成
ルーティングファイルの編集
Laravelアプリ名ディレクトリで下記コマンドを実行してルーティングファイルを作成する。
$ vi routes/web.php開いたルーティングファイルを下記のルーティング情報を追記する。
アプリ名ディレクトリ/routes/web.phpRoute::get('/input', 'TestMailController@input'); Route::post('/send', 'TestMailController@send');保存して閉じる。
コントローラファイルの作成と編集
アプリ名ディレクトリで下記コマンドを実行してメール送信用のコントローラを作成する。
$ php artisan make:controller TestMailControllerアプリ名ディレクトリで下記コマンドを実行して先に作成したコントローラファイルを開く。
$ vi app/Http/Controllers/TestMailController.php開いたコントローラファイルを下記の様に修正する。
アプリ名ディレクトリ/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'); } //上記までを追記する }保存して閉じる
ビューフィアルの作成と編集
アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。
$ mkdir resources/views/test_mailsアプリ名ディレクトリで下記コマンドを実行してビューファイルを開く。
$ vi resources/views/test_mails/input.blade.php開いたビューファイルを下記の様に修正する。
アプリ名ディレクトリ/resources/views/test_mails/input.blade.php<form action="/send" method="POST"> @csrf <input type="text" name="email"> <input type="submit"> </form>確認
アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve下記にアクセスする。
下記の様に入力欄と送信ボタンが表示されている事を確認する。
メール送信の準備
アプリ名ディレクトリで下記コマンドを実行してメール送信専用のクラスが記載されたファイルを作成する。
$ php artisan make:mail TestSendMailアプリ名ディレクトリで下記コマンドを実行して先に作成したメール送信専用のクラスファイルを開く
$ vi app/Mail/TestSendMail.php開いたクラスファイルを下記の様に修正する。
アプリ名ディレクトリ/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'); } }アプリ名ディレクトリで下記コマンドを実行してメールとして表示したいビューファイルを格納するディレクトリを作成する。
$ mkdir resources/views/mailsアプリ名で下記コマンドを実行してメールとして表示したいビューファイル作成する。
$ vi resources/views/mails/test.blade.php開いたメールとして表示したいビューファイルを下記の様に編集する。
アプリ名ディレクトリ/resources/views/mails/test.blade.phpこれはテストメールです確認
アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve下記にアクセスする。
入力欄にテストメールを送信したいアドレスを入力する(正常に実装できているとメールが送信されるので注意!!!)
入力したアドレスのメール受信ボックスを確認する。
下記の様にメールが受信できていれば実装完了である。
Laravel 7 アプリからメールを送信するも含めて正常に実装できていれば下記の様なメールが送信されるはずである。
- 投稿日:2020-05-21T06:29:43+09:00
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"参考