質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

解決済

docker nginx-proxy laravel mysqlでlaravelサイトにアクセスすると502 Bad Gatewayになってしまう

ShingoK
ShingoK

総合スコア10

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。

1回答

0評価

0クリップ

222閲覧

投稿2022/06/20 15:58

ローカル環境macのM1チップパソコンで以下の事をやりたいです。

nginx-proxyでサブドメイン別に違うwebサービスにアクセスを分けたい。
・「wordpress.localhost」にアクセス ⇨ 一つのdockerプロジェクトフォルダで作ったwordpressにアクセス。
・「localhost」にアクセス ⇨ 一つのdockerプロジェクトフォルダで作ったlaravelにアクセス。
・SSL化もしたいのでjrcs/letsencrypt-nginx-proxy-companionでテストSSL(いわゆるオレオレ認証局と理解しているつもりです)を使っている。

初めてのtratailで質問です。
不慣れゆえ、説明不足や失礼な点などございましたら、ご指摘いただけると幸いです。
どうかよろしくお願いします。

やった事などを先に書いて、ソースコードは最後にまとめて記載します。

●やった事は下記です。wordpressの方にアクセスは無事できました。

フォルダ構造
dockerNginxProxyApps/
// laravelのdockerプロジェクトフォルダ
laravel-project/
src/ laravelのデータが入っています
docker-compose.yml
docker/
db/
Dockerfile
my.conf
app/
Dockerfile
php.ini

// wordpressのdockerプロジェクトフォルダ wordpress/ html/ wordpressのデータが入っています docker-compose.yml // nginxプロキシとSSL化のdockerプロジェクトフォルダ shared/ docker/ /encrypt 自動生成されたlet'sEncrypt関連のデータが入ってると理解(しているつもり)です。 docker-compose.yml

やった事・症状
・cdコマンド移動でshared内で docker-compose up -d をする。 無事nginx-proxyの各コンテナが起動する
・ブラウザで http://localhost にアクセス。 無事「503 Service Temp...」が表示される

・cdコマンド移動でwordpress内で docker-compse up -d をする
⇨ 無事wordpressの各コンテナが起動する
・ブラウザでhttp://wordpress.localhostにアクセス。 無事wordpressの設定画面が表示される

・あえて docker-compose down でwordpressを停止する。
(laravel-projectをup -dした時のポート衝突などを避けて、laravel-projecrt自体がうまくいくか試すため)

・cdコマンド移動でlaravel_project内で docker-compse up -d をする
⇨ 無事laravel_projectの各コンテナが起動する
http://localhost にアクセス ⇨ 「502 Bad Gateway」が表示され、laravelが表示されず失敗

現在、ここでハマっている状態です。

●ハマってから、確認したのは以下です。

・cdで移動でlaravel_project内で docker-compose logs app でログを確認、以下が表示される

Attaching to laravel_project_app_1
app_1 | [20-Jun-2022 12:37:43] NOTICE: fpm is running, pid 1
app_1 | [20-Jun-2022 12:37:43] NOTICE: ready to handle connections

・docker network inspect nginx-proxy で確認
⇨ nginx-proxyやlaravel-project関連のコンテナも表示された。
⇨ つまりnetworkに所属はしてくれていると予想。

●以下が各docker-compose.ymlのソースです。

・shared/docker-compose.ymlのソース

version: '3.7'

services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy # letsencrypt-nginxで使うし、通常一つだから
privileged: true
environment:
- "DHPARAM_GENERATION=false"
ports:
- 80:80 # httpでアクセスするとこのポート
- 443:443 # httpsでアクセスするとこのポート
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- proxy:/usr/share/nginx/html
- proxy:/etc/nginx/vhost.d
- ./docker/encrypt/certs:/etc/nginx/certs:ro
# - ./conf.d/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro # 設定を上書きするときはconf.d内に「.conf」拡張子で追加する
restart: always
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"

letsencrypt-nginx:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt-nginx # 通常一つだから
privileged: true
environment:
- NGINX_PROXY_CONTAINER=nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- proxy:/etc/nginx/vhost.d
- proxy:/usr/share/nginx/html
- ./docker/encrypt/certs:/etc/nginx/certs:rw
restart: always
depends_on:
- nginx-proxy

networks:
default:
name: nginx-proxy

volumes:
proxy:

・wordpress/docker-compose.ymlのソースコード

version: "3.7"

services:
wordpress:
image: wordpress #WordPressのイメージ
# ports: # ポートの指定はnginx-proxyでするのでここではしない
# - "80:80"
volumes:
- ./html:/var/www/html #docker_wordpress/html にデータがマウントされる
environment:
- WORDPRESS_DB_HOST=mysql:3306 # 「dbのservice名: ポート番号」にする
- WORDPRESS_DB_NAME=wordpress_db
- WORDPRESS_DB_USER=user
- WORDPRESS_DB_PASSWORD=user_pass_Ck6uTvrQ

