NginxのPOSTの設定

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

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

 

投稿者プロフィール

林 晃
林 晃macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++使い。豊富な開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。

基礎から学ぶMetal


「基礎から学ぶMetal」を執筆しました。本書はMetalを使ってGPUプログラミングを行うための最初のステップを解説するMetalの解説書です。

私が初めてGPUプログラミングを行ったとき、どこから手をつけて、学んでいけば良いのか分からず呆然としました。もし、あのとき、これを教えてくれればという部分を解説しました。本書で解説している部分はMetalの基礎となる部分で、Metalを使うときに必ず触れることになる部分です。

詳細

基礎から学ぶSwiftUI


「基礎から学ぶ SwiftUI」というタイトルの本を執筆しました。

SwiftUIの入門書です。

SwiftUIのコンセプトは「ユーザーインターフェイスを作るための最短パスを提供する」「一度学べば(Appleのプラットフォームの)どこにでも適用できる」です。

SwiftUIの概要から始まって、一つ一つのテクノロジートピックに注目しながらSwiftUIとは何か?どんなことができるのか?どのようなコードを書けば良いのかなどを丸々一冊使って解説しています。

詳細

関連記事

  1. XcodeでGoogle Test (gtest) を使えるようにセッ…

  2. Nginxで帯域制限を行う方法

  3. インストーラのNotarization Service対応

  4. HomebrewをWindows上で使えるようにする

  5. Finderと同じ方式のZipファイルをターミナルやシェルスクリプトで…

  6. Windows Server 2016 への Hyper-V のインス…

最近の著書

  1. 基礎から学ぶ SwiftUI

人気記事

最近の記事