By default, accessing Nginx via POST
results in an HTTP STATUS 405
error. This presents a problem when accessing an Nginx instance containerized in Docker from an app under development, especially when the app returns a fixed XML for debugging purposes. Avoiding this issue is crucial.
This article shows how to make it possible to retrieve files placed in Nginx as they are without error, just like GET
.
Please see the following article for more information on containerizing and running Nginx with Docker.
Error message
The following response will be received when sending a POST
to Nginx with the default settings.
<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 configuration
The Nginx configuration is changed by editing the following two files.
/etc/nginx/nginx.conf
/etc/nginx/conf.d/default.conf
Copy default configuration files
To edit, copy the default configurations file from the Docker container. Then, in a terminal, do the following.
% 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
In this example, testserver_nginx_1
is the Docker container name used. Adapt this to fit the container name in your specific environment. Upon execution, the nginx.conf
and default.conf
files will be copied from the container to the current directory.
About the “docker container cp” command
The docker container cp
command copies files and folders between a Docker container and the local file system. It uses the following format.
# Docker Container -> Local File System
docker container cp CONTAINER:path-in-container destination-path-in-local
# Local File System -> Docker Container
docker container cp path-in-local CONTAINER:desination-path-in-container
Configure “HTTP STATUS 405”
We are looking at the nginx.conf file
, we find the following configuration, which indicates that the http
configuration is read from a file placed in the /etc/nginx/conf.d
directory. In other words, default.conf
is read.
http {
(omission)
include /etc/nginx/conf.d/*.conf;
}
Let’s look at the other file we copied, default.conf
, where we can find the server
configuration. The HTTP STATUS
configuration should be written in the server
for Nginx. For example, if you write in the location
, you can apply the setting to only the specified directory. In my case, the setting can be applied to the whole, so I wrote it in the server
.
server {
(omission)
error_page 405 =200 $uri;
}
Change HTTP STATUS
to 200
and return the accessed file as is.
The entire configuration file is as follows. Some comments have been removed.
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 Image Configuration
Modify the Docker image configuration so that the settings are reflected.
Edit the “Dockerfile”
Add the following settings to the Dockerfile
so that the edited files are copied to the Docker container.
FROM nginx:1.17
COPY default.conf /etc/nginx/conf.d
COPY
COPY
allows you to copy files from the local file system to the container when building a Docker image.
COPY source-path dest-path
Rebuild the Docker image
Rebuild the Docker image using Docker Compose, as follows.
% docker-compose build
Test
Run the container as follows.
% docker-compose up -d
Establish a connection from the application via POST
. The operation is considered successful if the file is received without any errors.