NginxのPOSTの設定

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

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次