UbuntuサーバーにDockerを組み込んで内部にアクセスさせるためのNginxの設定方法備忘録

2024年1月19日

nginx PHP サーバー

eyecatch とあるWebサービスを構築する時に、特殊なサーバーモジュールインストールをしなければいけないのですが、サーバー環境でのOSやらバージョンやら、インストールフレームワークなどの状態を確認して都度適切なモジュールをインストールするのは骨が折れる。 ということで、便利なDockerをサーバー(Ubuntu)にインストールして、あとはDockerに同一環境での挙動をお願いすればいいという事に気がついた。 いくつか注意点があるけど、この方法でやると、どんな環境でも開発環境と同じ安定した環境起動ができ、モジュール管理がとても楽になる上、初期インストールやサーバー移設などの際に極めてスピード早く効率的に作業が行えるようになる。 やはりDockerは神ツールである。 ようするに、サーバーにDockerさえインストールしておけば、どんなサービス環境も安定して即座に構築できてしまうのだ。 分かっていたのに、何故今までこれをやらなかったのか、自分に対してアホ連発したのは言うまでもない。

サーバー環境の確認

すでにあるUbuntu18.04を利用する事を前提で話を進めます。 Dockerが使えるサーバーの確認をしなければいけないのですが、18.04はギリ使えるようです。 これよりも古いバージョンだと使えない可能性が高いので、もし使おうとしている人は気をつけてくだされ。 あと、MacやWindowsで使うDockerは、Docker Desktopのみなんだけど、サーバーでは、Docker Engineというバージョンが使える。 そして、このDocker Engineを使うほうがサーバーでは一般的なので、今回はDocker Engineの事をDockerという風に記載するヨ。 概要説明ページは下記URLを御覧ください。 https://docs.docker.jp/engine/index.html

Dockerのインストール

実際にDockerのインストールは次のように行った、コマンドログを備忘録しておきます。

dockerが配布しているオートインストールを使う

$ curl -fsSL https://get.docker.com -o get-docker.sh $ sh get-docker.sh ※curlモジュールは事前にインストールしておいてください。

インストール確認

$ docker -v > Docker version 24.0.2, build cb74dfc

dockerを実行するユーザーをグループに登録

$ usermod -aG docker web ※groupが作られているか確認するコマンド $ groupadd docker

Docker Composeもインストール

$ apt install docker-compose-plugin ここまでできたら、あとは今まで通りコマンドでdockerを使うことができます。

Nginxの設定

次に、サーバーの設定ですが、個人的にApacheではなく、Nginxをメインで使っているので、Apacheについてはこのブログでは説明しません。 自分がコピペして使い倒しているNginxの設定は次のとおりです。 server { index index.php index.html; server_name %example.com; root /var/www/html; # only .git location ~ /\.git { deny all; return 404; } # データアップロードの容量設定 client_max_body_size 500M; client_body_in_file_only clean; client_body_buffer_size 500M; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } ※サーバーへのアクセスの対象ドメインやIPアドレスをセットします。 今回使うサーバーは、別のホームページなどで使っていたモノなので、PHP7.4とNginxがすでにセットされている状態でした。

問題発生

今回サーバーにセットするサービスは、一部PHPを使うモノだったのですが、案の定PHPが7.4のバージョンのままでした。 そりゃそうですよね。nginxは通常の設定しかしていないので・・・ リバースプロキシという設定をして、80番ポート(443番ポート)で受け取ったパケットをdockerでセットしたサービス用のポートに受け渡す必要があります。 ちなみに、今回のサービス用Dockerでは、8001番のポートをdocker内では80番に変換するようにしています。

Nginxの設定見直し

最終的にNginxは次の設定にして落ち着きました。 server { server { index index.php index.html; server_name %example.com; root /var/www/html; # only .git location ~ /\.git { deny all; return 404; } client_max_body_size 500M; client_body_in_file_only clean; client_body_buffer_size 500M; listen 80; location / { proxy_pass http://127.0.0.1:8001; 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; } } 80番ポートを8001番ポートにリバースプロキシさせてみたんですが、 元々記述してあったphpの設定は外しているところがポイントです。 全てDockerに受け流すのが間違い無さそうです。 Dockerの負荷などを考えて一部アクセスのみをDockerではないモジュールで受けることも可能ですが、それだと完全なDocker管理ができないので、この設定がオススメです。 ちなみに、443番ポートの場合は、80番ではない書き方をする必要がありますが、Let'sEncryptなどのcertbotを使うと自動でセットしてくれるので便利です。

あとがき

複数のサービスを作る時に、Dockerにそれぞれポート番号を割り振ってあげると、同一サーバー内であっても、別々のコンテナを起動させておくことができる。 (負荷は知らんけど) そして、Docker Engineは、あくまでテストサーバーなどで利用するものらしく、本番サーバーでは保証などまるでしていないそうなので、この辺は自己責任で使うというのが暗黙の了解のようだ。 とにかく今回の設定で、開発したものをすぐにサーバーにアップできる環境ができたので、スピードも爆速にできる術を手に入れたと言っても過言ではない。 いや〜プログラミングが捗るね。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。