Azure WebAppsにLaravel9のアプリをデプロイする

# 概要  
Azure WebAppsにLaravel９系アプリをデプロイする。
自分用のメモ書きなので責任はとれません。

## 前提　
Azure WebAppsの発行モデルはコード。  
php8.1系
webサーバはnginx
デプロイフォルダは`/home/site/wwwroot/webapp/`とする。

# アプリ側で対応すること  
## nginxの設定ファイルを更新  
デフォルトではドキュメントルートが以下

```
/home/site/wwwroot/
```

Laravelで設定すべきドキュメントルートは以下であり、デフォルト設定では動作しない。

```
<project-root>/public
```

WebAppsはコンテナで動作しているため、CloudShellで設定ファイルを変更しても永続化されない。
そのため、スタートアップスクリプトであらかじめ編集しておいた設定ファイルを置き換える。

```
cp /home/site/wwwroot/webapp/server_resource/nginx/default /etc/nginx/site-available/default
```

設定ファイル内容は以下とし、`<project-root>/server_resource/nginx`配下に保存しておく。
内容は、WebAppsのコンテナ起動時のnginxの設定ファイルとLaravelのドキュメントの設定ファイルを参考にした。
[参考：Laravel 9.x デプロイ - サーバ設定](https://readouble.com/laravel/9.x/ja/deployment.html#server-configuration)

```
server {
    #proxy_cache cache;
	#proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot/webapp/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index  index.php index.html index.htm;
    server_name  example.com www.example.com;
    port_in_redirect off;

    index index.php;
    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    # Disable .git directory
    location ~ /\.git {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

        # Add locations of phpmyadmin here.
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
            fastcgi_pass 127.0.0.1:9000;
            include fastcgi_params;
            fastcgi_param HTTP_PROXY "";
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_intercept_errors on;
            fastcgi_connect_timeout         300;
            fastcgi_send_timeout           3600;
            fastcgi_read_timeout           3600;
            fastcgi_buffer_size 128k;
            fastcgi_buffers 4 256k;
            fastcgi_busy_buffers_size 256k;
            fastcgi_temp_file_write_size 256k;
        }
}

```

## コンテナ起動時用のスクリプトを作成する  

先述のnginx設定ファイルの置き換えの他、実行すべきコマンドがあるのでスクリプトにする  
今回は、`<project-root>/server_resource/startup.sh`とする。  
```
#!/bin/bash

# デプロイフォルダに移動
cd /home/site/wwwroot/webapp
# オートロード再実行
php composer.phar dump-autoload
# nginx設定ファイルを置き換え
cp /home/site/wwwroot/webapp/server_resource/nginx/default /etc/nginx/sites-available/default
# nginxの設定ファイル再読み込み
service nginx reload
```

## AppServiceProvider.phpに追記  
★要検証
初期設定だとpublic配下のリソースがhttpでリクエストされエラーとなる。  
AppServiceProvider.phpのboot()に以下追記する。  

```
        if (App::environment(['production'])) {
            URL::forceScheme('https');
        }
```

# WebApps側で設定すること
## ftpsの接続情報を取得
デプロイセンター→FTPSの資格情報 で取得可能。  
アプリケーションスコープとユーザスコープの差異は理解していない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494085/eb1a4ea8-91ec-57c0-9e5d-a57b42fd97a9.png)


## スタートアップコマンド設定  
以下を設定する
```
/home/site/wwwroot/server_resource/startup.sh
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494085/7e65d3e0-8df3-5122-84d8-9e366bf4bf1f.png)

# デプロイ  

WinsSCPやIDEの機能でFTPSを利用してアプリをデプロイする。    
npmやcomposerのパッケージはすべて導入しておく。  
アセットのビルドもしておく。
TODO: storage配下の扱い  

## ftpsで接続が切断される  
大量のデータを送信したからなのか、切断されるのでazure cliを利用する  

```
# 認証
az login
# デプロイ
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <zip-package-path>
```

# あとがき  
残
Application Insightでログを収集できるようにアプリの改修。