Linux 文件权限与网站目录设置
本文章经过AI润色,但是我逐字逐句审查过,有时候AI其实总结的很好。不用担心知识错误问题。
刚接触 Linux 的时候,我一直觉得权限系统很乱。
什么 chmod 755、chown www-data、用户组、所属用户,看着一堆概念混在一起。尤其网上很多教程,出了权限问题直接:
chmod -R 777 /var/www虽然“能用”,但其实问题很大。
后面自己真正开始部署网站、配 Nginx、跑 PHP 之后,才发现 Linux 权限这东西其实逻辑很简单,本质上就是:
谁可以读,谁可以改,谁可以执行。
理解这个之后,很多东西就顺了。
Linux 里基本一切都算“文件”。
每个文件都有:
- 所有者
- 所属组
- 权限
比如:
-rw-r--r-- 1 www-data www-data index.php前面这一串:
-rw-r--r--就是权限。
后面的:
www-data www-data分别是:
所有者 所属组Linux 权限里最核心的只有三个字母:
| 字母 | 含义 |
|---|---|
| r | 读 |
| w | 写 |
| x | 执行 |
数字权限其实就是它们的组合:
| 数字 | 权限 |
|---|---|
| 4 | r |
| 2 | w |
| 1 | x |
所以:
7 = rwx = 4+2+1
6 = rw- = 4+2
5 = r-x = 4+1
4 = r--这也是为什么会有:
755
644
777这种写法。
网站里最常见的文件权限其实是 644。
比如:
chmod 644 index.php对应:
rw-r--r--意思就是:
- 文件所有者可以修改
- 其他人只能读
对于:
- PHP
- HTML
- CSS
- JS
这种文件来说,基本已经完全够用了。
因为 Web 服务器通常只需要读取它们。
目录一般会用 755。
比如:
chmod 755 /var/www对应:
rwxr-xr-x意思是:
- 所有者拥有完整权限
- 其他人可以读取、进入目录
- 但不能修改
这里有个很多新手容易搞混的点:
目录上的 x 不代表“执行目录”。
它表示:
是否允许进入这个目录。
所以目录通常都得有 x 权限,不然连 cd 都进不去。
很多教程最喜欢干的事情就是:
chmod -R 777因为这样“肯定能跑”。
但 777 本质上等于:
- 所有人都能读
- 所有人都能写
- 所有人都能执行
也就是整个目录完全开放。
PHP 网站如果有漏洞,这种权限基本等于直接送 WebShell。
很多网站被挂马,本质上不是漏洞多高级,而是权限给太大了。
chmod 是改权限。
比如:
chmod 644 index.php表示修改文件权限。
递归修改:
chmod -R 755 /var/www/site但这里其实有个问题:
文件和目录通常不应该同权限。
因为:
- 文件一般不需要执行权限
- 目录必须有执行权限
所以更合理的做法一般是分开设。
目录:
find /var/www/site -type d -exec chmod 755 {} \;文件:
find /var/www/site -type f -exec chmod 644 {} \;这是比较标准的网站权限方案。
然后就是 chown。
很多人会把 chmod 和 chown 搞混。
其实区别很大。
chmod 改的是:
谁能干什么
而 chown 改的是:
这个文件是谁的
比如:
chown www-data:www-data index.php意思就是:
所有者:www-data
所属组:www-dataLinux 一般会给服务单独创建用户。
比如:
| 服务 | 用户 |
|---|---|
| Nginx | www-data |
| Apache | apache |
| MySQL | mysql |
这样做主要是为了权限隔离。
否则 Web 服务一旦出问题,就容易直接影响整个系统。
PHP 网站比较常见的一套权限,大概是这样:
| 类型 | 推荐权限 |
|---|---|
| 网站目录 | 755 |
| PHP/HTML/CSS/JS | 644 |
| 上传目录 | 775 |
| 配置文件 | 600 或 640 |
上传目录比较特殊。
因为:
- 用户头像
- 图片上传
- 缓存
- session
这些东西 PHP 需要写入。
所以通常会:
chown -R www-data:www-data uploads
chmod -R 775 uploads这里的 775 已经比 777 安全很多。
因为它只允许:
- 所有者
- 所属组
写入。
不是所有人都能写。
还有个很多教程会犯的问题:
chown -R www-data:www-data /var/www/site整个网站都直接给 www-data。
其实并不太推荐。
更合理的做法通常是:
chown -R 你的用户:www-data /var/www/site比如:
chown -R mxd:www-data /var/www/site这样:
- 你自己能正常改代码
- Web 服务也能读取
- 权限关系更清晰
否则后面你会经常碰到:
Permission denied然后开始到处 sudo。
配置文件权限一般建议更严格一点。
尤其:
.env
config.php
database.yml这种文件里面经常有:
- 数据库密码
- API Key
- SMTP 密码
- Redis 密码
一般建议:
chmod 600 .env或者:
chmod 640 .env别随便给所有用户读取权限。
SSH 密钥权限更严格。
很多人第一次用 SSH 都碰到过:
WARNING: UNPROTECTED PRIVATE KEY FILE!本质上就是 OpenSSH 觉得:
你这私钥别人也能看。
一般推荐:
| 文件 | 权限 |
|---|---|
| ~/.ssh | 700 |
| id_rsa | 600 |
| authorized_keys | 600 |
基本是固定搭配。
Linux 权限这东西,说到底核心其实就一句话:
只给必须的权限。
能 644 就别 666。
能 755 就别 777。
很多服务器安全问题,并不是什么特别高级的漏洞。
而是管理员配置不合理。
通俗易懂 学习了
AD: