はじめに
とりあえず作ったプロトタイプをチームのメンバーに共有したい場合など、一旦 Basic 認証をかけて公開するということがある。その際は nginx コンテナで動かすことが多いのその方法についてまとめておく。
結論
最低限必要なファイルは以下の 2 つ。
.
├── Dockerfile
└── default.conf
0 directories, 2 files
コピペで使えるようにとりあえずファイルの内容全体を貼り付ける。
default.conf
server {
listen 8080;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
+ # basic auth
+ auth_basic "Restriceted";
+ auth_basic_user_file /etc/nginx/.htpasswd;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
ルートに対して Basic 認証の設定を入れている。
auth_basic: 認証領域に対して任意の名前を設定。auth_basic: off;にすると認証を無効化できる。
auth_basic_user_file: Basic 認証のユーザー名とパスワードを保持するファイル。- ファイルのフォーマットについては以下である必要がある。
- パスワードには、
openssl passwdコマンドで生成されたものや MD5 アルゴリズムでハッシュ化されたものなどが使用できる。
# comment
name1:password1
name2:password2:comment
name3:password3
どちらも http, server, location, limit_except のディレクティブで指定できる。親のパスで設定している場合、ネストされたパスでも設定が継承される。ネストされたパスで無効化したい場合は、前述の auth_basic: off; で無効化も可能。
Dockerfile
FROM nginx:1.23.1 AS build
+ ARG BASIC_AUTH_USER
+ ARG BASIC_AUTH_PASSWORD
# Basic 認証ファイルを生成
+ RUN crypt_pass=`openssl passwd -crypt ${BASIC_AUTH_PASSWORD}` && \
+ echo "${BASIC_AUTH_USER}:${crypt_pass}" > .htpasswd
FROM nginx:1.23.1
# nginx の設定ファイル
COPY default.conf /etc/nginx/conf.d/
+ COPY --from=build .htpasswd /etc/nginx/.htpasswd
# nginx の必要な設定
# nginx の必要な設定
RUN touch /var/run/nginx.pid && \
chown nginx:nginx /var/run/nginx.pid && \
chown -R nginx:nginx /var/cache/nginx && \
chmod -R g+w /var/cache/nginx
# ログ設定
RUN mkdir -p /var/log/nginx && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
# nginx ユーザでコンテナを起動
USER nginx
EXPOSE 8080
CMD [ "nginx", "-g", "daemon off;" ]
ARG命令- 認証ファイルの生成に必要なユーザ名、パスワードを Dockerfile 内で一時的に使用するため、
ENVではなくこちらを使用するようにした。 - 意図としては、Dockerfile にベタ書きする必要もなく、ユーザ側でビルドする際に任意の値をオプションで指定できるようにした。
- 認証ファイルの生成に必要なユーザ名、パスワードを Dockerfile 内で一時的に使用するため、
- マルチステージビルド
- ビルドステージで
openssl passwdコマンドを使用して、パスワードファイルを生成し、default.conf で指定したパスへコピーしている。 - (この程度なら必要ないかもと思いつつ)
- ビルドステージで
使い方
docker build 時に Basic 認証のユーザ名、パスワードを --build-arg オプションで渡す。
docker build -t ega4432/nginx-basic-auth:v0.1 \
--build-arg BASIC_AUTH_USER="ega4432" \
--build-arg BASIC_AUTH_PASSWORD="password" .
docker run -it --name nginx \
--rm -p 8080:8080 ega4432/nginx-basic-auth:v0.1
確認
cURL で確認してみる。
通常アクセス
ちゃんと 401 が返ってきた!
curl -I localhost:8080
HTTP/1.1 401 Unauthorized
Server: nginx/1.23.1
Date: Sat, 08 Oct 2022 07:23:16 GMT
Content-Type: text/html
Content-Length: 179
Connection: keep-alive
WWW-Authenticate: Basic realm="Restriceted"
認証情報を付与してアクセス
--user(-u) オプションで認証情報を渡すと 200 が返ってきた!
curl -I -u ega4432:password localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.23.1
Date: Sat, 08 Oct 2022 08:01:04 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 19 Jul 2022 14:05:27 GMT
Connection: keep-alive
ETag: "62d6ba27-267"
Accept-Ranges: bytes
ブラウザでも localhost:8080 にアクセスすると Basic 認証のポップアップが表示され、正しい認証情報を入力するとアクセスできた!
まとめ
nginx コンテナで Basic 認証をかける方法についてまとめてみた。完全に自分用メモと言う感じで雑に書いてしまったが、どなたかのためになれればと思う。
参考
Module ngx_http_auth_basic_module
https://hub.docker.com/_/nginx
Dockerfile ARG入門 - Qiita
Dockerfile ARG Dockerfileには、 ARG という定義命令があります。これは、dockerfile内で使用できる変数で、変数の値によって生成するイメージの中身を変えることができます。 環境変数であるENVとは異なり、Dockerfile 内でのみこ...
docker build — Docker-docs-ja 24.0 ドキュメント
nginx実践入門 WEB+DB PRESS plus
本電子書籍は2016年1月6日初版発行のものを、後日電子化し、発売したものです。
(概要)
nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。
nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。
(こんな方におすすめ)
・nginxを初めて使う/さらに使いこなしたいWeb開発者ア
(目次)
第1章:nginxの概要とアーキテクチャ
1.1 nginxとは
1.2 nginxのアーキテクチャ
1.3 まとめ
第2章:インストールと起動
2.1 ソースコードからのインストール
2.2 パッケージからのインストール
2.3 nginxの起動、終了、基本的な操作
2.4 まとめ
第3章:基本設定
3.1 設定ファイルの構成
3.2 HTTPサーバに関する設定
3.3 nginx本体の設定
3.4 パフォーマンスに影響する設定
3.5 まとめ
第4章:静的なWebサイトの構築
4.1 静的コンテンツの公開
4.2 アクセス制限の設定
4.3 リクエストの書き換え
4.4 gzip圧縮転送
4.5 まとめ
第5章:安全かつ高速なHTTPSサーバの構築
5.1 なぜHTTPS通信が必要なのか
5.2 必要なモジュールと最低限の設定
5.3 安全なHTTPS通信を提供するために
5.4 TTFBの最小化によるHTTPS通信の最適化
5.5 複数ドメインを1台のサーバで運用するには
5.6 まとめ
第6章:Webアプリケーションサーバの構築
6.1 リバースプロキシの構築
6.2 Ruby on Railsアプリケーションサーバの構築
6.3 PHPアプリケーションサーバの構築
6.4 まとめ
第7章:大規模コンテンツ配信サーバの構築
7.1 大量のコンテンツを配信するには
7.2 大規模コンテンツ配信のスケールアウト
7.3 nginxによるコンテンツキャッシュ
7.4 オリジンサーバの構築
7.5 ロードバランサの構築
7.6 キャッシュとロードバランスを利用したコンテンツ配信
7.7 まとめ
第8章:Webサーバの運用とメトリクスモニタリング
8.1 nginxのステータスモニタリング
8.2 アクセスログの記録
8.3 Fluentdによるログ収集
8.4 Fluentd、Norikra、GrowthForecastによるメトリクスモニタリング
8.5 ログファイルのローテーション
8.6 無停止でのアップグレード
8.7 まとめ
第9章:Luaによるnginxの拡張──Embed Lua into nginx
9.1 ngx_lua
9.2 nginxをLuaで拡張
9.3 ngx_lua APIプログラミング
9.4 nginxの内部変数の参照
9.5 HTTPリクエストやレスポンスの操作/参照
9.6 正規表現
9.7 データの共有
9.8 サブリクエストをノンブロッキングで処理
9.9 実践的なサンプル
9.10 まとめ
第10章:OpenResty──nginxベースのWebアプリケーションフレームワーク
10.1 OpenRestyの導入
10.2 OpenRestyにバンドルされているLuaモジュール
10.3 memcached、Redis、MySQLへの接続のクローズとキープアライブ
10.4 まとめ
続きを読む