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で接続して、エラーにならずにファイルを受信できれば成功です。










