NginxのPOSTの設定

Webサーバーと通信アプリを作っているとき、デバッグ中は本当のサーバーに接続するよりも、ローカルマシン内にDockerで作ったテストサーバーと通信した方が便利です。次の記事で作り方を紹介しました。

関連記事

iOSアプリやAndroidアプリなどのネイティブアプリの開発で、HTTP/HTTPSでWebサーバーと通信する処理を実装するとき、固定のデータが戻ってきて欲しいということは多々あります。 UnitテストとかならHTTPの[…]

NginxにPOSTでアクセスすると、デフォルトの状態では、HTTP 405 のエラーになってしまいます。本当のサーバーではPOSTで送信して、送信した内容によってレスポンスが変わる場合でも、実装中は固定のXMLの方が都合が良いです。

この記事ではエラーにならずに、GETと同じようにNginxに置いたファイルをそのまま取得できるようにする方法を紹介します。

スポンサーリンク

エラーメッセージの内容

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コンテナからコピーされます。

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

 

スポンサーリンク
最新情報をチェックしよう!
>現役のプログラマーが書くプログラミング情報

現役のプログラマーが書くプログラミング情報

日々の開発の中での学びや分かったこと、調べたことなどを書いていくブログです。

CTR IMG