Fusic Tech Blog

Fusion of Society, IT and Culture

LarvelのビルトインサーバをHTTPSで使いたかった
2020/12/22

LarvelのビルトインサーバをHTTPSで使いたかった

この記事はFusic Advent Calenderの22日目の記事です。

ビルトインサーバ 便利ですよね

業務ではAWSとPHP(LaravelやCakePHP)を主に触っています。
がっつりとした環境があったほうがいい時はdockerを各状況に合わせて作ったりするのですが、 ちょこっとしたWEBアプリを作る時はビルトインサーバをよく使っちゃいます。
Laravelの場合、 php artisan serve でお手軽に起動します。

ビルトインサーバをHTTPSで使いたい

ある時、開発中のWEBアプリにHTTPS、ドメインがあたった状態でアクセスする必要がありました。
ドメインのほうは手元のhostsをいじればいいのですが、HTTPS化はどうしよう?

  • ローカル環境のWEBサーバのドキュメントルートに置いちゃう
  • nginx-proxyとか使ったdockerをがっつり組む

など、色々ありますが、ビルトインサーバのままHTTPS化してみたいなーと思いました。

で、色々試してみたのですが、結果としてローカル環境のnginxでプロキシするのが一番お手軽でした。
結局WEBサーバ使っちゃってるという...w

あまり需要はないと思いますが、世界のどこかに同じことを思った人がいるのであれば、
届けばいいなってことで以下にやり方メモを載せます。

やり方

Laravelでやること

Laravelで必要な設定は、よくあるSSLオフロードを行うロードバランサーの裏にいる場合と同様です。
app/Http/Middleware/TrustProxies.php の信頼するプロキシに * を設定します。

<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies = "*";

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

あとは、ビルトインサーバを立ててプロキシからのアクセスを待ち受けましょう

❯ php artisan serve
Laravel development server started: http://127.0.0.1:8000
[Mon Dec 21 11:33:02 2020] PHP 7.4.3 Development Server (http://127.0.0.1:8000) started

Nginxでやること

Nginxでは、アクセスしたいドメインからのリクエストをhttpで動いているビルトインサーバに対してプロキシしてあげます。

/etc/nginx/sites-available にビルトインサーバ用の設定を追加します

sudo vim /etc/nginx/sites-available/laravel
server {
    listen      80;
    server_name $DOMAIN;

    return 301 https://$host$request_uri;
}

server {
    listen      443 ssl;
    server_name $DOMAIN;

    ssl_certificate     /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;

    location / {
        proxy_pass          http://127.0.0.1:8000;
        proxy_redirect      default;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • 上記の設定ファイルでは、HTTPをHTTPSにリダイレクトする設定も入れてます。
  • $DOMAIN は利用したいドメインに置き換え、手元の hosts も併せて変更しておきます。
  • 証明書は自己証明書でももちろん問題ありません。
  • proxy_pass はビルトインサーバが起動しているIPとポートに合わせてください。

proxy_set_header X-Forwarded-Server $host を入れておかないと、Laravel側でのasset()route()系の処理の時に元のドメインを利用してくれないので注意です。

設定を書き終えたら sites-enabled にシンボリックリンクを置いて、再起動

sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/laravel
sudo systemctl restart nginx

うまくいけば、ブラウザでHTTPSでビルトインサーバの内容が見えていると思います。

終わり

php-pfmの設定もしなくていいので、手元でサクッと確認したいときに利用しています。
結局WEBサーバを使ってはいますが、ドキュメントルートに色々置いたり、dockerを用意するもの面倒な人がいれば参考にしてみてください。

tutida

tutida

福岡でWebエンジニアやってます。PHP, クラウド, インフラあたりが好き。AWS 五冠