【ふくだ学習録】アプリ制作part12【39日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### laravel環境構築
MySQLの構築は終わったので、次はLaravelの環境構築をしていく。

そもそもLaravelを作成するのは下記の流れでスクレイピングを行なっていきたいから。
①LaravelでどういったサイトをスクレイピングしていくのかをMySQLへ登録
②（バッチ処理で）ScrapyからMySQLへ通信し、MySQL上のデータを参考にスクレイピング用ファイルを作成し実行
③Scrapyで取得した情報をMySQL上へ保存
といった流れにするため。

参考にした記事は下記。

[Dockerを使ってLaravel開発環境構築](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)
[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)

### nginx記述変更
今回nginxを経由するアクセスは２つ。
①一般ユーザーからのnodeへのアクセス。（Next.jsで作るフロント部分）
②アドミンユーザーからのLaravelへのアクセス（Laravelで作る、管理用画面）
なので、nginx側でプロキシを複数作成しておく。


```conf
# node(一般ユーザーアクセス)
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://express:3000/;
    }
}

# Laravel(adminユーザーアクセス)
server {
    listen 9000;
        index index.php index.html;
        root /var/www/public;

    server_name localhost;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        }

    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;
    }
}
```

80番をnode, 9000番をphpにしている。
（現在はまだローカル環境のみでの開発なので、ポート番号のみでの出し分けにしている。）


### laravelインストール
laravelのインストールまでを行なっていく。
記載したdockerfileはこんな感じ。

```dockerfile
FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

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

#①
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
      && php -r "if (hash_file('SHA384', 'composer-setup.php') === trim(file_get_contents('https://composer.github.io/installer.sig'))) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
      && php composer-setup.php\
      && php -r "unlink('composer-setup.php');" \
      && mv composer.phar /usr/sbin/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"
```

①composerは常に最新版をインストールするように設定。
（[composerのバージョンが変わっても対応可能なDockerfileの書き方](https://qiita.com/hanakok/items/97a6ff1dff611d2bb793)を参考にした。）

②composerインストール時に、質問が出ても処理が停止しないようにするために設定。
（Y/nなどを入力しなくてもいいように）(Dockerfileで、質問を受けずにrootで`composer install`する)[https://qiita.com/nju33/items/fc85dc8071c99015bc92]


### laravelアプリ作成
ここまで記載できたら、docker execして、Laravel用のコンテナに入って、`laravel new`するだけ。
`localhost`ではnode（Next）、`localhost:9000`ではLaravelに接続されるようになった。
（結構時間かかった。。）

# 今日の一言
開発環境構築は、できひん時めちゃめちゃイライラするし進まんけど、一回理解したら世界変わるぐらいその後楽になるから好き。