Oh, file permissions! Perhaps one of the most annoying things for both web hosts and webmasters across the globe are those pesky file permissions that get in the way of software updates, media uploads, and other maintenance tasks. For better or worse, it tends to be a knee-jerk scapegoat for many developers: “hmm, could it be a permissions issue?” is all too often the otherwise hopeless response of technical support agents the world over. If you are accustomed to years of cPanel/Apache web hosting, you may not have noticed such issues too often as the (bulky) software manages its own users and server permissions. However, as the trend toward slimmed down VPS servers continues to grow, permissions issues are here to stay.
In order to manage inconsistent owners/groups/permissions, some managed WordPress hosting companies offer a “permissions reset” button in their user control panel. Others don’t even have a solution, and only address the problem when asked. In response to this growing request from our users, we decided to put together a shell script for Ubuntu servers that can be loaded into crontab and run automatically on a scheduled basis. Feel free to try it out if you run servers of your own :)
Note: you must have root access to your server in order to properly configure this cron job script.
First, save variables in separate config
file below:
cd /home/example sudo touch /home/example/config sudo nano /home/example/config
Copy and paste the below code into your new config
file (change username):
#!/bin/bash user="example"
Next, let’s create a new file i.e. perms-cron
in which our cron script is going to reside:
cd /home/example sudo touch /home/example/perms-cron sudo nano /home/example/perms-cron
…and copy and paste the below code into your cron script created above:
#!/bin/bash source config source /home/$user/perms
Lastly, we need the actual permissions settings in a third file:
cd /home/example sudo touch /home/example/perms sudo nano /home/example/perms
Copy and paste the below script into your new perms
file (don’t forget to change any sources):
Important: notice that sudo
is not necessary as we will be adding this shell script to the root user’s crontab. Including sudo
in a shell script requires a user’s password to be stored in plaintext = very bad idea!
Code last updated 5 May, 2016
#!/bin/bash chown root:root /home/$user/config chown root:root /home/$user/muplugs-cron chown root:root /home/$user/perms-cron chown root:root /home/$user/ups-cron chown root:root /home/$user/perms chown root:root /home/$user/check-cron chown root:root /home/$user/worker-cron chmod +x /home/$user/config chmod +x /home/$user/muplugs-cron chmod +x /home/$user/perms-cron chmod +x /home/$user/ups-cron chmod +x /home/$user/perms chmod +x /home/$user/check-cron chmod +x /home/$user/worker-cron chown -R $user:wordpress /home/$user/www chown -R www-data:wordpress /home/$user/www/wp-content/mu-plugins chown -R www-data:www-data /var/log/nginx; chmod -R 755 /var/log/nginx; find /home/$user/www/ -type d -exec chmod 775 {} \; find /home/$user/www/ -type f -exec chmod 664 {} \; find /home/$user/www/wp-content/cache/ -type d -exec chmod 777 {} \; find /home/$user/www/wp-content/cache/ -type f -exec chmod 777 {} \; chmod 660 /home/$user/www/wp-config.php chmod -R g+s /home/$user/www/
Finish up the script by making sure all files executable and owned by the root user (our cron will do this too):
sudo chmod +x /home/example/config sudo chmod +x /home/example/perms-cron sudo chmod +x /home/example/perms sudo chown root:root /home/example/config sudo chown root:root /home/example/perms-cron sudo chown root:root /home/example/perms
You will notice that our script file is merely named “permissions” without any file extension, such as .sh
or otherwise. This is because we’ve already made the script executable and included a “shebang” line at the top of our script to clarify to the root user which type of script this is (bash), so there is no need for a file extension type.
Lastly, we need to add this script to the root’s crontab file for scheduling:
sudo crontab -e
At the bottom of the crontab file, paste the below code (change username). /dev/null 2>&1
will prevent any cron reporting attempts being sent via email, which is best in the case that your VPS does not have an active mail server. The cron below is set to run once every hour, which should be more than enough (too often can stress server resources):
0 * * * * /home/example/perms-cron > /dev/null 2>&1
For good measure, restart the Nginx service and then test that the script is working (see below video):
sudo service nginx restart
Tags: Cron Jobs, Nginx, Permissions, Scripts, Server Management, Ubuntu
Last modified: 5 May, 2016https://www.littlebizzy.com/?p=4213"After being hosted on GoDaddy for years, I didn't realize how negatively it was impacting my search traffic. Soon after moving to LittleBizzy, my homepage went from page 3 on Google to #1 world-wide for my target market, and I also reached the top 3 on Google Maps, with no additional SEO work."
Juliette S."Before moving to LittleBizzy, whenever our news website was featured on the Drudge Report, it often slowed to a crawl or even froze up during big traffic spikes. Now, that never happens anymore, and we've been able to focus on publishing more articles instead of worrying about our web hosting."
Tony H."The research by Amazon is definitely true, because our slow WooCommerce store was bleeding sales. After LittleBizzy stabilized our performance and moved us closer to our target customers, we saw a measurable improvement in shopping cart checkouts, esp. during holidays... much better!"
Mohammed H.No contracts, free migration, and free SSL forever. What are you waiting for? Order Hosting Now.
WordPress Gossip, Technical SEO News, And Other Goodies.
Free. Unsubscribe anytime.