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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

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

Q&A

解決済

1回答

2180閲覧

Docker環境でNginxを使い、アクセスするパスによってルーティングを2つのコンテナに分けたい

ma-kun92

総合スコア34

nginx

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

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

0グッド

0クリップ

投稿2021/11/07 12:17

編集2021/11/08 08:49

やりたいこと

Docker環境で、Nginx, PHP, phpMyAdmin, MySQLの4つのコンテナを立てています。
http://ドメイン/phpMyAdmin/にアクセスしたときはphpMyAdminコンテナのドキュメントルート(/var/www/html)にルーティングし、
それ以外のパスに対するアクセスはphpコンテナのドキュメントルート(/var/www/html/public)にルーティングさせたいです。

現状

ローカルでコンテナを立ち上げて検証しています。ECSでの構築を考えて、docker-composeを使用しない前提です。
それぞれのコンテナを立ち上げて/phpMyAdmin/アクセスすると、phpMyAdminのログイン画面(/index.php)が表示されて欲しいのに
、phpコンテナの/phpMyAdmin/アクセスしたことになってしまっています。うまくphpMyadminコンテナにルーティングされていない状態です。
Nginxの設定が間違っていると思うので、知見がある方がいましたらご教授いただきたいです。

環境

phpコンテナで利用しているイメージ: php:7.4-fpm
phpMyAdminコンテナで利用しているイメージ: phpmyadmin/phpmyadmin:fpm-alpine
Nginxで利用しているイメージ: nginx:1.18.0
Mysqlで利用しているコンテナ: mysql:5.7

Nginx

1server { 2 listen 80 default_server; 3 listen [::]:80 default_server; 4 server_name localhost; 5 6 root /var/www/html/public; 7 index index.php index.html index.htm; 8 access_log /var/log/nginx/access.log; 9 error_log /var/log/nginx/error.log; 10 11 client_max_body_size 20M; 12 fastcgi_read_timeout 600; 13 14 location / { 15 try_files $uri $uri/ /index.php?$query_string; 16 } 17 18 location = /phpMyAdmin { 19 resolver 127.0.0.11; 20 alias /var/www/html; 21 set $pma phpmyadmin-container:9000; 22 try_files $uri $uri/ /index.php?$query_string; 23 24 fastcgi_split_path_info ^(.+.php)(/.+)$; 25 fastcgi_pass $pma; 26 fastcgi_index index.php; 27 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 28 fastcgi_param SCRIPT_NAME $fastcgi_script_name; 29 fastcgi_param PATH_INFO $fastcgi_path_info; 30 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 31 include fastcgi_params; 32 } 33 34 location ~ .php$ { 35 resolver 127.0.0.11; 36 root /var/www/html/public; 37 set $php php-container:9000; 38 39 fastcgi_split_path_info ^(.+.php)(/.+)$; 40 fastcgi_pass $php; 41 fastcgi_index index.php; 42 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 43 fastcgi_param SCRIPT_NAME $fastcgi_script_name; 44 fastcgi_param PATH_INFO $fastcgi_path_info; 45 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 46 include fastcgi_params; 47 } 48}

追加資料

phpMyAdminコンテナで発生する読み込みエラー

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

location= は「完全一致」なので、/phpMyAdmin にはマッチしますが、/phpMyAdmin/index.php などにはマッチしないのだと思います。
^~ の「最長一致(優先)」を使うと ~* より優先されると思います。

また、alias でパス /phpMyAdmin/index.php → phpmyadmin-container の /var/www/html/index.php に変換しようとしているように見受けられますが、fastcgi で渡す $fastcgi_script_name/phpMyAdmin が含まれているので、意図した通りにならないと思います。
以下の 2つの方法が考えられます。

A. fastcgi_split_path_info で /phpMyAdmin を取り除く。

location ^~ /phpMyAdmin { (略) root /var/www/html; ★追加 fastcgi_split_path_info ^/phpMyAdmin(.+.php)(.+)$; ★変更 fastcgi_pass $pma; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; }

B. rewrite で /phpMyAdmin を取り除く。

