Complete Guide: How to Log POST Request Data in Nginx (2025)
"Nginx Security: Monitor POST Requests for Better Server Protection"
Ever wondered what data users are submitting through your web forms? Or need to debug API requests hitting your server? By default, nginx doesn't log POST request bodies, but with the right configuration, you can capture everything. Here's how to set it up step by step.
Why Log POST Requests?
Debug form submissions - See exactly what users are sending
Monitor API traffic - Track request payloads and responses
Security monitoring - Detect malicious POST attempts
Troubleshooting - Identify issues with data processing
Prerequisites
Root or sudo access to your server
Nginx installed and running
Basic knowledge of nginx configuration
Note: This won't work on shared hosting as you need server-level access to modify nginx configuration.
Step 1: Locate Your Nginx Configuration
First, find where your nginx config files are located:
Find the main config file
nginx -t
nano /etc/nginx/nginx.conf
Step 2: Backup Your Current Configuration
Always create a backup before making changes:
Backup your current nginx configuration
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
Verify backup was created
ls -la /etc/nginx/sites-available/
Step 3 : Create Custom Log Format
Add this configuration to capture POST data. Place it in your server block or at the top of your configuration file:
nginx# Custom log format to capture POST request bodies
log_format post_detail '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$request_body" "$content_type"';
# Optional: Only log POST requests (saves disk space)
map $request_method $log_post {
~^POST$ 1;
default 0;
}
LIKE THIS PUT THE CUSTOM LOG FORMAT INSIDE THE http BLOCK IN THE NGINX.CONF FILE
nano /etc/nginx/nginx.conf
http {
# Custom log format to capture POST data
log_format postdata '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'Request_Body:"$request_body"';
access_log /var/log/nginx/access.log postdata;
# Optional: Log only POST requests
map $request_method $log_post {
~^POST$ 1;
default 0;
}
Step 3: Edit the other Nginx Configuration File
Open your site's configuration file:
# Edit the default site configuration
sudo nano /etc/nginx/sites-available/default
Step 4: Replace Configuration Content
Delete all existing content and paste this complete configuration:
nginx# Add this to your main nginx.conf in the http block, or at the top of your server file
log_format post_detail '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$request_body" "$content_type"';
map $request_method $log_post {
~^POST$ 1;
default 0;
}
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html index.htm;
# Enable request body reading
client_body_buffer_size 32k;
client_max_body_size 10m;
client_body_timeout 60s;
# Log POST requests
access_log /var/log/nginx/access.log post_detail if=$log_post;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param REQUEST_BODY $request_body;
fastcgi_param CONTENT_LENGTH $content_length;
}
location ~ /\.ht {
deny all;
}
}
Step 5: Save the File
In nano editor:
Press Ctrl + X to exit
# Press Y to save changes
# Press Enter to confirm filename
Step 6: Verify Nginx is Running
Check that nginx restarted successfully:
# Check nginx status
sudo systemctl status nginx
Step 7: Test the Configuration
Always test before applying changes:
# Test nginx configuration for syntax errors
sudo nginx -t
Expected Output:
nginx: the configuration file /etc/nginx/nginx.conf test is successful
Step 8: Apply Changes
If the test passes, reload nginx:
# Reload nginx configuration
sudo nginx -s reload
# Alternative method:
sudo systemctl reload nginx
Step 9: Test in live

Lets randomly try to login the Wordpress Admin panel (For Logging the POST Requests)
Step 10 : Monitor the Logs
sudo tail -f /var/log/nginx/access.log

Conclusion
Logging POST requests in nginx provides valuable insights into your web application's behavior. While the setup requires server-level access and careful security consideration, the debugging and monitoring benefits make it worthwhile for many use cases.
Remember to:
✅ Test configuration before applying
✅ Set up log rotation to manage disk space
✅ Secure log files with proper permissions
✅ Monitor for sensitive data exposure
✅ Consider performance impact on high-traffic sites
With this configuration, we'll have complete visibility into POST request data hitting your nginx server.