ChocolatyでちょこっとLaravelの実行環境を作成する

## 今北産業

Laravelで作成したプロジェクトを、Windows Server 2012R2にChocolatyを使用してデプロイした。
構成は Nginx, PHP, MySQL, プロセス管理はNSSMで、キューの使用もあるのでお楽しみに。
ちょこっと参考にしても構わないけど、間違ってても責任は取らないよ❤

## 作業内容

### Chocolateyのインストール

管理者モードのPowerShellを使用したのでコマンドはこちら。
これ以降の各手順は、powershellは常に管理者モードの想定で。

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

* 最新のインストールコマンドは、[Chocolateyの公式サイト](https://chocolatey.org/install)を参照のこと。古いインストールコマンドに注意。

一旦コンソールを閉じると、PATHが適用される。

### 各種パッケージをインストール

１つずつやるのは面倒なので、一括でバージョン指定できるxmlを使用。
しかしインストールできるバージョンが限られていたため、バージョン指定はMySQLだけにしておいた。
現在どのバージョンがインストールされるかは、公式サイトのリポジトリで確認すると良い。

MySQLに必要なvisual studio runtime 2013が無くてエラーになるので、vcredist2013を手動で指定する必要がある模様。

```xml:package.config
<?xml version="1.0" encoding="utf-8"?>
<packages>
        <package id="vcredist2013" />
        <package id="php" />
        <package id="php-service" />
        <package id="nodejs-lts" />
        <package id="composer" />
        <package id="nginx-service" />
        <package id="git" />
        <package id="mysql" version="5.7.18" />
</packages>
```

上記を適当なフォルダに保存し、そのフォルダへ移動。

```powershell
choco install package.config -y
```

利便性を高めるため、あとからこれも入れた。

```powershell
cinst nano # コンソールからテキスト編集したいので
cinst conemu # コンソールが使いづらいので
cinst sakuraeditor # テキストファイルの編集に
cinst googlechrome # モダンブラウザが必要だった
```

### 設定ファイルの編集

#### php.ini

今回のファイルの場所は、
"C:\tools\php73\php.ini"
になった。

extension= で検索し、下記のようにした。mbstringとopensslはデフォルトでONになっているので、ここでオンにしたらWARNINGが出たので消した。

```ini:php.ini
extension=bz2
extension=curl
extension=fileinfo
extension=gd2
extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=interbase
;extension=ldap
;extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
;extension=shmop
```

CURLを使用できるように、[cacert.pemを入手](https://curl.haxx.se/docs/caextract.html)し、下記のようにする。

```ini:php.ini
[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo ="C:\tools\cacert.pem"

[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
openssl.cafile="C:\tools\cacert.pem"
```

#### Nginxの設定ファイル

デフォルトで `"C:\tools\nginx\conf.d\server.default.conf"` にある。

root指定のパスの区切り文字に注意

```conf:server.default.conf
server {
	listen       80;
	server_name  example.com;

	root C:/YOUR/PROJECT/ROOT/public;

	charset utf-8;

	index  index.php;

	#access_log  logs/host.access.log  main;

	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;

	#error_page  404              /404.html;

	# proxy the PHP scripts to Apache listening on 127.0.0.1:80
	#
	location ~ \.php$ {
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
		include fastcgi_params;
	}


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

```

#### サービス再起動

phpとnginxのサービスを再起動する。

### MySQLの準備

コンソールでログインする

```powershell
mysql -u root
```

```sql
/* DBを作成 */
CREATE DATABASE your_db DEFAULT CHARACTER SET utf8;
CREATE USER 'your_user'@'%' IDENTIFIED BY 'your_password';
/* 権限を付与 */
GRANT ALL PRIVILEGES ON your_db.* TO 'your_user'@'%' IDENTIFIED BY 'your_password';

```

### プロジェクトの設定

#### 基本設定

GitのSSHまたはHTTPSの認証設定をしたら、適当なフォルダにプロジェクトを落としてくる。

.env.exampleをコピーして.env にし、修正する。
修正内容はプロジェクトによって適宜。

```powershell
cd /your/project/root
cp .env.example .env
nano .env
```

終わったら、そのままプロジェクトルートで色々実行

```powershell
# javascriptのコンパイル
npm i
npm run prod
# phpライブラリのインストール
composer install --optimize-autoloader --no-dev
# キーの作成
php artisan key:generate
# マイグレーションの実行
php artisan migrate --seed
# 設定のキャッシュ
php artisan config:cache
```

#### キューワーカーの設定

今回のプロジェクトにはキューの使用がある。。
nginx-service や php-service は nssm で管理されているようなので、
nssm でやっちゃうことにする。

(laravel-echo-serverも似たような要領でできるはず)

```powershell
nssm install laravel-worker
# 名称は何でもいい。↑がサービス名になる。
```

アクセスが拒否された場合は、管理者モードで実行しているか確認。
対話式の画面が立ち上がるので、以下のようにする。
* H/Cは編集モードで立ち上げているのでボタン名称は異なる。
* Argumentの所、 起動オプションに、 --tries=5 等を付けないと、何度でも再試行するので注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235255/7ec65400-56f9-37af-6624-d25ab213208a.png)

I/Oタブも編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235255/0fc30381-d719-1506-efbc-f6e8e5e89605.png)


Installを押すとサービスが登録される。次回以降は自動起動する構成だが、最初の起動は手動の模様。

### 確認

ブラウザでアクセスし、表示されれば動作確認して完了。


## おわり

足りないところや指摘は編集リクエストしてちょ。