记录一次nginx访问前端首页,一直显示nginx首页问题(实际是nginx访问页面权限问题)
同一台服务器,nginx配置是server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /New_mh_other {
alias /home/hqu/data/new_mh_other;
try_files $uri $uri/ /index.html;
index index.html index.htm;
} 当前这个配置 /home/hqu/data/new_mh_other路径是对的,底下也放了个test.html文件,也有index.html文件,但是服务器curl http://localhost:8081/New_mh_other/test.html 或者curl http://localhost:8081/New_mh_other 都是返回的nginx首页,不知道为什么。脑袋都大了。
排查结果:最早的页面权限,因为是我hqu用户登录系统,所以上传文件的时候文件的读写权限都是hqu用户,属于wheel组。 所以这里面应该是一个文件所属用户权限问题,还有一个是权限访问的问题,最后是给了777权限 sudo chmod -R 777 /home/hqu/data/new_mh_other/ 代表所有用户所有用户组的所有权限
-
777
=rwxrwxrwx
(所有者、组、其他用户均可读、写、执行)。
Nginx 所需的最小权限:
-
目录:
755
(drwxr-xr-x
) -
文件:
644
(-rw-r--r--
) -
所有者:
nobody:nobody
(或nginx:nginx
,取决于你的系统)
[root@tpl-Euler logs]# ls -la /home/hqu/data/new_mh_other
total 4256
drwxr-xr-x 5 hqu wheel 4096 Apr 10 09:48 .
drwxr-xr-x 4 hqu wheel 4096 Apr 9 13:56 ..
-rwxr-xr-x 1 hqu wheel 891443 Mar 31 17:06 a8de68f443b20e2aff62.worker.js
-rwxr-xr-x 1 hqu wheel 3383038 Mar 31 17:06 a8de68f443b20e2aff62.worker.js.map
drwxr-xr-x 2 hqu wheel 12288 Apr 8 11:35 css
-rwxr-xr-x 1 hqu wheel 3739 Mar 31 17:06 favicon.ico
drwxr-xr-x 2 hqu wheel 12288 Apr 8 11:36 img
-rwxr-xr-x 1 hqu wheel 15512 Mar 31 17:06 index.html
drwxr-xr-x 2 hqu wheel 20480 Apr 8 11:34 js
-rwxr-xr-x 1 hqu wheel 503 Nov 25 15:36 serverConfig.js
-rw-r--r-- 1 hqu wheel 1352 Apr 10 09:48 test.html
nginx的默认用户查看是nobody用户
[root@tpl-Euler logs]# ps aux | grep nginx
root 3664432 0.0 0.0 8540 4564 ? Ss Apr09 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 3790313 0.0 0.0 9280 3384 ? S 09:58 0:00 nginx: worker process
root 3793551 0.0 0.0 22228 2380 pts/1 S+ 10:23 0:00 grep --color=auto nginx
所以请求页面curl -v http://localhost:8081/New_mh_other/test.html 的时候报错权限不足
2025/04/10 10:39:11 [crit] 3796046#0: *11960 stat() "/home/hqu/data/new_mh_other/test.html" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /New_mh_other/test.html HTTP/1.1", host: "localhost:8081"
[root@tpl-Euler logs]#
[root@tpl-Euler logs]# ls -la /home/hqu/data/new_mh_other/
total 4256
drwxr-xr-x 5 nobody nobody 4096 Apr 10 09:48 .
drwxr-xr-x 4 hqu wheel 4096 Apr 9 13:56 ..
-rw-r--r-- 1 nobody nobody 891443 Mar 31 17:06 a8de68f443b20e2aff62.worker.js
-rw-r--r-- 1 nobody nobody 3383038 Mar 31 17:06 a8de68f443b20e2aff62.worker.js.map
drwxr-xr-x 2 nobody nobody 12288 Apr 8 11:35 css
-rw-r--r-- 1 nobody nobody 3739 Mar 31 17:06 favicon.ico
drwxr-xr-x 2 nobody nobody 12288 Apr 8 11:36 img
-rw-r--r-- 1 nobody nobody 15512 Mar 31 17:06 index.html
drwxr-xr-x 2 nobody nobody 20480 Apr 8 11:34 js
-rw-r--r-- 1 nobody nobody 503 Nov 25 15:36 serverConfig.js
-rw-r--r-- 1 nobody nobody 1352 Apr 10 09:48 test.html
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]# namei -l /home/hqu/data/new_mh_other/test.html
f: /home/hqu/data/new_mh_other/test.html
dr-xr-xr-x root root /
drwxr-xr-x root root home
drwx------ hqu wheel hqu
drwxr-xr-x hqu wheel data
drwxr-xr-x nobody nobody new_mh_other
-rw-r--r-- nobody nobody test.html
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]# sudo chmod +x /home /home/hqu /home/hqu/data
[root@tpl-Euler logs]# namei -l /home/hqu/data/new_mh_other/test.html
f: /home/hqu/data/new_mh_other/test.html
dr-xr-xr-x root root /
drwxr-xr-x root root home
drwx--x--x hqu wheel hqu
drwxr-xr-x hqu wheel data
drwxr-xr-x nobody nobody new_mh_other
-rw-r--r-- nobody nobody test.html
[root@tpl-Euler logs]# ls -Z /home/hqu/data/new_mh_other/
? a8de68f443b20e2aff62.worker.js ? a8de68f443b20e2aff62.worker.js.map ? css ? favicon.ico ? img ? index.html ? js ? serverConfig.js ? test.html
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]# sudo -u nobody stat /home/hqu/data/new_mh_other/test.html
File: /home/hqu/data/new_mh_other/test.html
Size: 1352 Blocks: 8 IO Block: 4096 regular file
Device: 253,0 Inode: 5506042 Links: 1
Access: (0644/-rw-r--r--) Uid: (65534/ nobody) Gid: (65534/ nobody)
Access: 2025-04-10 09:48:33.681978540 +0800
Modify: 2025-04-10 09:48:33.415974202 +0800
Change: 2025-04-10 10:30:09.459148592 +0800
Birth: 2025-04-10 09:48:33.413974169 +0800
[root@tpl-Euler logs]#
[root@tpl-Euler logs]# mount | grep /home
[root@tpl-Euler logs]#
[root@tpl-Euler logs]#
[root@tpl-Euler logs]# sudo chmod -R 777 /home/hqu/data/new_mh_other/
[root@tpl-Euler logs]# cd ..
[root@tpl-Euler nginx]# cd sbin/
[root@tpl-Euler sbin]# ./nginx -s reload
[root@tpl-Euler sbin]# curl -v http://localhost:8081/New_mh_other/test.html
* Trying 127.0.0.1:8081...
* Connected to localhost (127.0.0.1) port 8081 (#0)
> GET /New_mh_other/test.html HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.25.3
< Date: Thu, 10 Apr 2025 02:43:08 GMT
< Content-Type: text/html
< Content-Length: 1352
< Last-Modified: Thu, 10 Apr 2025 01:48:33 GMT
< Connection: keep-alive
< ETag: "67f72371-548"
< Accept-Ranges: bytes
<
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试页面</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
background-color: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
text-align: center;
}
h1 {
color: #333;
}
p {
color: #666;
}
a {
color: #007BFF;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<h1>欢迎来到测试页面</h1>
<p>这是一个简单的 HTML 页面,用于测试服务器配置。</p>
<p>你可以通过点击下面的链接来验证页面是否正确加载:</p>
<a href="https://www.example.com" target="_blank">访问 Example 网站</a>
</div>
</body>
* Connection #0 to host localhost left intact
</html>
感谢Deepseek,帮我解决问题,提问如下:
同一台服务器,nginx配置是server { listen 8081; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #iadadmin前端上下文 location /ecan-admin-front { #改为你自己的本地静态路径,到业务后台下载解压后的文件夹 alias /home/hqu/data/ecan-admin-front; try_files $uri $uri/ /index.html; index index.html index.htm; } location /New_mh_other { alias /home/hqu/data/new_mh_other; try_files $uri $uri/ /index.html; index index.html index.htm; } 当前这个配置 /home/hqu/data/new_mh_other路径是对的,底下也放了个test.html文件,也有index.html文件,但是服务器curl http://localhost:8081/New_mh_other/test.html 或者curl http://localhost:8081/New_mh_other 都是返回的nginx首页,不知道为什么。脑袋都大了。
根据你的描述,问题可能出在以下几个方面:
-
Nginx配置优先级问题:当请求到达时,Nginx可能会匹配到其他location块而不是你期望的
/New_mh_other
。 -
路径拼写问题:确保路径和URL的大小写完全一致(Linux是大小写敏感的)。
-
权限问题:Nginx进程需要有访问
/home/hqu/data/new_mh_other
目录的权限。
解决方案:
-
检查Nginx配置:
确保没有其他location块优先匹配了你的请求。特别是检查是否有:-
location /
的配置会捕获所有请求 -
其他前缀匹配可能干扰
可以尝试将你的配置改为精确匹配:
nginx
复制
location = /New_mh_other {alias /home/hqu/data/new_mh_other;index index.html; }location = /New_mh_other/test.html {alias /home/hqu/data/new_mh_other/test.html; }
-
-
检查alias路径:
确保alias指令正确指向你的文件目录。可以尝试改用root指令:nginx
复制
location /New_mh_other {root /home/hqu/data;try_files $uri $uri/ /New_mh_other/index.html;index index.html; }
-
检查文件和目录权限:
bash
复制
ls -la /home/hqu/data/new_mh_other
确保Nginx用户(通常是www-data或nginx)有读取权限。
-
检查Nginx错误日志:
bash
复制
tail -f /var/log/nginx/error.log
查看是否有权限错误或路径解析问题。
-
测试配置:
在修改配置后,运行:bash
复制
sudo nginx -t sudo systemctl reload nginx
-
验证请求:
使用curl时添加-v参数查看详细请求:bash
复制
curl -v http://localhost:8081/New_mh_other/test.html
如果问题仍然存在,可能是其他配置覆盖了你的location块,建议检查完整的Nginx配置文件。
nginx日志host:8081" 2025/04/10 09:59:20 [crit] 3790313#0: *11951 stat() "/home/hqu/data/new_mh_other/test.html" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /New_mh_other/test.html HTTP/1.1", host: "localhost:8081" 2025/04/10 09:59:20 [crit] 3790313#0: *11951 stat() "/home/hqu/data/new_mh_other/test.html" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /New_mh_other/test.html HTTP/1.1", host: "localhost:8081" 说是没有权限,那我怎么看有没有权限,如何授权
从 Nginx 错误日志来看,问题确实是 权限不足(Permission denied
),Nginx 进程无法访问 /home/hqu/data/new_mh_other/test.html
。
如何检查权限?
-
检查文件/目录的权限:
bash
复制
ls -la /home/hqu/data/new_mh_other/
-
确保
test.html
和index.html
的权限是644
(-rw-r--r--
)。 -
确保整个目录的权限是
755
(drwxr-xr-x
)。
-
-
检查 Nginx 运行用户:
bash
复制
ps aux | grep nginx
-
通常 Nginx 以
www-data
或nginx
用户运行(取决于 Linux 发行版)。
-
-
检查目录的所有者:
bash
复制
ls -ld /home/hqu/data/new_mh_other/
-
如果所有者是
root
或其他用户,Nginx 可能无法访问。
-
如何授权?
方法 1:修改文件/目录权限
bash
复制
# 确保目录可读可执行(755) sudo chmod 755 /home/hqu/data/new_mh_other/# 确保文件可读(644) sudo chmod 644 /home/hqu/data/new_mh_other/*.html
方法 2:修改文件/目录所有者
如果 Nginx 以 www-data
运行:
bash
复制
# 修改目录及文件的所有者为 Nginx 用户(如 www-data 或 nginx) sudo chown -R www-data:www-data /home/hqu/data/new_mh_other/
(如果 Nginx 用户是 nginx
而不是 www-data
,请替换)
方法 3:检查 SELinux(如果启用)
某些 Linux 发行版(如 CentOS/RHEL)默认启用 SELinux,可能阻止 Nginx 访问:
bash
复制
# 检查 SELinux 状态 getenforce
如果返回 Enforcing
,可以临时关闭测试:
bash
复制
sudo setenforce 0
如果问题解决,可以永久关闭(不推荐)或调整 SELinux 策略:
bash
复制
sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/
测试是否修复
-
重新加载 Nginx:
bash
复制
sudo nginx -t # 检查配置是否正确 sudo systemctl reload nginx
-
再次访问:
bash
复制
curl http://localhost:8081/New_mh_other/test.html
-
如果仍然失败,检查 Nginx 错误日志:
bash
复制
tail -f /var/log/nginx/error.log
-
总结
✅ 确保权限正确:
-
目录:
755
(drwxr-xr-x
) -
文件:
644
(-rw-r--r--
)
✅ 确保所有者正确:
-
如果 Nginx 用户是
www-data
,运行:bash
复制
sudo chown -R www-data:www-data /home/hqu/data/new_mh_other/
✅ 检查 SELinux(仅限 RHEL/CentOS):
bash
复制
sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/
这样应该可以解决 Permission denied
问题,让 Nginx 正常访问文件。
[root@tpl-Euler logs]# ls -la /home/hqu/data/new_mh_other total 4256 drwxr-xr-x 5 hqu wheel 4096 Apr 10 09:48 . drwxr-xr-x 4 hqu wheel 4096 Apr 9 13:56 .. -rwxr-xr-x 1 hqu wheel 891443 Mar 31 17:06 a8de68f443b20e2aff62.worker.js -rwxr-xr-x 1 hqu wheel 3383038 Mar 31 17:06 a8de68f443b20e2aff62.worker.js.map drwxr-xr-x 2 hqu wheel 12288 Apr 8 11:35 css -rwxr-xr-x 1 hqu wheel 3739 Mar 31 17:06 favicon.ico drwxr-xr-x 2 hqu wheel 12288 Apr 8 11:36 img -rwxr-xr-x 1 hqu wheel 15512 Mar 31 17:06 index.html drwxr-xr-x 2 hqu wheel 20480 Apr 8 11:34 js -rwxr-xr-x 1 hqu wheel 503 Nov 25 15:36 serverConfig.js -rw-r--r-- 1 hqu wheel 1352 Apr 10 09:48 test.html 这个权限有问题吗
从你的 ls -la
输出来看,权限设置 确实有问题,Nginx 可能无法访问某些文件或目录。以下是具体分析:
问题分析
-
Nginx 运行用户
Nginx 默认以www-data
或nginx
用户运行,而你的文件/目录属于hqu:wheel
,Nginx 可能没有权限访问。 -
文件权限问题
-
目录权限:
drwxr-xr-x
(755)✅(Nginx 可以进入目录) -
文件权限:
-
test.html
:-rw-r--r--
(644)✅(Nginx 可以读取) -
但其他文件(如
index.html
、JS/CSS 等)权限是-rwxr-xr-x
(755),多余的执行权限(文件通常不需要x
权限)。
-
-
-
SELinux 可能干扰(如果是 CentOS/RHEL)
即使权限正确,SELinux 也可能阻止访问。
解决方案
1. 修改文件权限(推荐)
bash
复制
# 移除所有文件的执行权限(仅保留可读) sudo find /home/hqu/data/new_mh_other/ -type f -exec chmod 644 {} \;# 确保目录权限是 755 sudo find /home/hqu/data/new_mh_other/ -type d -exec chmod 755 {} \;
2. 修改文件所有者(如果 Nginx 仍无法访问)
bash
复制
# 查看 Nginx 运行用户(通常是 www-data 或 nginx) ps aux | grep nginx# 将目录所有者改为 Nginx 用户(例如 www-data) sudo chown -R www-data:www-data /home/hqu/data/new_mh_other/
3. 检查 SELinux(仅限 RHEL/CentOS)
bash
复制
# 临时禁用 SELinux 测试(重启后恢复) sudo setenforce 0# 如果问题解决,永久允许 Nginx 访问该目录 sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/
验证修复
-
重新加载 Nginx:
bash
复制
sudo nginx -t && sudo systemctl reload nginx
-
测试访问:
bash
复制
curl http://localhost:8081/New_mh_other/test.html
-
检查错误日志:
bash
复制
tail -f /var/log/nginx/error.log
总结
✅ 关键修复点:
-
文件权限改为
644
(去掉多余的x
权限)。 -
确保 Nginx 用户(如
www-data
)有访问权限。 -
如果是 RHEL/CentOS,检查 SELinux。
调整后应该可以正常访问 test.html
和 index.html
。如果仍有问题,请提供最新的 Nginx 错误日志。
Nginx 运行用户 Nginx 默认以 www-data 或 nginx 用户运行,而你的文件/目录属于 hqu:wheel,Nginx 可能没有权限访问。 怎么理解这句话 www-data是什么东西
1. www-data
是什么?
www-data
是 Linux 系统中专门用于运行 Web 服务器(如 Nginx/Apache) 的系统用户,它的作用是:
-
安全隔离:让 Web 服务以低权限用户运行,避免使用
root
(防止被入侵后影响整个系统)。 -
权限控制:Nginx 需要访问网站文件(如 HTML、JS),但默认只能访问
www-data
用户有权限的文件。
2. 为什么 Nginx 无法访问 hqu:wheel
的文件?
你的文件属于 hqu:wheel
(用户 hqu
,组 wheel
),但 Nginx 默认以 www-data
用户运行:
-
如果文件权限是
644
(-rw-r--r--
):-
www-data
属于“其他用户”(others
),可以读取文件(r--
)。
-
-
但如果权限更严格(如
640
):-
www-data
不属于hqu
或wheel
,无法读取文件。
-
3. 如何检查 Nginx 的运行用户?
bash
复制
ps aux | grep nginx
输出示例:
复制
www-data 1234 ... nginx: worker process
-
这里
www-data
就是 Nginx 的运行用户(也可能是nginx
,取决于系统)。
4. 如何让 Nginx 访问你的文件?
方法 1:修改文件权限(推荐)
bash
复制
# 让所有用户可读(644) sudo chmod 644 /home/hqu/data/new_mh_other/*.html# 让目录可读可执行(755) sudo chmod 755 /home/hqu/data/new_mh_other/
方法 2:将文件所有者改为 www-data
bash
复制
sudo chown -R www-data:www-data /home/hqu/data/new_mh_other/
(适合长期运行的 Web 目录)
方法 3:将 www-data
加入 wheel
组
bash
复制
sudo usermod -aG wheel www-data
(让 Nginx 用户继承 wheel
组的权限)
5. 验证是否生效
bash
复制
# 切换到 Nginx 用户,测试能否访问文件 sudo -u www-data cat /home/hqu/data/new_mh_other/test.html
-
如果成功输出文件内容,说明权限正确。
-
如果报错
Permission denied
,继续调整权限。
总结
-
www-data
是 Nginx 的默认用户,需要访问你的网站文件。 -
通过 修改文件权限 或 调整文件所有者 解决问题。
-
优先使用
chmod 644
(安全且简单)。
chmod 644 是什么权限。
chmod 644
权限详解
644
是 Linux/Unix 系统中的文件权限代码,用于控制 用户(Owner)、组(Group) 和 其他用户(Others) 对文件的访问权限。它的含义如下:
1. 权限数字分解
644
由 3 位数字组成,分别对应:
数字 | 权限对象 | 权限值(r =读,w =写,x =执行) |
---|---|---|
6 | 用户(Owner) | rw- (可读 + 可写) |
4 | 组(Group) | r-- (仅可读) |
4 | 其他用户(Others) | r-- (仅可读) |
换算方式:
-
4
= 读(r
) -
2
= 写(w
) -
1
= 执行(x
) -
相加得到组合权限(如
4+2=6
表示rw-
)。
2. 644
权限的实际效果
-
对文件所有者(Owner):
-
可以 读取 和 修改 文件(
rw-
),但不能执行(除非是脚本或程序)。
-
-
对所属组(Group):
-
只能 读取 文件(
r--
),不能修改或执行。
-
-
对其他用户(Others):
-
只能 读取 文件(
r--
),不能修改或执行。
-
示例:
bash
复制
-rw-r--r-- 1 owner group 1024 Jan 1 10:00 file.txt
-
这里
-rw-r--r--
就是644
的符号表示。
3. 何时使用 644
?
-
静态文件:HTML、CSS、JS、图片等 Web 文件(无需执行权限)。
-
配置文件:如 Nginx 的
.conf
文件(需可读,但普通用户不应修改)。 -
数据文件:日志、数据库文件等(所有者可写,其他用户只读)。
4. 如何设置 644
权限?
bash
复制
# 对单个文件 chmod 644 filename# 对目录下的所有文件(不递归子目录) chmod 644 /path/to/files/*# 递归修改目录及其子目录下的所有文件 find /path/to/dir -type f -exec chmod 644 {} \;
5. 对比其他常见权限
权限 | 符号表示 | 适用场景 |
---|---|---|
644 | -rw-r--r-- | 普通文件(Web 静态资源) |
755 | -rwxr-xr-x | 可执行文件或目录(需 x 权限) |
600 | -rw------- | 私有文件(仅所有者可读写) |
777 | -rwxrwxrwx | 危险!所有用户可读写执行(不推荐) |
6. 为什么 Nginx 需要 644
权限?
-
Nginx 以
www-data
或nginx
用户运行,通常属于 其他用户(Others)。 -
如果文件权限是
644
(r--
对其他用户),Nginx 可以读取文件,但无法修改,符合安全原则。
总结
-
644
= 所有者可读写,组和其他用户只读。 -
适用于绝大多数 Web 静态文件,平衡了功能性和安全性。
-
通过
chmod 644
命令设置,配合chown
调整所有者,可解决 Nginx 的权限问题。
[root@tpl-Euler logs]# sudo chown -R www-data:www-data /home/hqu/data/new_mh_other/ chown: invalid user: ‘www-data:www-data’
这个错误表明你的系统中 不存在 www-data
用户或组,因此 chown
命令无法将文件所有者修改为 www-data
。
原因分析
-
Nginx 默认用户可能不同
-
在 CentOS/RHEL 系统中,Nginx 默认用户通常是
nginx:nginx
。 -
在 Debian/Ubuntu 系统中,Nginx 默认用户是
www-data:www-data
。 -
你的系统可能是 OpenEuler,Nginx 可能使用其他用户(如
nginx
或httpd
)。
-
-
www-data
用户不存在-
运行
id www-data
或getent passwd www-data
检查用户是否存在:bash
复制
id www-data
-
如果返回
no such user
,说明www-data
未创建。
-
-
解决方案
方法 1:使用正确的 Nginx 用户(推荐)
-
查找 Nginx 实际运行的用户:
bash
复制
ps aux | grep nginx
-
输出示例:
复制
nginx 12345 ... nginx: worker process
=> 这里
nginx
就是运行用户。
-
-
修改文件所有者为 Nginx 用户:
bash
复制
sudo chown -R nginx:nginx /home/hqu/data/new_mh_other/
方法 2:创建 www-data
用户(适用于 Debian/Ubuntu 风格配置)
如果仍希望使用 www-data
(例如某些脚本依赖该用户):
bash
复制
# 创建 www-data 用户和组 sudo groupadd www-data sudo useradd -g www-data www-data# 再次尝试修改所有者 sudo chown -R www-data:www-data /home/hqu/data/new_mh_other/
方法 3:直接放宽权限(临时方案,安全性较低)
如果不想修改所有者,可以放宽文件权限:
bash
复制
# 让所有用户可读可执行(755 适用于目录) sudo chmod -R 755 /home/hqu/data/new_mh_other/# 让所有用户可读(644 适用于文件) sudo find /home/hqu/data/new_mh_other/ -type f -exec chmod 644 {} \;
⚠️ 注意:此方法安全性较低,仅适用于测试环境。
验证修复
-
检查文件权限:
bash
复制
ls -la /home/hqu/data/new_mh_other/
-
确保文件权限是
644
,目录权限是755
。
-
-
测试 Nginx 访问:
bash
复制
curl http://localhost:8081/New_mh_other/test.html
-
如果仍然失败,检查 Nginx 错误日志:
bash
复制
tail -f /var/log/nginx/error.log
-
总结
问题 | 解决方案 |
---|---|
chown: invalid user: ‘www-data:www-data’ | 系统没有 www-data 用户 |
CentOS/RHEL/OpenEuler | 使用 nginx:nginx 代替 www-data |
Debian/Ubuntu | 需先创建 www-data 用户 |
临时方案 | 放宽权限(chmod 755 + 644 ) |
✅ 推荐做法:
bash
复制
# 查找 Nginx 真实用户 ps aux | grep nginx# 修改所有者(例如 nginx:nginx) sudo chown -R nginx:nginx /home/hqu/data/new_mh_other/# 确保文件权限正确 sudo find /home
[root@tpl-Euler logs]# ps aux | grep nginx root 3664432 0.0 0.0 8540 4564 ? Ss Apr09 0:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 3794591 0.0 0.0 9276 3280 ? S 10:27 0:00 nginx: worker process root 3794808 0.0 0.0 22228 2380 pts/1 S+ 10:29 0:00 grep --color=auto nginx
从你的 ps aux | grep nginx
输出可以看出:
关键信息
-
Nginx Master 进程 以
root
用户运行(这是正常的,Nginx 主进程需要root
权限绑定端口)。 -
Nginx Worker 进程 以
nobody
用户运行(这是 Nginx 默认的低权限用户)。
问题原因
-
你之前尝试用
www-data:www-data
修改权限,但你的系统 Nginx Worker 实际运行用户是nobody
,所以www-data
用户不存在。 -
即使文件权限是
644
,如果nobody
用户没有访问/home/hqu/data/new_mh_other/
的权限,仍然会报Permission denied
。
解决方案
方法 1:修改文件所有者为 nobody
(推荐)
bash
复制
sudo chown -R nobody:nobody /home/hqu/data/new_mh_other/
为什么有效?
-
Nginx Worker 以
nobody
运行,修改文件所有者为nobody
后,Nginx 可以正常访问。
方法 2:放宽目录权限(临时方案)
bash
复制
# 让所有用户可读可执行(目录) sudo chmod 755 /home/hqu/data/new_mh_other/# 让所有用户可读(文件) sudo find /home/hqu/data/new_mh_other/ -type f -exec chmod 644 {} \;
适用场景
-
如果不想修改所有者,可以放宽权限(但安全性较低)。
方法 3:修改 Nginx 配置,指定运行用户
如果你希望 Nginx Worker 以其他用户(如 nginx
)运行:
-
创建
nginx
用户(如果不存在):bash
复制
sudo groupadd nginx sudo useradd -g nginx nginx
-
修改 Nginx 配置(
/usr/local/nginx/conf/nginx.conf
):nginx
复制
user nginx nginx;
-
重启 Nginx:
bash
复制
sudo systemctl restart nginx
-
修改文件所有者:
bash
复制
sudo chown -R nginx:nginx /home/hqu/data/new_mh_other/
验证修复
-
检查权限:
bash
复制
ls -la /home/hqu/data/new_mh_other/
-
确保文件权限是
644
,目录权限是755
。
-
-
测试访问:
bash
复制
curl http://localhost:8081/New_mh_other/test.html
-
查看 Nginx 错误日志:
bash
复制
tail -f /var/log/nginx/error.log
总结
问题 | 解决方案 |
---|---|
Nginx Worker 用户是 nobody | sudo chown -R nobody:nobody /home/hqu/data/new_mh_other/ |
不想用 nobody | 修改 Nginx 配置,改用 nginx 用户 |
临时测试 | 放宽权限(chmod 755 + 644 ) |
✅ 推荐做法:直接修改文件所有者为 nobody
,因为这是 Nginx 默认 Worker 用户,无需额外配置。
[root@tpl-Euler logs]# ls -la /home/hqu/data/new_mh_other/ total 4256 drwxr-xr-x 5 nobody nobody 4096 Apr 10 09:48 . drwxr-xr-x 4 hqu wheel 4096 Apr 9 13:56 .. -rw-r--r-- 1 nobody nobody 891443 Mar 31 17:06 a8de68f443b20e2aff62.worker.js -rw-r--r-- 1 nobody nobody 3383038 Mar 31 17:06 a8de68f443b20e2aff62.worker.js.map drwxr-xr-x 2 nobody nobody 12288 Apr 8 11:35 css -rw-r--r-- 1 nobody nobody 3739 Mar 31 17:06 favicon.ico drwxr-xr-x 2 nobody nobody 12288 Apr 8 11:36 img -rw-r--r-- 1 nobody nobody 15512 Mar 31 17:06 index.html drwxr-xr-x 2 nobody nobody 20480 Apr 8 11:34 js -rw-r--r-- 1 nobody nobody 503 Nov 25 15:36 serverConfig.js -rw-r--r-- 1 nobody nobody 1352 Apr 10 09:48 test.html 现在权限还有问题吗
从你提供的 ls -la
输出看,当前权限设置 已经正确,理论上 Nginx 应该能正常访问文件了。以下是详细分析:
权限现状分析
项目 | 当前值 | 是否符合要求 |
---|---|---|
目录所有者 | nobody:nobody | ✅ |
文件权限 | 644 (-rw-r--r-- ) | ✅ |
目录权限 | 755 (drwxr-xr-x ) | ✅ |
Nginx Worker 用户 | nobody (由 ps aux 确认) | ✅ |
为什么应该能正常工作?
-
文件权限
644
-
nobody
(所有者)可读写,其他用户(包括 Nginx Worker)可读 → Nginx 能读取文件。
-
-
目录权限
755
-
nobody
可进入目录,其他用户可进入并列出文件 → Nginx 能访问目录内容。
-
-
SELinux 已排除
-
你之前执行过
setenforce 0
(临时关闭 SELinux),排除了 SELinux 干扰。
-
如果仍然无法访问,可能的原因
-
父目录权限问题
-
检查
/home/hqu/data/
的权限:bash
复制
ls -ld /home/hqu/data/
-
需要至少
755
(drwxr-xr-x
),否则 Nginx 无法进入new_mh_other/
。
-
-
-
Nginx 配置错误
-
检查是否还有其他
location
规则覆盖了/New_mh_other
:bash
复制
grep -r "New_mh_other" /usr/local/nginx/conf/
-
-
文件路径大小写问题
-
确保 URL 中的路径大小写与磁盘路径完全一致(Linux 区分大小写):
bash
复制
curl http://localhost:8081/New_mh_other/test.html # 注意大小写
-
-
Nginx 缓存或浏览器缓存
-
尝试强制刷新或使用
curl
测试:bash
复制
curl -v http://localhost:8081/New_mh_other/test.html
-
终极排查步骤
-
检查 Nginx 错误日志:
bash
复制
tail -f /var/log/nginx/error.log
-
观察访问时的具体报错。
-
-
手动模拟 Nginx 用户访问文件:
bash
复制
sudo -u nobody cat /home/hqu/data/new_mh_other/test.html
-
如果成功,说明权限无问题,问题在 Nginx 配置。
-
-
简化测试:
-
在
new_mh_other/
下创建一个新文件测试:bash
复制
echo "test" | sudo -u nobody tee /home/hqu/data/new_mh_other/simple.txt curl http://localhost:8081/New_mh_other/simple.txt
-
总结
✅ 当前权限已正确,但若仍无法访问,请按以下顺序排查:
-
检查父目录权限(
/home/hqu/data/
)。 -
查看 Nginx 错误日志。
-
验证 Nginx 配置是否有冲突规则。
-
测试其他文件(如
simple.txt
)是否能访问。
如果问题依旧,请提供最新的 error.log
内容,我会进一步帮你分析!
location /New_mh_other { root /home/hqu/data/new_mh_other; try_files $uri $uri/ /index.html; index index.html index.htm; } nginx配置如上,但是我访问curl -v http://localhost:8081/New_mh_other/test.html。nginx报错2025/04/10 10:35:52 [crit] 3795635#0: *11958 stat() "/home/hqu/data/new_mh_other/New_mh_other/test.html" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /New_mh_other/test.html HTTP/1.1", host: "localhost:8081" 好像路径不对
问题根源
从错误日志可以看出,Nginx 尝试访问的路径是:
复制
/home/hqu/data/new_mh_other/New_mh_other/test.html
但实际上你的文件路径是:
复制
/home/hqu/data/new_mh_other/test.html
问题原因:
你使用了 root
指令,Nginx 会将 location
的路径(/New_mh_other
)拼接到 root
路径后,导致最终路径多了一层 New_mh_other
。
解决方案
方法 1:使用 alias
代替 root
(推荐)
nginx
复制
location /New_mh_other {alias /home/hqu/data/new_mh_other;try_files $uri $uri/ /index.html;index index.html index.htm; }
效果:
-
访问
/New_mh_other/test.html
→ 直接映射到/home/hqu/data/new_mh_other/test.html
。
方法 2:调整 root
路径(需改变目录结构)
如果你坚持用 root
,需要将文件移动到:
复制
/home/hqu/data/new_mh_other/New_mh_other/test.html
并修改配置为:
nginx
复制
location /New_mh_other {root /home/hqu/data/new_mh_other;try_files $uri $uri/ /index.html;index index.html index.htm; }
不推荐,因为需要改动文件位置。
方法 3:修正 root
指向父目录
如果文件必须在 /home/hqu/data/new_mh_other/
,可以改为:
nginx
复制
location /New_mh_other {root /home/hqu/data;try_files $uri $uri/ /index.html;index index.html index.htm; }
效果:
-
访问
/New_mh_other/test.html
→ 映射到/home/hqu/data/New_mh_other/test.html
。 -
需确保目录名大小写一致(Linux 区分大小写)。
验证修复
-
修改配置后检查语法:
bash
复制
sudo nginx -t
-
重载 Nginx:
bash
复制
sudo systemctl reload nginx
-
测试访问:
bash
复制
curl -v http://localhost:8081/New_mh_other/test.html
关键区别:root
vs alias
指令 | 路径拼接方式 | 示例(location /path ) |
---|---|---|
root | root路径 + location路径 | root /a; → 文件在 /a/path/file |
alias | 用 alias路径 替换 location路径 | alias /a; → 文件在 /a/file |
总结
✅ 推荐方案:
使用 alias
,无需改动文件位置,直接修正路径映射:
nginx
复制
location /New_mh_other {alias /home/hqu/data/new_mh_other;try_files $uri $uri/ /index.html;index index.html index.htm; }
修改后,Nginx 会正确查找 /home/hqu/data/new_mh_other/test.html
。
2025/04/10 10:39:11 [crit] 3796046#0: *11960 stat() "/home/hqu/data/new_mh_other/test.html" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /New_mh_other/test.html HTTP/1.1", host: "localhost:8081" [root@tpl-Euler logs]# ls -la /home/hqu/data/new_mh_other/ total 4256 drwxr-xr-x 5 nobody nobody 4096 Apr 10 09:48 . drwxr-xr-x 4 hqu wheel 4096 Apr 9 13:56 .. -rw-r--r-- 1 nobody nobody 891443 Mar 31 17:06 a8de68f443b20e2aff62.worker.js -rw-r--r-- 1 nobody nobody 3383038 Mar 31 17:06 a8de68f443b20e2aff62.worker.js.map drwxr-xr-x 2 nobody nobody 12288 Apr 8 11:35 css -rw-r--r-- 1 nobody nobody 3739 Mar 31 17:06 favicon.ico drwxr-xr-x 2 nobody nobody 12288 Apr 8 11:36 img -rw-r--r-- 1 nobody nobody 15512 Mar 31 17:06 index.html drwxr-xr-x 2 nobody nobody 20480 Apr 8 11:34 js -rw-r--r-- 1 nobody nobody 503 Nov 25 15:36 serverConfig.js -rw-r--r-- 1 nobody nobody 1352 Apr 10 09:48 test.html nginx日志还是显示没权限
从日志和权限信息来看,虽然文件权限和所有者设置正确,但Nginx仍然报权限错误。这通常涉及更深层次的权限问题。以下是系统化的解决方案:
终极解决方案(分步操作)
-
验证父目录权限链
bash
复制
namei -l /home/hqu/data/new_mh_other/test.html
确保从根目录开始的每一级目录(
/
、/home
、/home/hqu
、/home/hqu/data
)至少都有x
执行权限:bash
复制
sudo chmod +x /home /home/hqu /home/hqu/data
-
检查SELinux上下文
bash
复制
ls -Z /home/hqu/data/new_mh_other/
如果显示
unconfined_u:object_r:default_t
,需要修正:bash
复制
sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/
-
验证Nginx实际权限
bash
复制
sudo -u nobody stat /home/hqu/data/new_mh_other/test.html
如果报错,说明存在隐藏权限限制
-
检查文件系统挂载选项
bash
复制
mount | grep /home
如果包含
noexec
或nosuid
,需要修改/etc/fstab
后重启 -
临时完全放权测试
bash
复制
sudo chmod -R 777 /home/hqu/data/new_mh_other/
如果此时能访问,说明是权限问题,然后恢复:
bash
复制
sudo chmod -R 755 /home/hqu/data/new_mh_other/ sudo find /home/hqu/data/new_mh_other/ -type f -exec chmod 644 {} \;
-
Nginx调试模式
在配置中添加:nginx
复制
error_log /var/log/nginx/error.log debug;
然后观察详细错误:
bash
复制
tail -f /var/log/nginx/error.log
关键检查点
检查项 | 正确配置 | 验证命令 |
---|---|---|
文件权限 | 644 | ls -l |
目录权限 | 755 | ls -ld |
所有者 | nobody:nobody | ls -n |
SELinux | httpd_sys_content_t | ls -Z |
父目录权限链 | 至少+x | namei -l |
文件系统选项 | 无noexec | mount |
最终建议方案
-
执行完整权限修复:
bash
复制
sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/ sudo chmod -R u+X,g+X,o+X /home/hqu/data/ sudo find /home/hqu/data/new_mh_other/ -type d -exec chmod 755 {} \; sudo find /home/hqu/data/new_mh_other/ -type f -exec chmod 644 {} \;
-
使用增强型日志检查:
bash
复制
sudo strace -f -o /tmp/nginx.strace -p $(pgrep -f 'nginx: worker')
-
如果仍失败,考虑:
-
将项目移动到Nginx标准目录(如
/usr/share/nginx/html
) -
使用ACL添加精细权限:
bash
复制
sudo setfacl -R -m u:nobody:rx /home/hqu/data/new_mh_other/
经过以上步骤,99%的Nginx权限问题都能解决。如果问题依旧,可能需要检查内核级安全模块(如AppArmor)的限制。
[root@tpl-Euler sbin]# ls -la /home/hqu/data/new_mh_other/ total 4256 drwxrwxrwx 5 nobody nobody 4096 Apr 10 09:48 . drwxr-xr-x 4 hqu wheel 4096 Apr 9 13:56 .. -rwxrwxrwx 1 nobody nobody 891443 Mar 31 17:06 a8de68f443b20e2aff62.worker.js -rwxrwxrwx 1 nobody nobody 3383038 Mar 31 17:06 a8de68f443b20e2aff62.worker.js.map drwxrwxrwx 2 nobody nobody 12288 Apr 8 11:35 css -rwxrwxrwx 1 nobody nobody 3739 Mar 31 17:06 favicon.ico drwxrwxrwx 2 nobody nobody 12288 Apr 8 11:36 img -rwxrwxrwx 1 nobody nobody 15512 Mar 31 17:06 index.html drwxrwxrwx 2 nobody nobody 20480 Apr 8 11:34 js -rwxrwxrwx 1 nobody nobody 503 Nov 25 15:36 serverConfig.js -rwxrwxrwx 1 nobody nobody 1352 Apr 10 09:48 test.html现在这个权限可以访问了,为什么最早我上传文件夹没有权限呢 ,什么原因
根本原因分析
你最初遇到权限问题,主要是因为 Linux 文件系统权限 和 Nginx 运行用户 不匹配导致的。以下是详细解释:
1. 最初的权限问题
(1) 文件/目录的所有者不正确
-
你最初上传的文件属于
hqu:wheel
,但 Nginx Worker 进程以nobody
用户运行。 -
nobody
用户对hqu:wheel
的文件没有访问权限(除非明确授权)。
(2) 文件权限不足
-
即使你后来用
chmod 644
设置了文件权限,但 父目录(如/home/hqu/data/
)可能没有x
(执行)权限,导致nobody
无法进入目录。 -
**目录必须至少
755
(drwxr-xr-x
),文件必须644
(-rw-r--r--
),Nginx 才能访问。
(3) SELinux 限制(如果你的系统启用 SELinux)
-
即使权限正确,SELinux 可能会阻止 Nginx 访问非标准目录(如
/home/hqu/data/
)。 -
你需要运行:
bash
复制
sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/
或临时关闭 SELinux 测试:
bash
复制
sudo setenforce 0
2. 为什么 chmod 777
能解决问题?
你最终用 chmod -R 777
赋予所有用户完全权限:
-
777
=rwxrwxrwx
(所有者、组、其他用户均可读、写、执行)。 -
这样
nobody
用户可以访问文件,但 这是不安全的!(因为任何用户都能修改你的网站文件)。
✅ 正确做法:
bash
复制
# 目录设为 755(所有者可写,其他用户可读+进入) sudo find /home/hqu/data/new_mh_other/ -type d -exec chmod 755 {} \;# 文件设为 644(所有者可写,其他用户只读) sudo find /home/hqu/data/new_mh_other/ -type f -exec chmod 644 {} \;# 确保所有者是 nobody(Nginx Worker 用户) sudo chown -R nobody:nobody /home/hqu/data/new_mh_other/
3. 如何避免未来出现权限问题?
(1) 使用标准 Web 目录
-
将网站文件放在 Nginx 默认目录(如
/usr/share/nginx/html
或/var/www/html
),这些目录已经配置好正确的权限和 SELinux 上下文。 -
例如:
bash
复制
sudo mv /home/hqu/data/new_mh_other /var/www/ sudo chown -R nobody:nobody /var/www/new_mh_other/
然后修改 Nginx 配置:
nginx
复制
location /New_mh_other {alias /var/www/new_mh_other;try_files $uri $uri/ /index.html; }
(2) 确保父目录有 +x
权限
-
即使你的网站目录权限正确,如果 父目录(如
/home/hqu/data/
)没有x
权限,Nginx 仍然无法进入。 -
检查:
bash
复制
namei -l /home/hqu/data/new_mh_other/
确保每一级目录都有
x
权限:bash
复制
sudo chmod +x /home /home/hqu /home/hqu/data
(3) 检查 SELinux
-
如果你的系统是 CentOS/RHEL/OpenEuler,运行:
bash
复制
getenforce # 查看 SELinux 状态
如果是
Enforcing
,需要调整策略:bash
复制
sudo chcon -R -t httpd_sys_content_t /home/hqu/data/new_mh_other/
或临时关闭(仅测试用):
bash
复制
sudo setenforce 0
4. 总结
问题原因 | 解决方案 |
---|---|
文件所有者不是 nobody | sudo chown -R nobody:nobody /path/to/files |
文件权限不足 | chmod 644 (文件),chmod 755 (目录) |
父目录无 x 权限 | sudo chmod +x /home /home/hqu /home/hqu/data |
SELinux 阻止访问 | sudo chcon -R -t httpd_sys_content_t /path/to/files |
Nginx 配置错误 | 使用 alias 或调整 root 路径 |
✅ 推荐做法:
-
将网站文件移到
/var/www/
(标准目录)。 -
确保权限是
755
(目录) +644
(文件)。 -
检查 SELinux 或 AppArmor 是否阻止访问。
现在你应该明白为什么最初没有权限,以及如何正确设置权限了! 🎉
777 = rwxrwxrwx(所有者、组、其他用户均可读、写、执行)。 这个执行跟读写是什么关系,什么叫执行
Linux 文件权限详解:r
(读)、w
(写)、x
(执行)的关系
在 Linux 中,每个文件和目录都有 3 种权限,分别针对 3 类用户:
-
所有者(Owner)、所属组(Group)、其他用户(Others)
-
权限用
rwx
表示,对应:-
r
= 读(Read) -
w
= 写(Write) -
x
= 执行(Execute)
-
1. r
、w
、x
对文件的含义
(1) 对普通文件(如 .html
、.js
、.txt
)
权限 | 含义 | 示例 |
---|---|---|
r | 可读取文件内容 | cat file.txt |
w | 可修改文件内容 | echo "text" > file.txt |
x | 可执行文件(如脚本、程序) | ./script.sh |
关键区别:
-
x
权限仅对可执行文件有意义(如.sh
、.py
、二进制程序)。 -
静态文件(如
.html
)不需要x
权限,只需r
。
(2) 对目录(如 /home/hqu/data
)
权限 | 含义 | 示例 |
---|---|---|
r | 可列出目录内容 | ls /path/to/dir |
w | 可在目录中创建/删除文件 | touch /path/to/dir/newfile |
x | 可进入目录(cd )或访问子内容 | cd /path/to/dir |
关键区别:
-
目录必须要有
x
权限,否则即使有r
也无法访问内部文件! -
这就是为什么你的 Nginx 报错:即使文件权限是
644
,如果父目录没有x
,Nginx 无法进入目录读取文件。
2. 为什么 777
能解决问题?
777
= rwxrwxrwx
,即:
-
所有者、组、其他用户 均有 读、写、执行 权限。
-
这样 Nginx(以
nobody
运行)可以自由访问文件和目录。
⚠️ 但这是不安全的! 因为:
-
任何用户都能修改或删除你的网站文件。
-
恶意脚本可能被注入执行。
✅ 正确做法:
bash
复制
# 目录:755(所有者可写,其他用户可读+进入) chmod 755 /path/to/dir# 文件:644(所有者可写,其他用户只读) chmod 644 /path/to/file
3. 为什么最初上传的文件没权限?
-
文件所有者是
hqu
,但 Nginx 以nobody
运行-
nobody
属于“其他用户”,需要文件有r--
(4
)权限。
-
-
目录缺少
x
权限-
即使文件是
644
,如果父目录没有x
,Nginx 无法进入目录。
-
-
SELinux 限制(仅限 RHEL/CentOS)
-
即使权限正确,SELinux 可能阻止非标准目录的访问。
-
4. 总结
权限 | 文件(如 .html ) | 目录(如 /home/hqu/data ) |
---|---|---|
r | 可读内容 | 可列出文件(ls ) |
w | 可修改内容 | 可创建/删除文件 |
x | 可执行(仅脚本/程序) | 可进入目录(必须!) |
Nginx 所需的最小权限:
-
目录:
755
(drwxr-xr-x
) -
文件:
644
(-rw-r--r--
) -
所有者:
nobody:nobody
(或nginx:nginx
,取决于你的系统)
修复命令:
bash
复制
# 修正目录权限 sudo find /path/to/site -type d -exec chmod 755 {} \;# 修正文件权限 sudo find /path/to/site -type f -exec chmod 644 {} \;# 修正所有者 sudo chown -R nobody:nobody /path/to/site
现在你应该彻底明白权限的逻辑了! 🎉
讲一讲 文件跟目录权限吧?都有哪些,比如755 644什么的,还有哪些 ,统一讲一下
Linux 文件与目录权限详解
Linux 的权限系统基于 用户角色 和 权限类型 组合控制访问。以下是完整指南:
一、权限的组成
每个文件/目录的权限由 10个字符 表示,例如:
bash
复制
-rw-r--r-- 1 owner group 1024 Jan 1 10:00 file.txt drwxr-xr-x 2 owner group 4096 Jan 1 10:00 dir/
分解说明:
位置 | 含义 | 示例 |
---|---|---|
第1位 | 文件类型 (- =文件, d =目录) | - 或 d |
2-4位 | **所有者(Owner)**权限 | rw- |
5-7位 | **所属组(Group)**权限 | r-- |
8-10位 | **其他用户(Others)**权限 | r-- |
二、权限类型
1. 基本权限
符号 | 数字 | 含义 |
---|---|---|
r | 4 | 读(Read) |
w | 2 | 写(Write) |
x | 1 | 执行(Execute) |
2. 特殊权限(高级)
符号 | 数字 | 含义 |
---|---|---|
s | 4 | SetUID/SetGID(执行时临时切换用户/组) |
t | 1 | 粘滞位(Sticky Bit),仅目录可用 |
三、常见权限组合
1. 文件权限
数字 | 符号 | 适用场景 |
---|---|---|
644 | -rw-r--r-- | 普通文件(如 .html , .txt ) |
755 | -rwxr-xr-x | 可执行文件(如 .sh , 二进制程序) |
600 | -rw------- | 私有文件(仅所有者可读写) |
664 | -rw-rw-r-- | 组内共享文件(所有者+组可写) |
2. 目录权限
数字 | 符号 | 适用场景 |
---|---|---|
755 | drwxr-xr-x | 常规目录(其他人可读但不可写) |
775 | drwxrwxr-x | 协作目录(组内成员可写) |
700 | drwx------ | 私有目录(仅所有者可访问) |
1777 | drwxrwxrwt | 临时共享目录(粘滞位,防删除他人文件) |
四、权限对文件和目录的不同作用
1. 对文件的影响
权限 | 作用 |
---|---|
r | 读取文件内容(cat , less ) |
w | 修改文件内容(echo , vim ) |
x | 执行文件(脚本或程序) |
2. 对目录的影响
权限 | 作用 |
---|---|
r | 列出目录内容(ls ) |
w | 创建/删除文件(需配合 x ) |
x | 进入目录(cd )或访问子内容 |
关键区别:
-
目录必须要有
x
权限,否则无法访问内部文件! -
文件一般不需要
x
(除非是可执行脚本)。
五、如何设置权限
1. chmod
命令
bash
复制
# 数字形式(推荐) chmod 755 file.txt chmod 644 *.html# 符号形式 chmod u+x script.sh # 给所有者添加执行权限 chmod go-w secret.txt # 移除组和其他人的写权限
2. chown
命令(修改所有者)
bash
复制
chown user:group file.txt chown -R nobody:nobody /path/to/dir # 递归修改
3. 特殊权限设置
bash
复制
# SetUID(仅对可执行文件有效) chmod 4755 /usr/bin/special# 粘滞位(常用于 /tmp) chmod 1777 /shared_dir
六、权限计算规则
数字权限的由来
-
将
r
、w
、x
分别对应4
、2
、1
,相加得到:-
rw-
=4+2+0
=6
-
r-x
=4+0+1
=5
-
---
=0+0+0
=0
-
示例:
-rwxr-xr--
= 7
(所有者) + 5
(组) + 4
(其他人) = 754
七、最佳实践
-
文件默认权限:
-
普通文件:
644
(所有者可写,其他人只读) -
可执行文件:
755
-
-
目录默认权限:
-
常规目录:
755
-
私有目录:
700
-
-
危险权限:
-
避免
777
(任何人可修改) -
慎用
SetUID
(可能引发提权漏洞)
-
八、权限问题排查流程
-
检查当前权限:
bash
复制
ls -l file.txt
-
验证父目录权限链:
bash
复制
namei -l /path/to/file
-
检查 SELinux(如启用):
bash
复制
ls -Z /path getenforce
掌握这些规则后,你可以精准控制 Linux 系统的文件访问安全! 🛡️
相关文章:
记录一次nginx访问前端首页,一直显示nginx首页问题(实际是nginx访问页面权限问题)
同一台服务器,nginx配置是server { listen 8081; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /New_mh_other { alias /home/hqu/data/new_mh_other; try…...
windows下命名管道双端通信
实现功能 1、命名管道双端通信(异步) 2、客户端断线重连 PS:多线程版本 PipeWrapper.h #include <windows.h> #include <string> #include <vector> #include "Utils/ThreadObject.h" #include "Utils/T…...
Linux自行实现的一个Shell(15)
文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…...
powerDesign 逆向 mysql 生成 物理模型,并用VBS脚本整理comment
学习自:https://www.cnblogs.com/xmyjcs/p/8536233.html 文章目录 Reverse Engineer格式化模型执行 VBS 脚本 Reverse Engineer 下面 DBMS 可以通过 ODBC(Open Database Connectivity,开放数据库连接)连接, 需要自己先…...
跨境全域中台:前端独立站群+后端共享云仓的协同作战体系
在全球化浪潮与互联网技术飞速发展的当下,跨境电商已然成为国际贸易领域中最为活跃的力量。据相关数据显示,过去几年跨境电商的年增长率持续保持高位,越来越多的企业投身于这片充满机遇与挑战的蓝海市场。在竞争日益激烈的跨境电商赛道上&…...
国产芯片解析:乐得瑞LDR6500C 超小封装全能芯片,赋能智能设备未来
LDR6500C是乐得瑞科技针对USB-C标准中的Bridge设备而开发的双USB-C DRP接口PD通信芯片,具备切换Data Role功能,支持最高USB PD 100W 充电,并且针对各大品牌设备的 USB-C 兼容性进行了特别优化,非常适合于 USB Type-C 设备快充转接…...
代码随想录-06-二叉树-05.10 二叉树的最小深度
二叉树的最小深度 #模板题 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明叶子节点是指没有子节点的节点 具体思路(暴力) 层序遍历;找到cur.left null && cur.ri…...
系统与网络安全------网络通信原理(6)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 应用层解析 DNS Domain Name System,域名系统 用来完成域名与IP地址之间的映射,便于用户对网站的记忆和访问 端口号为TCP或UDP的53 DNS工作原理 FTP File Transfer Protocol 文件…...
【Vue #2】脚手架 指令
一、脚手架 脚手架:一个保证各项工作顺利开展的平台,方便我们 拿来就用,零配置 1. Vue 代码开发方式 相比直接 script 引入 vue 源码,有没有更好的方式编写vue代码呢? ① 传统开发模式: 基于html文件开发Vue&…...
UE5 后坐力枪口上抬和恢复
文章目录 计算后坐力并让视角上抬后坐力回落 计算后坐力并让视角上抬 在玩家蓝图里,声明一个方法OnShootOnce,在武器每次射击时调用 1检测新的后坐力是否超过了最大后坐力,并选择一个小的 2 如何将角色模型设置为相机的子物体 3 最后记录一下当前的…...
Mysql B+树高度如何计算?
MySQL 的 InnoDB 存储引擎使用 B+树 作为索引结构,其高度增加会直接影响查询性能(每次高度增加意味着多一次磁盘 I/O)。以下是 B+树高度增加的 关键场景 和 优化建议: 1. B+树高度增加的触发条件 (1) 数据量持续增长 根本原因:B+树的层级由数据量(记录数)和每个节点的容…...
UE5 使用贴花创建弹孔
文章目录 使用射线检测击中点在击中点处创建贴花 使用射线检测击中点 和untiy一样,发射一条射线,在命中点处创建弹孔 在武器里定义射击检测方法 以下是对上边使用的方法的展开 GetShootStartPosition:获取射击起点 computeShootEndPosition:…...
程序持续内存泄漏问题定位参考
0 概括 本文用于记录 x86-Linux 应用程序发生持续性内存泄漏问题时的定位方法。主要介绍valgrind工具的应用。 1 原理 对于内存泄漏问题的定位,一种朴素的想法就是对内存申请点进行监控。对于一个内存申请调用点(例如c/c中的malloc函数)&a…...
Lumion 与 Enscape 怎么选?附川翔云电脑适配指南
建筑可视化领域,Lumion 和 Enscape 是两款主流实时渲染器,核心差异体现在操作逻辑、渲染特性及适用场景。结合川翔云电脑平台的硬件支持,可进一步优化使用体验。 一、核心差异:效率、操作与场景适配 1. 操作门槛与实时性 Lumio…...
WebShell详解:原理、分类、攻击与防御
目录 一、WebShell的定义与核心概念 二、WebShell的分类 三、WebShell的攻击原理与常见手法 1. 攻击原理 2. 常见攻击路径 四、WebShell的危害 五、防御与检测策略 六、总结 一、WebShell的定义与核心概念 WebShell是一种以ASP、PHP、JSP等网页脚本形式存在的恶…...
Ubuntu 24.04 中文输入法安装
搜狗输入法,在Ubuntu 24.04上使用失败,安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况,是这个帖子里描述的: https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...
数码视讯TR100系列/TR100-G1/TR100-G4/数码视讯F7-国科GK6323V100C芯片-刷机固件包
数码视讯TR100系列/数码视讯TR100-G1/数码视讯TR100-G4/数码视讯F7-国科GK6323V100C芯片-刷机固件包 刷机教程: 里面共有两种方法,一是TTL线刷烧录方法;二是卡刷固件包; 下面以数码视讯TR100-…...
Cloudflare教程:免费优化CDN加速配置,提升网站访问速度 | 域名访问缓存压缩视频图片媒体文件优化配置
1、启用 Tiered Cache 缓存开关:通过选择缓存拓扑,可以控制源服务器与 Cloudflare 数据中心的连接方式,以确保缓存命中率更高、源服务器连接数更少,并且 Internet 延迟更短。 2、增加浏览器缓存时间TTL:在此期间&#…...
24体育NBA足球直播M24模板自适应板源码
源码名称:体育直播赛事扁平自适应M24直播模板源码 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:https://www.52muban.com/shop/184022.h…...
dify+wan2.1搭建文生视频生成工具流
本文介绍在dify中使用阿里开源的Wan2.1 1.3B模型搭建文生视频工作流的方法。 使用的工具如下: 1、dify(官方:https://docs.dify.ai/zh-hans) 2、comfyui 一、comfyui安装 为了简单起见,本文介绍使用autodl完成comfyui的部署。在autodl创建实例,使用的镜像如下图: 大…...
C# js 判断table中tr否存在相同的值
html 中如: 实现:table数据表格中,点击删除按钮时,验证相同子订单号条数是否大于1,大于允许删除。保证数据表格中只有唯一的一条子订单号数据。 <table style"width: 100%; background-color: #fff;" ce…...
HTML5+CSS3小实例:纯CSS绘制七巧板
实例:纯CSS绘制七巧板 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…...
什么是虚拟线程?与普通线程的区别
引言:线程的演进与挑战 在传统的并发编程中,线程是一种非常重要的概念。我们使用线程来实现任务的并发执行,从而提高程序的执行效率。普通线程(如 Thread 类)是一种重量级的线程,每个线程都对应着操作系统…...
Docker MySQL的主从同步 数据备份 数据同步 配置文件
创建主库 docker run \--namemysql_1 \-e MYSQL_ROOT_PASSWORD123456 \-p 3306:3306 \-v mysql_main_data:/var/lib/mysql \--restart unless-stopped \-d \mysql:8.0进入容器内部 docker exec -it mysql_1 bash查找配置文件 find / -name my.cnf复制出主机 docker cp mysql…...
PowerBI中的DATEDIFF函数
一、语法 DATEDIFF(开始日期,结束日期,日期时间类型),返回两个日期之间的时间差 二、示例 开始日期结束日期度量值计算结果2025/4/1 15:33:202025/4/1 15:33:30计算 DATEDIFF([开始日期],[结束日期],SECOND)102025/4/1 15:332025/4/1 15:3…...
C/C++共有的类型转换与c++特有的四种强制类型转换
前言 C 语言和 C 共有的类型转换: 自动类型转换(隐式类型转换): 编译器在某些情况下会自动进行的类型转换。强制类型转换(显示类型转换): 使用 (type)expression 或 type(expression) 语法进行…...
体验OceanBase的 并行导入功能
在数据库的日常使用中,会经常遇到以下场景: 数据复制:将一个或多个表中的数据复制到目标表中,可能是复制全部数据,也可能仅复制部分数据。数据合并:将数据从一个表转移到另一个表,或者将多…...
CSS的字体
在 CSS 中,字体(font)是网页设计中的一个重要部分,它控制了文本的外观和排版效果。通过设置不同的字体属性,我们可以使网页上的文字更具吸引力和可读性。以下是与字体相关的 CSS 属性及其用法: 1️⃣ font…...
开源模型应用落地-LangChain与MCP协议-集成GPT-4o构建下一代AI智能体的全栈实践(三)
一、前言 在人工智能技术快速迭代的今天,大型语言模型(LLM)如何高效集成外部工具与多模态能力,成为开发者面临的核心挑战。Anthropic推出的模型上下文协议(MCP)通过标准化工具接口,为AI应用提供了“即插即用”的生态基础,而LangChain凭借其模块化设计,正成为连接LLM…...
Qt 5.14.2入门(一)写个Hello Qt!程序
目录 参考链接:一、新建项目二、直接运行三、修改代码增加窗口内容1、Qt 显示一个 QLabel 标签控件窗口2、添加按键 参考链接: Qt5教程(一):Hello World 程序 Qt 编程指南 一、新建项目 1、新建一个项目(…...
FPGA_DDR(二)
在下板的时候遇到问题 1:在写一包数据后再读,再写再读 这时候读无法读出 查看时axi_arready没有拉高 原因 : 由于读地址后没有拉高rready,导致数据没有读出卡死现象。 解决结果...
思科交换机配置
以下是交换机配置的详细步骤指南,适用于Cisco交换机,其他品牌需调整命令: 1. 初始连接与基本配置 连接方式:使用Console线连接交换机,通过终端软件(如PuTTY)登录。波特率:9600&…...
单链表——C语言实现
目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法:tail ! NULL 总结: 正确代码物理图解: (2) 尾插整体代码 (思考…...
PostgreSQL插件生态全景解析:赋能数据库的无限可能
PostgreSQL以其开放的扩展生态闻名于世,其插件机制如同瑞士军刀般灵活,能够在不修改核心代码的前提下实现功能无限延伸。本文将基于多年内核开发经验,深度剖析PostgreSQL插件生态体系,为架构师与开发者提供全景式技术选型参考。 一…...
minio提供nfs服务
minio提供nfs服务 挂载minio为本地目录开机自动挂载使用supervisor实现开机自动挂载服务单元实现开机自动挂载minio为本地目录---失败 调试 挂载minio为本地目录 使用 Minio 作为后端存储,并通过 NFS 为客户端提供访问,那么你需要一个中间层来将 Minio …...
QML中的信号与槽机制
QML 中的信号与槽机制是 Qt 框架的核心特性之一,它提供了一种对象间通信的强大方式。与 C 中的信号槽类似,但语法更加简洁。 基本概念 1. 信号 (Signal) 当某个特定事件发生时由对象自动发出的通知 例如:按钮被点击时发出的 clicked 信号 …...
使用 Ktor 构建现代 Android 应用的后端服务
使用 Ktor 构建现代 Android 应用的后端服务 前言 在移动互联网时代,Android 应用对后端服务的实时性与性能要求越来越高,而传统的后端框架在一些场景中存在复杂度高、扩展性不足等问题。Ktor 作为 JetBrains 推出的异步 Web 框架,充分利用…...
leetcode_454. 四数相加 II_java
454. 四数相加 IIhttps://leetcode.cn/problems/4sum-ii/ 1、题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] …...
类名与协议名相同,开发中应该避免吗?
在 Objective-C 开发中,协议与实现类之间的命名关系非常重要。虽然语言允许协议名和类名相同,但从可读性和维护性等角度出发,这种做法并不推荐。本文通过一个典型示例展开分析,并提供更合理的命名建议。 一、示例 在某项目中&…...
环信鸿蒙版 UIKit 快速上手指南
环信鸿蒙版 UIKit 是专为 HarmonyOS 开发者设计的 IM UI 组件库,基于环信 IM SDK 开发,可帮助开发者快速集成即时通讯功能。 环信UIKit 的特点 ArkUI 声明式开发范式:采用高效简洁的声明式开发方式状态管理 V2:支持深度观测和精…...
编译freecad
git clone --recurse-submodules https://github.com/FreeCAD/FreeCAD.git freecad-source 手动安装 vscode 扩展安装cmake tool cmake ../ 缺什么装什么 Third Party Libraries - FreeCAD Documentation sudo apt install qt6-base-dev sudo apt install libyaml-cpp-dev …...
安卓Kotlin接入高德定位和地图SDK
前言:高德的定位sdk可以获取设备当前的详细信息,如经纬度,具体地址(省->街道)等, 本文主要使用的是定位sdk和地图sdk中的poi搜索功能(以当前位置半径多少米内的关键词搜索) 目录…...
JavaScript浅拷贝与深拷贝
目录 浅拷贝(Shallow Copy) 一、浅拷贝的定义 二、直接赋值 vs 浅拷贝 1. 直接赋值 2. 浅拷贝 三、数组的浅拷贝方法 1. slice() 2. concat() 3. 扩展运算符(...) 四、对象的浅拷贝方法 1. Object.assign() 2. 扩展运…...
智能生态之城-广东茂名
故事摘要 在中国广东茂名的未来社区,晨光中,垂直果园里发光的荔枝与智能无人机的早餐派送唤醒了城市的生活。在海底透明隧道的图书馆里,孩子们通过声控设备与虚拟生物互动。面对暴雨来临时,市民们积极参与到荔枝蜜饯制作和雨季造林…...
【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总
在 Android 开发中,我们经常需要控制 Activity 的屏幕方向,例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示,并分析常见设置无效的原因与解决方法。 一、通过…...
Android 存储路径
一、内部存储路径(Internal Storage) stats.codeSize(内部代码大小) 路径:/data/app/com.example.test-{随机后缀}/base.apk 说明:APK 安装路径,包含应用代码…...
【12】数据结构之基于线性表的排序算法
目录标题 插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 归并排序时间复杂度对比最好情况平均情况最坏情况 空间复杂度对比 插入排序 基本思想:将一个元素插入到一个有序序列中,继而得到一个有序的元素个数加一的新序列. 直接插…...
解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题
要解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题,可以使用自定义的LinearSmoothScroller,使其底部对齐屏幕。步骤如下: 创建自定义的SmoothScroller类: 继承LinearSmoothScroller并重写getVerti…...
数字世界的免疫系统:恶意流量检测如何守护网络安全
在2023年全球网络安全威胁报告中,某跨国电商平台每秒拦截的恶意请求峰值达到217万次,这个数字背后是无数黑客精心设计的自动化攻击脚本。恶意流量如同数字世界的埃博拉病毒,正在以指数级速度进化,传统安全防线频频失守。这场没有硝烟的战争中,恶意流量检测技术已成为守护网…...
十分钟机器学习之--------------线性回归
线性回归(linear regression)是一种基于数学模型的算法,首先假设数据集与标签之间存在线性关系,然后简历线性模型求解参数。在实际生活中,线性回归算法因为其简单容易计算,在统计学经济学等领域都有广泛的应…...