NginxにPOST
でアクセスすると、デフォルトの状態ではHTTP STATUS 405
のエラーになってしまいます。Dockerでコンテナ化したNginxに開発中のアプリからアクセスしているときに、デバッグ用に固定のXMLを返すようにしているときに、エラーになってしまうと困ります。
この記事ではエラーにならずに、GET
と同じようにNginxに置いたファイルをそのまま取得できるようにする方法を紹介します。
NginxをDockerでコンテナ化して実行する方法については、次の記事をご覧ください。
エラーメッセージの内容
Nginxにデフォルト設定でPOST
で送信すると、次のようなレスポンスが返ってきます。
<html>
<head><title>405 Not Allowed</title></head>
<body>
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.17.8</center>
</body>
</html>
Nginxの設定
Nginxの設定は、次の2つのファイルを編集して変更します。
/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf
デフォルトの設定ファイルをコピーする
編集するために、デフォルト設定ファイルをDockerコンテナ内からコピーします。ターミナルで次のように操作します。
% docker container cp testserver_nginx_1:/etc/nginx/nginx.conf ./nginx.conf
% docker container cp testserver_nginx_1:/etc/nginx/conf.d/default.conf ./default.conf
testserver_nginx_1
は私の環境でのDockerコンテナ名です。環境に合わせて変更してください。実行すると、カレントディレクトリにnginx.conf
ファイルとdefault.conf
ファイルがコンテナからコピーされます。
docker container cp コマンドについて
docker container cp
コマンドは、Dockerコンテナとローカルファイルシステムとの間でファイルやフォルダをコピーするコマンドです。次のような書式で使います。
# Dockerコンテナ -> ローカルファイルシステム
docker container cp CONTAINER:コンテナ内のパス ローカルファイルシステムのコピー先パス
# ローカルファイルシステム -> Dockerコンテナ
docker container cp ローカルファイルシステムのパス CONTAINER:コンテナ内のコピー先パス
HTTP STATUS 405 の設定
nginx.conf
ファイルを見ると、次のような設定が見つかり、http
の設定は/etc/nginx/conf.d
ディレクトリに置かれたファイルから読み込んでいることが分かります。つまり、default.conf
が読み込まれます。
http {
省略
include /etc/nginx/conf.d/*.conf;
}
コピーしたもう一つのファイル、default.conf
を見てみましょう。server
の設定が見つかります。NginxではHTTP STATUSに対する設定はserver
内に書くようなので次のような設定を追加します。調べてみると、location
内に書けば、特定のディレクトリにのみ適用することもできるようです。私の場合は全体で良かったので、server
内に書きました。
server {
省略
error_page 405 =200 $uri;
}
HTTP STATUSを200
に変更して、アクセスされたファイルをそのまま返します。
設定ファイル全体は次の通りです。コメントは一部削除しています。
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
error_page 405 =200 $uri;
# 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;
}
}
Dockerイメージの設定
設定が反映されるようにDockerイメージの設定を変更します。
Dockerfileの編集
Dockerコンテナに編集されたファイルがコピーされるように、Dockerfile
に次のような設定を追加します。
FROM nginx:1.17
COPY default.conf /etc/nginx/conf.d
COPY
COPY
を使うとDockerイメージをビルドするときに、ローカルファイルシステムからコンテナにファイルをコピー出来ます。
COPY コピー元パス コピー先パス
Dockerイメージの再ビルド
Dockerイメージを再ビルドします。Docker Composeを使っているので、次のようにしてビルドします。
% docker-compose build
テスト
次のようにしてコンテナを実行します。
% docker-compose up -d
後はアプリからPOST
で接続して、エラーにならずにファイルを受信できれば成功です。