POSTリクエストを飛ばすとXML形式のレスポンスを返してくれるAPIダミーサーバーをNginxで立てる

こんなケースがあるかどうかわかりませんが、たまたま必要になったので構築ログを書いておきます。

EC2(Amazon Linux 2)を使います。

Nginxのインストールから起動まで

# amazon-linux-extras install nginx1.12 -y
# systemctl start nginx
# systemctl enable nginx

インスタンスのIPにアクセスすればNginxのウェルカムページが表示されます。
セキュリティグループでポートを開いているか注意しましょう。

レスポンス用のXMLファイルを作成する

# cd /usr/share/nginx/html/
# touch foo.xml

foo.xml の中身を適当に作ります。

<?xml version="1.0" encoding="UTF-8" ?>
<foo>
  Dummy Foo.
</foo>

ブラウザから http://xxx.xxx.xxx.xxx/foo.xml にアクセスするか、curl叩いてレスポンスを確かめます。

$ curl -X GET 'http://xxx.xxx.xxx.xxx/foo.xml'

XMLファイルの中身が返ってきたらOKです。

POSTリクエストでもレスポンスが返るようにする

さて、今回はGETではなくPOSTリクエストでレスポンスが返ってくるようにしたいわけです。
ところが、このままだとステータス405が返ってきてしまいます。

$ curl -X POST 'http://xxx.xxx.xxx.xxx/foo.xml'
<html>
<head><title>405 Not Allowed</title></head>
<body bgcolor="white">
<center><h1>405 Not Allowed</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>

Nginxは静的コンテンツに対するPOSTリクエストを許可していないのですね。
さて、どうするか。

結論から書くと、今回は以下のような対応をしました。

# /etc/nginx/nginx.conf

# ...
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;
    # 以下の1行を追加
    error_page 405 =200 $uri;
}
# ...

405を問答無用で200にしてしまうって感じですね。

ちゃんとやろうと思うとこの対応はよろしくないです。
本当は405として処理したいはずのエラーもすべて200になってしまうからです。
ですが、今回はちょっとした動作確認のために取り急ぎ用意したかっただけだったので、このような対応で大丈夫と判断しました。

ということで、Nginxを再起動して、もう一度POSTリクエストを送ってみましょう。
ちゃんとXML形式のレスポンスが返ってきたら完了です。