Laravel11 にReverbでチャットを作った。
Websocket がよく分かってなかったこともあり、すごく苦労したので、その時のメモ
.envについて
REVERB_HOST=0.0.0.0
REVERB_PORT=8080
REVERB_SCHEME=http
server.conf について
/etc/nginx/conf.d/server.conf にコピーする。
ここは、なぜかソースが消えちゃうという問題が発生。なので、saerver.templateというファイルを作って、
docker-compose 起動時にコピー
- ./nginx/server.template:/etc/nginx/conf.d/server.template
entrypoint: ["/bin/sh", "-c", "cp /etc/nginx/conf.d/server.template /etc/nginx/conf.d/server.conf && exec nginx -g 'daemon off;'"]
実際のコードには、以下を入れる
location /app/ {
proxy_pass http://laravel.test:8080/app/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
この時に、
proxy_pass http://laravel.test:8080/app/;
この部分が結構難点で、
docker inspect -f ‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ tinder10-laravel.test-1
こんな感じで、IPアドレス(ローカルを調べて)設定する。
これを、127.0.0.1 にしたり、DNS名にしたりしたけどダメで、結局 コンテナ名を設定するだった。
IPアドレスだと、dockerを立ち上げるたびに変わることがあるので、コンテナ名とした。
/app/ で、対応しているので、/appは必須 これがないと、nginxから呼び出されない。 これも試行錯誤した。
config.broadcast
'reverb' => [
'driver' => 'reverb',
'key' => env('REVERB_APP_KEY'),
'secret' => env('REVERB_APP_SECRET'),
'app_id' => env('REVERB_APP_ID'),
'options' => [
'host' => env('REVERB_HOST', 'localhost'),
'port' => env('REVERB_PORT', 8080), // デフォルトを 8080 に修正
'useTLS' => true,
'scheme' => env('REVERB_SCHEME', 'https'),
#'useTLS' => env('REVERB_PORT', 443) == 443 || env('REVERB_SCHEME', 'http') === 'https', // 修正
],
'client_options' => [
// Guzzle client options
],
],
useTLS をtrue とした。
config.reverb.php
ここで app に指定しているのを忘れて、無駄に時間を
'apps' => [
'provider' => 'config',
'apps' => [
[
'key' => env('REVERB_APP_KEY'),
'secret' => env('REVERB_APP_SECRET'),
'app_id' => env('REVERB_APP_ID'),
'options' => [
'host' => env('REVERB_HOST'),
'port' => env('REVERB_PORT', 443),
'scheme' => env('REVERB_SCHEME', 'https'),
'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
],
'allowed_origins' => ['*'],
'ping_interval' => env('REVERB_APP_PING_INTERVAL', 60),
'activity_timeout' => env('REVERB_APP_ACTIVITY_TIMEOUT', 30),
'max_message_size' => env('REVERB_APP_MAX_MESSAGE_SIZE', 10_000),
],
],
],
php.ini
Letsencriptのセキュリティファイルの指定
curl.cainfo="/etc/ssl/certs/fullchain.pem"
openssl.cafile="/etc/ssl/certs/fullchain.pem"
当然と言えば当然なのだけど、nginx と reverb(laravel.text)は、それぞれに、セキュリティファイルが必要
上にも書いたけど、nginx のコンテナは、なかなか一度入るとキャッシュが効いて、それが上書きするので厄介。
chainn.pem を最初入れてたのをfull chain.pemに切り替えたのに、それがアップすると、chain.pemの内容になっていてそれに気がつくのにすごく時間がかかった。chatgptがサイズが違うって教えてくれて気がついた。
docker-compose.yml
一応nginxの最終系
nginx:
image: 'nginx:latest'
ports:
- '${HTTP_PORT:-80}:80'
- '${SSL_PORT:-443}:443'
environment:
- SSL_PORT=${SSL_PORT:-443}
- APP_SERVICE=${APP_SERVICE:-laravel.test}
- SERVER_NAME=${SERVER_NAME:-localhost}
- SSL_DOMAIN=${SSL_DOMAIN:-localhost}
- SSL_ALT_NAME=${SSL_ALT_NAME:-DNS:localhost}
volumes:
#- ./nginx/server.conf:/etc/nginx/conf.d/default.conf
#- ./nginx/server.conf:/etc/nginx/conf.d/default.conf
#- 'sail-nginx:/etc/nginx/certs'
- './vendor/ryoluo/sail-ssl/nginx/templates:/etc/nginx/templates'
- './vendor/ryoluo/sail-ssl/nginx/generate-ssl-cert.sh:/docker-entrypoint.d/99-generate-ssl-cert.sh'
- './docker/dev.tinder.navi.jpn.com/privkey1.pem:/etc/nginx/certs/server.key'
- './docker/dev.tinder.navi.jpn.com/fullchain1.pem:/etc/nginx/certs/server.pem'
- ./nginx/server.template:/etc/nginx/conf.d/server.template
entrypoint: ["/bin/sh", "-c", "cp /etc/nginx/conf.d/server.template /etc/nginx/conf.d/server.conf && exec nginx -g 'daemon off;'"]