当前位置: 首页 > news >正文

记录一次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 所需的最小权限

  • 目录755drwxr-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首页,不知道为什么。脑袋都大了。

根据你的描述,问题可能出在以下几个方面:

  1. Nginx配置优先级问题:当请求到达时,Nginx可能会匹配到其他location块而不是你期望的/New_mh_other

  2. 路径拼写问题:确保路径和URL的大小写完全一致(Linux是大小写敏感的)。

  3. 权限问题:Nginx进程需要有访问/home/hqu/data/new_mh_other目录的权限。

解决方案:

  1. 检查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;
    }
  2. 检查alias路径
    确保alias指令正确指向你的文件目录。可以尝试改用root指令:

    nginx

    复制

    location /New_mh_other {root /home/hqu/data;try_files $uri $uri/ /New_mh_other/index.html;index index.html;
    }
  3. 检查文件和目录权限

    bash

    复制

    ls -la /home/hqu/data/new_mh_other

    确保Nginx用户(通常是www-data或nginx)有读取权限。

  4. 检查Nginx错误日志

    bash

    复制

    tail -f /var/log/nginx/error.log

    查看是否有权限错误或路径解析问题。

  5. 测试配置
    在修改配置后,运行:

    bash

    复制

    sudo nginx -t
    sudo systemctl reload nginx
  6. 验证请求
    使用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

如何检查权限?

  1. 检查文件/目录的权限

    bash

    复制

    ls -la /home/hqu/data/new_mh_other/
    • 确保 test.html 和 index.html 的权限是 644-rw-r--r--)。

    • 确保整个目录的权限是 755drwxr-xr-x)。

  2. 检查 Nginx 运行用户

    bash

    复制

    ps aux | grep nginx
    • 通常 Nginx 以 www-data 或 nginx 用户运行(取决于 Linux 发行版)。

  3. 检查目录的所有者

    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/

测试是否修复

  1. 重新加载 Nginx

    bash

    复制

    sudo nginx -t  # 检查配置是否正确
    sudo systemctl reload nginx
  2. 再次访问

    bash

    复制

    curl http://localhost:8081/New_mh_other/test.html
    • 如果仍然失败,检查 Nginx 错误日志:

      bash

      复制

      tail -f /var/log/nginx/error.log

总结

✅ 确保权限正确

  • 目录:755drwxr-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 可能无法访问某些文件或目录。以下是具体分析:


问题分析

  1. Nginx 运行用户
    Nginx 默认以 www-data 或 nginx 用户运行,而你的文件/目录属于 hqu:wheel,Nginx 可能没有权限访问。

  2. 文件权限问题

    • 目录权限drwxr-xr-x(755)✅(Nginx 可以进入目录)

    • 文件权限

      • test.html-rw-r--r--(644)✅(Nginx 可以读取)

      • 但其他文件(如 index.html、JS/CSS 等)权限是 -rwxr-xr-x(755),多余的执行权限(文件通常不需要 x 权限)。

  3. 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/

验证修复

  1. 重新加载 Nginx

    bash

    复制

    sudo nginx -t && sudo systemctl reload nginx
  2. 测试访问

    bash

    复制

    curl http://localhost:8081/New_mh_other/test.html
  3. 检查错误日志

    bash

    复制

    tail -f /var/log/nginx/error.log

总结

✅ 关键修复点

  1. 文件权限改为 644(去掉多余的 x 权限)。

  2. 确保 Nginx 用户(如 www-data)有访问权限。

  3. 如果是 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)

  • 如果文件权限是 644r-- 对其他用户),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


原因分析

  1. Nginx 默认用户可能不同

    • 在 CentOS/RHEL 系统中,Nginx 默认用户通常是 nginx:nginx

    • 在 Debian/Ubuntu 系统中,Nginx 默认用户是 www-data:www-data

    • 你的系统可能是 OpenEuler,Nginx 可能使用其他用户(如 nginx 或 httpd)。

  2. www-data 用户不存在

    • 运行 id www-data 或 getent passwd www-data 检查用户是否存在:

      bash

      复制

      id www-data
      • 如果返回 no such user,说明 www-data 未创建。


解决方案

方法 1:使用正确的 Nginx 用户(推荐)

  1. 查找 Nginx 实际运行的用户

    bash

    复制

    ps aux | grep nginx
    • 输出示例:

      复制

      nginx   12345 ... nginx: worker process

      => 这里 nginx 就是运行用户。

  2. 修改文件所有者为 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 {} \;