location ^~ /phpMyAdmin { (略) root /var/www/html; ★追加 rewrite ^/phpMyAdmin(.*)$ $1 break; ★追加 fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass $pma; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; }

投稿2021/11/08 05:09

TaichiYanagiya

総合スコア12173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ma-kun92

2021/11/08 08:58 編集

TaichiYanagiya様 お返事ありがとうございます。 いただいた内容で検証いたしました結果、どちらの方法でも/phpMyAdmin/に対するアクセスでphpMyAdminコンテナのドキュメントルート(/var/www/html/)にあるindex.phpにアクセスできることが確認できました。 個人的にはBの方法を使ってURLを置換する方法の方がしっくりきたので、そちらの方法を採用させていただきました! こちらの方法を採用した後に/phpMyAdmin/にアクセスすると、phpMyAdminコンテナに配置してあるjs, cssファイルの読み込みが403エラーになってしまいます。問題の切り分けとしてNginxの設定ではなくファイルの権限周りと考えていいでしょうか。過去にご経験があれば、お聞きしたいです。ブラウザで表示されるエラーの画像を質問に添付しておきます。
TaichiYanagiya

2021/11/08 09:43

nginx および php-fpm のログを調べてみてください。 php-fpm で .php 以外のファイルを (Webサーバーのように) 扱うのならば、security.limit_extensions の設定が必要になります。 でも、このコンテナイメージでは 80番ポートで Webサーバーが稼働しているようですので、Nginx からの接続は FCGI を使わずに、HTTP で接続すればいいのでは?
ma-kun92

2021/11/08 10:59

とりあえず表示させてみようと思い、security.limit_extensionsの設定にcss, jsを追加してみましたが、cssがうまく当たらないのでやめました。。 > でも、このコンテナイメージでは 80番ポートで Webサーバーが稼働しているようですので、Nginx からの接続は FCGI を使わずに、HTTP で接続すればいいのでは? たしかに、これまではFCGI を使ってfastcgi_passの設定にfastcgi_pass phpmyadmin-container:9000;と記述すればうまいこと接続されないかなぁと淡い期待をして実装していました。 なので、nginxコンテナ --> phpMyAdminコンテナのHTTP接続を実現するために、nginxの設定にどう記述すれば良いかわからないのが現状です。知識不足で話についていけず申し訳ないです。
ma-kun92

2021/11/08 14:15

> でも、このコンテナイメージでは 80番ポートで Webサーバーが稼働しているようですので、Nginx からの接続は FCGI を使わずに、HTTP で接続すればいいのでは? 色々と調べていますが、糸口が掴めません。 上記の部分をもう少し説明していただいてもよろしいでしょうか。
ma-kun92

2021/11/08 14:36

ありがとうございます。感謝します。
ma-kun92

2021/11/08 14:45

TaichiYanagiya様 いろいろとご回答ありがとうございました。どの文章も落ち着いていてわかりやすかったです。 わからないところが残っていますが、当初の質問に対して適切なご回答をいただけたのでクローズいたします。
ma-kun92

2021/11/08 15:58

TaichiYanagiya様 コメントが重なりもうしわけありません。 下記のnginxのserverブロックの設定を下記の記述にした場合に、`/phpMyAdmin/`でphpMyAdminコンテナにルーティングされることができ、画面が正常に表示されるところまで実現できました。 `proxy_pass http://$pma;`の部分で、コンテナ間での名前解決がされることがまだしっくりきていませんが、求めていた形ができました。 本当に丁寧なアドバイスありがとうございました。 ``` server { listen 80 default_server; listen [::]:80 default_server; server_name localhost; root /var/www/html/public; index index.php index.html index.htm; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; client_max_body_size 20M; fastcgi_read_timeout 600; location / { try_files $uri $uri/ /index.php?$query_string; } location ^~ /phpMyAdmin { resolver 127.0.0.11;    set $pma phpmyadmin-container:80; root /var/www/html; proxy_pass http://$pma; rewrite ^/phpMyAdmin(.*)$ $1 break; } location ~ .php$ { resolver 127.0.0.11; set $php php-container:9000; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass $php; index index.php fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問