Linux如何正确设置网站目录所有者与读写权限
网站迁移、解压文件或更换PHP运行方式后,可能出现图片无法上传、缓存无法生成、配置文件不可读等问题。很多人会直接把网站目录设置为777,虽然可能暂时恢复写入,却会扩大安全风险。
正确做法是先确认Web服务器和PHP使用哪个账号运行,再按目录用途设置所有者与权限。
一、查看当前权限
进入网站上级目录,执行:
ls -la /var/www/example.com
查看路径中每一级目录权限:
namei -l /var/www/example.com/public/index.php
常见输出中的权限含义如下:
drwxr-xr-x
-rw-r--r--
第一个字符表示文件类型,后面三组权限分别属于所有者、用户组和其他用户。
二、确认服务运行账号
Nginx可以检查:
ps aux | grep nginx
Apache可以检查:
ps aux | grep -E 'apache2|httpd'
PHP-FPM账号通常配置在池文件中:
grep -R "^[[:space:]]*user =" /etc/php/*/fpm/pool.d/
不同系统可能使用www-data、nginx、apache或独立网站账号。不要在没有确认的情况下照搬用户名称。
三、设置网站目录所有者
假设网站由www-data账号运行,可执行:
sudo chown -R www-data:www-data /var/www/example.com
如果网站代码通过部署账号更新,而PHP只需要写入上传和缓存目录,可以让代码属于部署账号,只对必要目录授予Web服务写权限。
这样比让Web服务账号拥有整个网站目录的写权限更安全。
四、设置基础文件权限
普通网站常见权限为:
sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;
其中:
- 目录
755:所有者可写,其他用户可读取和进入 - 文件
644:所有者可写,其他用户只读
需要由程序写入的上传、缓存和会话目录,应结合运行账号单独设置,而不是提高整个网站权限。
五、保护敏感配置文件
包含数据库密码和接口密钥的文件应进一步收紧权限。例如:
sudo chmod 640 /var/www/example.com/.env
WordPress网站可以根据实际运行环境收紧:
sudo chmod 640 /var/www/example.com/wp-config.php
修改后要测试PHP进程是否仍能读取文件。权限过严同样会造成网站无法运行。
六、不要使用777解决问题
以下命令不应作为通用修复方式:
chmod -R 777 /var/www/example.com
777允许所有本机用户读写和进入目录。共享服务器或存在其他服务账号时,这会明显增加文件被篡改的风险。
遇到写入失败,应检查:
- 文件所有者是否正确
- PHP-FPM运行账号是否匹配
- 目标目录是否需要写权限
- SELinux是否拦截访问
- 磁盘是否已满
- 文件系统是否只读