Fix Nginx Failed to Read PID from File on Startup
When Nginx starts, it writes its process ID to a PID file so that system tools and scripts can manage it. If Nginx fails to read this file on startup, the service may not start correctly, or the system may report an error even though the process is running. This guide walks you through the most common causes and fixes for this issue, covering permission problems, missing directories, and configuration errors.
What You’ll Need
- Access to the server via SSH or a terminal with sudo privileges.
- Basic familiarity with the command line.
- The ability to edit files in
/etc/nginx/and/var/run/(or the equivalent directory on your system).
Step-by-Step
- Check the exact error message. Run
sudo systemctl status nginxorsudo nginx -tto see the full error. The message usually includes the path to the PID file, for example:nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory). - Verify the directory exists. The most common cause is that the directory where the PID file should be written does not exist. On most systems, this is
/var/run(which is a symlink to/run). Check with:ls -ld /var/run. If it is missing, create it withsudo mkdir -p /var/run/nginx(or the full path from your config). - Check permissions on the directory. Nginx runs as the
nginxuser (orwww-dataon Debian/Ubuntu). The directory must be writable by that user. For example, to set the correct owner:sudo chown nginx:nginx /var/run/nginxand ensure the permissions are at least755(or775if you need group write). - Look at the Nginx configuration. Open the main config file:
sudo nano /etc/nginx/nginx.conf. Find thepiddirective. It should look like:pid /var/run/nginx.pid;. Make sure the path is correct and that the directory exists. If you changed it, save and test withsudo nginx -t. - Check for stale PID files. If Nginx crashed or was killed, an old PID file might remain. Remove it with
sudo rm -f /var/run/nginx.pid(or your configured path), then try starting Nginx again. - Restart the service. After making changes, run
sudo systemctl restart nginx(orsudo service nginx restarton older systems). Then verify withsudo systemctl status nginxto ensure it is running and the PID file is present. - If using a custom PID path in a systemd unit file. Check the systemd service file:
sudo systemctl cat nginx. Look forPIDFile=in the[Service]section. It must match thepiddirective in nginx.conf. If they differ, update one to match the other.
Common Mistakes
- Mismatched paths: The PID file path in nginx.conf and the systemd unit file must be identical. A common mistake is changing one but not the other.
- Incorrect user permissions: Creating the directory but forgetting to set the owner to the Nginx user will still cause a write failure. Always use
chownto give ownership to the correct user. - Using a relative path: The
piddirective should always use an absolute path (starting with/). Relative paths can cause confusion and errors. - Forgetting to test the config: Always run
sudo nginx -tafter editing the configuration. It will catch syntax errors that could prevent Nginx from starting. - Assuming
/var/runis permanent: On some systems,/var/runis cleared on reboot. If you create a subdirectory there, you may need to recreate it after every reboot. Consider using a path under/runor a persistent location like/var/lib/nginxif this is a recurring issue.
Tips
- Use
nginx -tbefore restarting: This command tests the configuration and reports any errors without restarting the service. It is your first line of defense. - Check the systemd journal: If the error persists, run
sudo journalctl -u nginx -n 50to see detailed logs. They often contain the exact reason for the failure. - Set the correct SELinux context (if applicable): On SELinux-enabled systems (like CentOS/RHEL), the PID file directory may need the correct context. Use
sudo restorecon -v /var/run/nginx.pidor check withls -Z. - Consider using a tmpfiles.d entry: To ensure the directory is recreated on boot, create a file in
/etc/tmpfiles.d/nginx.confwith:d /var/run/nginx 0755 nginx nginx -. This is a clean way to handle ephemeral directories. - Keep the default path if possible: Unless you have a specific reason, keep the default PID path. It is well-known and avoids many permission and systemd integration issues.
Troubleshooting
If you have followed the steps above and still see the error, try the following:
- Check for other Nginx processes: Run
ps aux | grep nginx. If there are multiple master processes, it may indicate a previous instance is still running. Kill them withsudo pkill nginxand then start fresh. - Verify the user Nginx runs as: Look at the
userdirective in nginx.conf. It might be set to a user that does not exist or does not have a shell. Ensure the user exists and has the correct permissions. - Check for read-only filesystems: If your
/var/runis mounted read-only (unlikely but possible in containers), you will need to change the PID path to a writable location. - Look for AppArmor restrictions: On Ubuntu, AppArmor may block Nginx from writing to certain paths. Check the logs with
sudo dmesg | grep nginxorsudo aa-status. You may need to adjust the AppArmor profile. - If using Docker or a container: The issue is often that the container does not have
/var/runwritable. Mount a volume or override the PID path in your container configuration.
Frequently Asked Questions
Why does Nginx need a PID file?
The PID file stores the process ID of the Nginx master process. Systemd and other service managers use it to send signals (like reload or stop) to the correct process. Without it, the service manager cannot manage Nginx properly.
Can I disable the PID file?
No, Nginx requires a PID file to function correctly with service managers. You can change its location, but you cannot disable it entirely. The pid directive is mandatory in the main configuration.
What does “failed to read PID from file” mean exactly?
It means Nginx tried to open the PID file to read the process ID, but the file was missing, unreadable, or the directory did not exist. This usually happens on startup when the file has not been created yet or was deleted.
How do I change the PID file location?
Edit the pid directive in /etc/nginx/nginx.conf. For example, change it to pid /run/nginx.pid;. Then test with sudo nginx -t and restart Nginx. Make sure the directory exists and is writable.
Why does the error appear only after a reboot?
Because /var/run is often a temporary filesystem that is cleared on reboot. If you created a subdirectory there manually, it will be gone after reboot. Use a tmpfiles.d entry or a persistent directory to avoid this.
Is this error dangerous?
Not usually, but it can prevent Nginx from starting or being managed by systemd. It is a configuration or permission issue, not a security threat. Fixing it is straightforward with the steps above.
Related
Method: the standard formula for this calculation, rounded as each result states. See how the calculators work or report an error.