⚠️ 注意:此方法安全性较低,仅适用于测试环境。


验证修复

  1. 检查文件权限

    bash

    复制

    ls -la /home/hqu/data/new_mh_other/
    • 确保文件权限是 644,目录权限是 755

  2. 测试 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 输出可以看出:

关键信息

  1. Nginx Master 进程 以 root 用户运行(这是正常的,Nginx 主进程需要 root 权限绑定端口)。

  2. 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)运行:

  1. 创建 nginx 用户(如果不存在):

    bash

    复制

    sudo groupadd nginx
    sudo useradd -g nginx nginx
  2. 修改 Nginx 配置/usr/local/nginx/conf/nginx.conf):

    nginx

    复制

    user nginx nginx;
  3. 重启 Nginx

    bash

    复制

    sudo systemctl restart nginx
  4. 修改文件所有者

    bash

    复制

    sudo chown -R nginx:nginx /home/hqu/data/new_mh_other/

验证修复

  1. 检查权限

    bash

    复制

    ls -la /home/hqu/data/new_mh_other/
    • 确保文件权限是 644,目录权限是 755

  2. 测试访问

    bash

    复制

    curl http://localhost:8081/New_mh_other/test.html
  3. 查看 Nginx 错误日志

    bash

    复制

    tail -f /var/log/nginx/error.log

总结

问题解决方案
Nginx Worker 用户是 nobodysudo 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--
目录权限755drwxr-xr-x
Nginx Worker 用户nobody(由 ps aux 确认)

为什么应该能正常工作?

  1. 文件权限 644

    • nobody(所有者)可读写,其他用户(包括 Nginx Worker)可读 → Nginx 能读取文件

  2. 目录权限 755

    • nobody 可进入目录,其他用户可进入并列出文件 → Nginx 能访问目录内容

  3. SELinux 已排除

    • 你之前执行过 setenforce 0(临时关闭 SELinux),排除了 SELinux 干扰。


如果仍然无法访问,可能的原因

  1. 父目录权限问题

    • 检查 /home/hqu/data/ 的权限:

      bash

      复制

      ls -ld /home/hqu/data/
      • 需要至少 755drwxr-xr-x),否则 Nginx 无法进入 new_mh_other/

  2. Nginx 配置错误

    • 检查是否还有其他 location 规则覆盖了 /New_mh_other

      bash

      复制

      grep -r "New_mh_other" /usr/local/nginx/conf/
  3. 文件路径大小写问题

    • 确保 URL 中的路径大小写与磁盘路径完全一致(Linux 区分大小写):

      bash

      复制

      curl http://localhost:8081/New_mh_other/test.html  # 注意大小写
  4. Nginx 缓存或浏览器缓存

    • 尝试强制刷新或使用 curl 测试:

      bash

      复制

      curl -v http://localhost:8081/New_mh_other/test.html

终极排查步骤

  1. 检查 Nginx 错误日志

    bash

    复制

    tail -f /var/log/nginx/error.log
    • 观察访问时的具体报错。

  2. 手动模拟 Nginx 用户访问文件

    bash

    复制

    sudo -u nobody cat /home/hqu/data/new_mh_other/test.html
    • 如果成功,说明权限无问题,问题在 Nginx 配置。

  3. 简化测试

    • 在 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

总结

✅ 当前权限已正确,但若仍无法访问,请按以下顺序排查:

  1. 检查父目录权限(/home/hqu/data/)。

  2. 查看 Nginx 错误日志。

  3. 验证 Nginx 配置是否有冲突规则。

  4. 测试其他文件(如 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 区分大小写)。


验证修复

  1. 修改配置后检查语法

    bash

    复制

    sudo nginx -t
  2. 重载 Nginx

    bash

    复制

    sudo systemctl reload nginx
  3. 测试访问

    bash

    复制

    curl -v http://localhost:8081/New_mh_other/test.html

关键区别:root vs alias

