I will complete rahmu's and MV's answers with a technical solution. Everything that follows is valid for UNIX-like systems only.
Scroll past the chmod/chown section for an example using ACLs - a more powerful tool than UNIX file modes.
Finding your web server username
First, you will need to know the username under which your web server runs.
If you are using Apache, it can be
www-data, etc. On most Debian-like systems, Apache is
For nginx, generally, it is also
To check it out, try:
ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1
Ensure that the username this command returns is coherent (for example, I use nginx 99% of time, but this command returns
tomcat7, a Java web server I installed once).
Giving permissions to the web server: using
chmod of 666 or 777 (the go-to solution for that kind of problems in bad documentations/tutorials) can magically make things work, but is insecure.
Giving 666 or 777 permissions will give access to "others". So not just Apache, but also
nsa (provided that those user accounts exist on your machine - but no really, please avoid doing this unless it's just for testing/troubleshooting).
It is better to be more specific and give permissions to just you and Apache. Change the group of your files to give the full control on your files to the web server. To do this, change the owner recursively:
chown -R www-data:www-data your/folder/
But most likely, you may want to keep full access on your files by changing the group only:
chown -R yourusername:www-data your/folder/
Then, do the appropriate
chmod to give the group
www-data the same permissions as you. For example, if the current mode is 640 (6 for you, 4 for www-data, 0 for others, translating to -rw-r-----), set it to 660 (6 for you, 6 for www-data, 0 for others, translating to -rw-rw----). See rahmu's answer to learn more about file modes, it's an old, however elegant mechanism.
To avoid manipulating arcane numbers with
chmod, you can also use this syntax:
chmod -R g+rw your/folder/
It means "to the group (
g), add (
+) read and write (
rw) permissions on folder
your/folder/, recursively (
In 90% of cases, this should be enough.
My preferred method: using ACLs (Access Control List)
Sometimes the first solution is not sufficient.
I will take the example of Symfony Framework that logs and caches a lot of data. So it needs write access to the appropriate folder.
chown method may not be sufficient, when you are using in parallel the Symfony Console in CLI (under my user account) and the Web (web server user). This causes a lot of problems because Symfony is constantly modifying permissions.
In this case, we will use the ACL (Access Control List), which is a more advanced way to manage permissions on many UNIX systems.
Here the commands given by the official Symfony documentation (please change
app/logs to your needs):
On a system that supports
chmod +a (ie. not Debian/Ubuntu)
sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
On a system that does not support
chmod +a (most common)
You will need the
setfacl tool; maybe it is installed on your system by default, so try
setfacl -v to see if the command is available.
If the command is not available, and you are using Ubuntu 14.04+, you'll just have to install the tool:
sudo apt install acl
Otherwise, follow your OS documentation, because you may need to change how your partition is mounted (Ubuntu documentation here).
And there we are:
sudo setfacl -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
I never had any problems with this method, satisfied or your money back.