とある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は、あくまでテストサーバーなどで利用するものらしく、本番サーバーでは保証などまるでしていないそうなので、この辺は自己責任で使うというのが暗黙の了解のようだ。
とにかく今回の設定で、開発したものをすぐにサーバーにアップできる環境ができたので、スピードも爆速にできる術を手に入れたと言っても過言ではない。
いや〜プログラミングが捗るね。
0 件のコメント:
コメントを投稿