指令路径拼接方式示例(location /path
rootroot路径 + 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仍然报权限错误。这通常涉及更深层次的权限问题。以下是系统化的解决方案:

终极解决方案(分步操作)

  1. 验证父目录权限链

    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
  2. 检查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/
  3. 验证Nginx实际权限

    bash

    复制

    sudo -u nobody stat /home/hqu/data/new_mh_other/test.html

    如果报错,说明存在隐藏权限限制

  4. 检查文件系统挂载选项

    bash

    复制

    mount | grep /home

    如果包含noexecnosuid,需要修改/etc/fstab后重启

  5. 临时完全放权测试

    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 {} \;
  6. Nginx调试模式
    在配置中添加:

    nginx

    复制

    error_log /var/log/nginx/error.log debug;

    然后观察详细错误:

    bash

    复制

    tail -f /var/log/nginx/error.log

关键检查点

检查项正确配置验证命令
文件权限644ls -l
目录权限755ls -ld
所有者nobody:nobodyls -n
SELinuxhttpd_sys_content_tls -Z
父目录权限链至少+xnamei -l
文件系统选项无noexecmount

最终建议方案

  1. 执行完整权限修复:

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 {} \;
  1. 使用增强型日志检查:

bash

复制

sudo strace -f -o /tmp/nginx.strace -p $(pgrep -f 'nginx: worker')
  1. 如果仍失败,考虑:

  • 将项目移动到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 无法进入目录。

  • **目录必须至少 755drwxr-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. 总结

问题原因解决方案
文件所有者不是 nobodysudo 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 路径

✅ 推荐做法

  1. 将网站文件移到 /var/www/(标准目录)。

  2. 确保权限是 755(目录) + 644(文件)。

  3. 检查 SELinux 或 AppArmor 是否阻止访问。

现在你应该明白为什么最初没有权限,以及如何正确设置权限了! 🎉

777 = rwxrwxrwx(所有者、组、其他用户均可读、写、执行)。 这个执行跟读写是什么关系,什么叫执行

Linux 文件权限详解:r(读)、w(写)、x(执行)的关系

在 Linux 中,每个文件和目录都有 3 种权限,分别针对 3 类用户

  • 所有者(Owner)所属组(Group)其他用户(Others)

  • 权限用 rwx 表示,对应:

    • r = 读(Read)

    • w = 写(Write)

    • x = 执行(Execute)


1. rwx 对文件的含义

(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. 为什么最初上传的文件没权限?

  1. 文件所有者是 hqu,但 Nginx 以 nobody 运行

    • nobody 属于“其他用户”,需要文件有 r--4)权限。

  2. 目录缺少 x 权限

    • 即使文件是 644,如果父目录没有 x,Nginx 无法进入目录。

  3. SELinux 限制(仅限 RHEL/CentOS)

    • 即使权限正确,SELinux 可能阻止非标准目录的访问。


4. 总结

权限文件(如 .html目录(如 /home/hqu/data
r可读内容可列出文件(ls
w可修改内容可创建/删除文件
x可执行(仅脚本/程序)可进入目录(必须!)

Nginx 所需的最小权限

  • 目录755drwxr-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. 基本权限

符号数字含义
r4读(Read)
w2写(Write)
x1执行(Execute)

2. 特殊权限(高级)

符号数字含义
s4SetUID/SetGID(执行时临时切换用户/组)
t1粘滞位(Sticky Bit),仅目录可用

三、常见权限组合

1. 文件权限

数字符号适用场景
644-rw-r--r--普通文件(如 .html.txt
755-rwxr-xr-x可执行文件(如 .sh, 二进制程序)
600-rw-------私有文件(仅所有者可读写)
664-rw-rw-r--组内共享文件(所有者+组可写)

2. 目录权限

数字符号适用场景
755drwxr-xr-x常规目录(其他人可读但不可写)
775drwxrwxr-x协作目录(组内成员可写)
700drwx------私有目录(仅所有者可访问)
1777drwxrwxrwt临时共享目录(粘滞位,防删除他人文件)

四、权限对文件和目录的不同作用

1. 对文件的影响

权限作用
r读取文件内容(catless
w修改文件内容(echovim
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

六、权限计算规则

数字权限的由来

  • 将 rwx 分别对应 421,相加得到:

    • rw- = 4+2+0 = 6

    • r-x = 4+0+1 = 5

    • --- = 0+0+0 = 0

示例
-rwxr-xr-- = 7(所有者) + 5(组) + 4(其他人) = 754


七、最佳实践

  1. 文件默认权限

    • 普通文件:644(所有者可写,其他人只读)

    • 可执行文件:755

  2. 目录默认权限

    • 常规目录:755

    • 私有目录:700

  3. 危险权限

    • 避免 777(任何人可修改)

    • 慎用 SetUID(可能引发提权漏洞)


八、权限问题排查流程

  1. 检查当前权限:

    bash

    复制

    ls -l file.txt
  2. 验证父目录权限链:

    bash

    复制

    namei -l /path/to/file
  3. 检查 SELinux(如启用):

    bash

    复制

    ls -Z /path
    getenforce

掌握这些规则后,你可以精准控制 Linux 系统的文件访问安全! 🛡️

相关文章:

记录一次nginx访问前端首页,一直显示nginx首页问题(实际是nginx访问页面权限问题)

同一台服务器&#xff0c;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、命名管道双端通信&#xff08;异步&#xff09; 2、客户端断线重连 PS&#xff1a;多线程版本 PipeWrapper.h #include <windows.h> #include <string> #include <vector> #include "Utils/ThreadObject.h" #include "Utils/T…...

Linux自行实现的一个Shell(15)

文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…...

powerDesign 逆向 mysql 生成 物理模型,并用VBS脚本整理comment

学习自&#xff1a;https://www.cnblogs.com/xmyjcs/p/8536233.html 文章目录 Reverse Engineer格式化模型执行 VBS 脚本 Reverse Engineer 下面 DBMS 可以通过 ODBC&#xff08;Open Database Connectivity&#xff0c;开放数据库连接&#xff09;连接&#xff0c; 需要自己先…...

跨境全域中台:前端独立站群+后端共享云仓的协同作战体系

在全球化浪潮与互联网技术飞速发展的当下&#xff0c;跨境电商已然成为国际贸易领域中最为活跃的力量。据相关数据显示&#xff0c;过去几年跨境电商的年增长率持续保持高位&#xff0c;越来越多的企业投身于这片充满机遇与挑战的蓝海市场。在竞争日益激烈的跨境电商赛道上&…...

国产芯片解析:乐得瑞LDR6500C 超小封装全能芯片,赋能智能设备未来

LDR6500C是乐得瑞科技针对USB-C标准中的Bridge设备而开发的双USB-C DRP接口PD通信芯片&#xff0c;具备切换Data Role功能&#xff0c;支持最高USB PD 100W 充电&#xff0c;并且针对各大品牌设备的 USB-C 兼容性进行了特别优化&#xff0c;非常适合于 USB Type-C 设备快充转接…...

代码随想录-06-二叉树-05.10 二叉树的最小深度

二叉树的最小深度 #模板题 题目描述 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明叶子节点是指没有子节点的节点 具体思路&#xff08;暴力&#xff09; 层序遍历;找到cur.left null && cur.ri…...

系统与网络安全------网络通信原理(6)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 应用层解析 DNS Domain Name System&#xff0c;域名系统 用来完成域名与IP地址之间的映射&#xff0c;便于用户对网站的记忆和访问 端口号为TCP或UDP的53 DNS工作原理 FTP File Transfer Protocol 文件…...

【Vue #2】脚手架 指令

一、脚手架 脚手架&#xff1a;一个保证各项工作顺利开展的平台&#xff0c;方便我们 拿来就用&#xff0c;零配置 1. Vue 代码开发方式 相比直接 script 引入 vue 源码&#xff0c;有没有更好的方式编写vue代码呢? ① 传统开发模式&#xff1a; 基于html文件开发Vue&…...

UE5 后坐力枪口上抬和恢复

文章目录 计算后坐力并让视角上抬后坐力回落 计算后坐力并让视角上抬 在玩家蓝图里&#xff0c;声明一个方法OnShootOnce,在武器每次射击时调用 1检测新的后坐力是否超过了最大后坐力&#xff0c;并选择一个小的 2 如何将角色模型设置为相机的子物体 3 最后记录一下当前的…...

Mysql B+树高度如何计算?

MySQL 的 InnoDB 存储引擎使用 B+树 作为索引结构,其高度增加会直接影响查询性能(每次高度增加意味着多一次磁盘 I/O)。以下是 B+树高度增加的 关键场景 和 优化建议: 1. B+树高度增加的触发条件 (1) 数据量持续增长 根本原因:B+树的层级由数据量(记录数)和每个节点的容…...

UE5 使用贴花创建弹孔

文章目录 使用射线检测击中点在击中点处创建贴花 使用射线检测击中点 和untiy一样&#xff0c;发射一条射线&#xff0c;在命中点处创建弹孔 在武器里定义射击检测方法 以下是对上边使用的方法的展开 GetShootStartPosition:获取射击起点 computeShootEndPosition&#xff1a…...

程序持续内存泄漏问题定位参考

0 概括 本文用于记录 x86-Linux 应用程序发生持续性内存泄漏问题时的定位方法。主要介绍valgrind工具的应用。 1 原理 对于内存泄漏问题的定位&#xff0c;一种朴素的想法就是对内存申请点进行监控。对于一个内存申请调用点&#xff08;例如c/c中的malloc函数&#xff09;&a…...

Lumion 与 Enscape 怎么选?附川翔云电脑适配指南

建筑可视化领域&#xff0c;Lumion 和 Enscape 是两款主流实时渲染器&#xff0c;核心差异体现在操作逻辑、渲染特性及适用场景。结合川翔云电脑平台的硬件支持&#xff0c;可进一步优化使用体验。 一、核心差异&#xff1a;效率、操作与场景适配 1. 操作门槛与实时性 Lumio…...

WebShell详解:原理、分类、攻击与防御

目录 一、WebShell的定义与核心概念 二、WebShell的分类 三、WebShell的攻击原理与常见手法 1. 攻击原理 2. 常见攻击路径 四、WebShell的危害 五、防御与检测策略 六、总结 一、WebShell的定义与核心概念 ​​WebShell​​是一种以ASP、PHP、JSP等网页脚本形式存在的恶…...

Ubuntu 24.04 中文输入法安装

搜狗输入法&#xff0c;在Ubuntu 24.04上使用失败&#xff0c;安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况&#xff0c;是这个帖子里描述的&#xff1a; https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...

数码视讯TR100系列/TR100-G1/TR100-G4/数码视讯F7-国科GK6323V100C芯片-刷机固件包

数码视讯TR100系列&#xff0f;数码视讯TR100-G1&#xff0f;数码视讯TR100-G4&#xff0f;数码视讯F7-国科GK6323V100C芯片-刷机固件包 刷机教程&#xff1a; 里面共有两种方法&#xff0c;一是TTL线刷烧录方法&#xff1b;二是卡刷固件包&#xff1b; 下面以数码视讯TR100-…...

Cloudflare教程:免费优化CDN加速配置,提升网站访问速度 | 域名访问缓存压缩视频图片媒体文件优化配置

1、启用 Tiered Cache 缓存开关&#xff1a;通过选择缓存拓扑&#xff0c;可以控制源服务器与 Cloudflare 数据中心的连接方式&#xff0c;以确保缓存命中率更高、源服务器连接数更少&#xff0c;并且 Internet 延迟更短。 2、增加浏览器缓存时间TTL&#xff1a;在此期间&#…...

24体育NBA足球直播M24模板自适应板源码

源码名称&#xff1a;体育直播赛事扁平自适应M24直播模板源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 演示地址&#xff1a;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 中如&#xff1a; 实现&#xff1a;table数据表格中&#xff0c;点击删除按钮时&#xff0c;验证相同子订单号条数是否大于1&#xff0c;大于允许删除。保证数据表格中只有唯一的一条子订单号数据。 <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…...

什么是虚拟线程?与普通线程的区别

引言&#xff1a;线程的演进与挑战 在传统的并发编程中&#xff0c;线程是一种非常重要的概念。我们使用线程来实现任务的并发执行&#xff0c;从而提高程序的执行效率。普通线程&#xff08;如 Thread 类&#xff09;是一种重量级的线程&#xff0c;每个线程都对应着操作系统…...

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(开始日期&#xff0c;结束日期&#xff0c;日期时间类型)&#xff0c;返回两个日期之间的时间差 二、示例 开始日期结束日期度量值计算结果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 共有的类型转换&#xff1a; 自动类型转换&#xff08;隐式类型转换&#xff09;&#xff1a; 编译器在某些情况下会自动进行的类型转换。强制类型转换&#xff08;显示类型转换&#xff09;&#xff1a; 使用 (type)expression 或 type(expression) 语法进行…...

体验OceanBase的 并行导入功能

在数据库的日常使用中&#xff0c;会经常遇到以下场景&#xff1a; ‌数据复制‌&#xff1a;将一个或多个表中的数据复制到目标表中&#xff0c;可能是复制全部数据&#xff0c;也可能仅复制部分数据。数据合并&#xff1a;将数据从一个表转移到另一个表&#xff0c;或者将多…...

CSS的字体

在 CSS 中&#xff0c;字体&#xff08;font&#xff09;是网页设计中的一个重要部分&#xff0c;它控制了文本的外观和排版效果。通过设置不同的字体属性&#xff0c;我们可以使网页上的文字更具吸引力和可读性。以下是与字体相关的 CSS 属性及其用法&#xff1a; 1️⃣ font…...

开源模型应用落地-LangChain与MCP协议-集成GPT-4o构建下一代AI智能体的全栈实践(三)

一、前言 在人工智能技术快速迭代的今天,大型语言模型(LLM)如何高效集成外部工具与多模态能力,成为开发者面临的核心挑战。Anthropic推出的模型上下文协议(MCP)​通过标准化工具接口,为AI应用提供了“即插即用”的生态基础,而LangChain凭借其模块化设计,正成为连接LLM…...

Qt 5.14.2入门(一)写个Hello Qt!程序

目录 参考链接&#xff1a;一、新建项目二、直接运行三、修改代码增加窗口内容1、Qt 显示一个 QLabel 标签控件窗口2、添加按键 参考链接&#xff1a; Qt5教程&#xff08;一&#xff09;&#xff1a;Hello World 程序 Qt 编程指南 一、新建项目 1、新建一个项目&#xff08…...

FPGA_DDR(二)

在下板的时候遇到问题 1&#xff1a;在写一包数据后再读&#xff0c;再写再读 这时候读无法读出 查看时axi_arready没有拉高 原因 &#xff1a; 由于读地址后没有拉高rready,导致数据没有读出卡死现象。 解决结果...

思科交换机配置

以下是交换机配置的详细步骤指南&#xff0c;适用于Cisco交换机&#xff0c;其他品牌需调整命令&#xff1a; 1. 初始连接与基本配置 连接方式&#xff1a;使用Console线连接交换机&#xff0c;通过终端软件&#xff08;如PuTTY&#xff09;登录。波特率&#xff1a;9600&…...

单链表——C语言实现

目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法&#xff1a;tail ! NULL 总结&#xff1a; 正确代码物理图解&#xff1a; (2) 尾插整体代码 (思考…...

PostgreSQL插件生态全景解析:赋能数据库的无限可能

PostgreSQL以其开放的扩展生态闻名于世&#xff0c;其插件机制如同瑞士军刀般灵活&#xff0c;能够在不修改核心代码的前提下实现功能无限延伸。本文将基于多年内核开发经验&#xff0c;深度剖析PostgreSQL插件生态体系&#xff0c;为架构师与开发者提供全景式技术选型参考。 一…...

minio提供nfs服务

minio提供nfs服务 挂载minio为本地目录开机自动挂载使用supervisor实现开机自动挂载服务单元实现开机自动挂载minio为本地目录---失败 调试 挂载minio为本地目录 使用 Minio 作为后端存储&#xff0c;并通过 NFS 为客户端提供访问&#xff0c;那么你需要一个中间层来将 Minio …...

QML中的信号与槽机制

QML 中的信号与槽机制是 Qt 框架的核心特性之一&#xff0c;它提供了一种对象间通信的强大方式。与 C 中的信号槽类似&#xff0c;但语法更加简洁。 基本概念 1. 信号 (Signal) 当某个特定事件发生时由对象自动发出的通知 例如&#xff1a;按钮被点击时发出的 clicked 信号 …...

使用 Ktor 构建现代 Android 应用的后端服务

使用 Ktor 构建现代 Android 应用的后端服务 前言 在移动互联网时代&#xff0c;Android 应用对后端服务的实时性与性能要求越来越高&#xff0c;而传统的后端框架在一些场景中存在复杂度高、扩展性不足等问题。Ktor 作为 JetBrains 推出的异步 Web 框架&#xff0c;充分利用…...

leetcode_454. 四数相加 II_java

454. 四数相加 IIhttps://leetcode.cn/problems/4sum-ii/ 1、题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] …...

类名与协议名相同,开发中应该避免吗?

在 Objective-C 开发中&#xff0c;协议与实现类之间的命名关系非常重要。虽然语言允许协议名和类名相同&#xff0c;但从可读性和维护性等角度出发&#xff0c;这种做法并不推荐。本文通过一个典型示例展开分析&#xff0c;并提供更合理的命名建议。 一、示例 在某项目中&…...

环信鸿蒙版 UIKit 快速上手指南

环信鸿蒙版 UIKit 是专为 HarmonyOS 开发者设计的 IM UI 组件库&#xff0c;基于环信 IM SDK 开发&#xff0c;可帮助开发者快速集成即时通讯功能。 环信UIKit 的特点 ArkUI 声明式开发范式&#xff1a;采用高效简洁的声明式开发方式状态管理 V2&#xff1a;支持深度观测和精…...

编译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

前言&#xff1a;高德的定位sdk可以获取设备当前的详细信息&#xff0c;如经纬度&#xff0c;具体地址&#xff08;省->街道&#xff09;等&#xff0c; 本文主要使用的是定位sdk和地图sdk中的poi搜索功能&#xff08;以当前位置半径多少米内的关键词搜索&#xff09; 目录…...

JavaScript浅拷贝与深拷贝

目录 浅拷贝&#xff08;Shallow Copy&#xff09; 一、浅拷贝的定义 二、直接赋值 vs 浅拷贝 1. 直接赋值 2. 浅拷贝 三、数组的浅拷贝方法 1. slice() 2. concat() 3. 扩展运算符&#xff08;...&#xff09; 四、对象的浅拷贝方法 1. Object.assign() 2. 扩展运…...

智能生态之城-广东茂名

故事摘要 在中国广东茂名的未来社区&#xff0c;晨光中&#xff0c;垂直果园里发光的荔枝与智能无人机的早餐派送唤醒了城市的生活。在海底透明隧道的图书馆里&#xff0c;孩子们通过声控设备与虚拟生物互动。面对暴雨来临时&#xff0c;市民们积极参与到荔枝蜜饯制作和雨季造林…...

【Android】Android Activity 横屏设置详解及常见异常问题解决方法汇总

在 Android 开发中&#xff0c;我们经常需要控制 Activity 的屏幕方向&#xff0c;例如视频播放、游戏、VR/AR 应用等场景通常希望默认横屏显示。本文将讲解如何通过 Manifest 配置 和 Java/Kotlin 代码 设置横屏显示&#xff0c;并分析常见设置无效的原因与解决方法。 一、通过…...

Android 存储路径

​​一、内部存储路径&#xff08;Internal Storage&#xff09;​​ ​​stats.codeSize&#xff08;内部代码大小&#xff09;​​ ​​路径​​&#xff1a;/data/app/com.example.test-{随机后缀}/base.apk ​​说明​​&#xff1a;APK 安装路径&#xff0c;包含应用代码…...

【12】数据结构之基于线性表的排序算法

目录标题 插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 归并排序时间复杂度对比最好情况平均情况最坏情况 空间复杂度对比 插入排序 基本思想&#xff1a;将一个元素插入到一个有序序列中&#xff0c;继而得到一个有序的元素个数加一的新序列. 直接插…...

解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题

要解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题&#xff0c;可以使用自定义的LinearSmoothScroller&#xff0c;使其底部对齐屏幕。步骤如下&#xff1a; 创建自定义的SmoothScroller类&#xff1a; 继承LinearSmoothScroller并重写getVerti…...

数字世界的免疫系统:恶意流量检测如何守护网络安全

在2023年全球网络安全威胁报告中,某跨国电商平台每秒拦截的恶意请求峰值达到217万次,这个数字背后是无数黑客精心设计的自动化攻击脚本。恶意流量如同数字世界的埃博拉病毒,正在以指数级速度进化,传统安全防线频频失守。这场没有硝烟的战争中,恶意流量检测技术已成为守护网…...

十分钟机器学习之--------------线性回归

线性回归&#xff08;linear regression&#xff09;是一种基于数学模型的算法&#xff0c;首先假设数据集与标签之间存在线性关系&#xff0c;然后简历线性模型求解参数。在实际生活中&#xff0c;线性回归算法因为其简单容易计算&#xff0c;在统计学经济学等领域都有广泛的应…...