# ローカルでのnginx-proxyとletsencrypt-nginxの設定 - VIRTUAL_HOST=wordpress.localhost # nginx-proxyのホスト設定 - LETSENCRYPT_HOST=wordpress.localhost # Let's Encryptのホスト設定、上と同じはず - LETSENCRYPT_EMAIL=xxx@gmail.com #Let's Encryptのメール設定 - LETSENCRYPT_TEST=true # Let's Encryptのテストか、trueでテスト - CERT_NAME=default # ローカルで認証局を立てる、本番のテストまで必要 - HTTPS_METHOD=noredirect # httpsへリダイレクトを無効、本番では不要 depends_on: - mysql restart: always

mysql:
image: mariadb #MariaDBのイメージ
ports:
- "33060:3306" #MacのMySQLとポートがバッティングする場合は変える 例) - "33060:3306"

volumes: - db_test_mysql:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=user_pass_Ck6uTvrQ - MYSQL_DATABASE=wordpress_db - MYSQL_USER=user - MYSQL_PASSWORD=user_pass_Ck6uTvrQ restart: always

networks:
default:
external:
name: nginx-proxy

volumes:
db_test_mysql:

・laravel_project/docker-compose.ymlのソースコード

services:
app: # サービス名
build:
context: .
dockerfile: ./docker/app/Dockerfile
environment:
# .envファイルで指定したDB系の値を${}で読み込ませています。
# docker-compose configでdb側のenvironmentも同じ値である事を確認済みです。
- DB_CONNECTION=${DB_CONNECTION}
- DB_HOST=${DB_HOST}
- DB_PORT=3306
- DB_DATABASE=${DB_DATABASE}
- DB_USERNAME=${DB_USERNAME}
- DB_PASSWORD=${DB_PASSWORD}

# ローカルでのnginx-proxyとletsencrypt-nginxの設定 - VIRTUAL_HOST=${LOCAL_HOST} # nginx-proxyのホスト設定 - LETSENCRYPT_HOST=${LOCAL_HOST} # Let's Encryptのホスト設定、上と同じはず - LETSENCRYPT_EMAIL=xxx@gmail.com #Let's Encryptのメール設定 - LETSENCRYPT_TEST=true # Let's Encryptのテストか、trueでテスト - CERT_NAME=default # ローカルで認証局を立てる、本番のテストまで必要 - HTTPS_METHOD=noredirect # httpsへリダイレクトを無効、本番では不要 volumes: - ./src/:/app depends_on: - db

db: # サービス名
build:
context: .
dockerfile: ./docker/db/Dockerfile
ports:
# 他のプロジェクトのdbのポートとぶつかるなら33060:3306などにする。
# 右側の[:3306]は変えてはダメっぽい
- 3306:3306
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
TZ: 'Asia/Tokyo'
volumes:
- mysql-volume:/var/lib/mysql

networks:
default:
external:
name: nginx-proxy

volumes:
mysql-volume:

初心者丸出しの恥ずかしいメモが点在するのは、優しく流していただけると幸いです。

理解はざっくりと以下の認識しかできておらず、とても浅いです。
・jwilder/nginx-proxyでドメインexample.jpやサブドメインaa.example.jpで各アプリへアクセスを可能にするもの
・jrcs/letsencrypt-nginx-proxy-companionでオレオレSSLと本番用SSLをテストや設定が簡単にできるもの
・wordpressやlaravel(php-fpm)のアプリ系のimageのymlの環境変数にVIRTUAL_HOST〜METHODを指定すればnginx-proxyで振り分け後のURLやSSL系の設定ができ、設定後ブラウザでアクセスすれば繋がり表示されるはず

この理解程度の私は、wordpressの方はうまくいったのになぜlaravelの方はうまくいかない?といった状態で検索しても分からず実力不足ゆえに途方に暮れています。

別の練習で、docker・nginx(プロキシじゃないイメージ)・laravel・mysqlでうまく動作していたlaravel_projectをコピペして変えたものが上記のdocker-compose.ymlです。
このnginxとnginx-proxyで変える必要があるのは「環境変数にVIRTUAL_HOST〜METHODを指定」と「 ポートはnginx-proxyの方から入るからlaravelのymlのappサービスには記述しない」でいけると思っていました。

何となく大きな見落としや理解自体が間違っている気がしているのですが、分からずうまく動かず状態です。
どうかご教授くださりますよう、お願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

proxy

proxy(プロキシー)は、企業などの内部コンピュータとインターネットの中間に位置し、例えば直接インターネットに接続できない内部コンピュータの代理としてインターネットに接続する等をするシステム、もしくは代理として機能を実行するソフトウェアです。内部ネットワークへのアクセスを一元管理し、内部からの特定の種類の接続以外を遮断すること、外部からの不正アクセスを拒否することなどに用いられます。