使用nginx搭建的文件服务器一直提示 404 Not Found ,是文件不存在还是没有权限?

文章讲述了如何使用Nginx搭建文件服务器,配置过程中遇到404错误,经排查发现与tmp目录权限及PrivateTmp设置有关,通过修改PrivateTmp为false解决了访问问题。

使用nginx搭建一个简单的文件服务器,配置如下

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 10;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    autoindex on;               # 显示目录
    autoindex_exact_size on;    # 显示文件大小
    autoindex_localtime on;     # 显示文件时间

    server {
        listen       6000 default_server;
        listen       [::]:6000 default_server;
        server_name  _;
        root         /tmp/;

        location / {
        }

        error_page 404 /404.html;
                location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
                location = /50x.html {
        }
    }
    include /etc/nginx/conf.d/*.conf;
}

配置完成后,启动nginx

service nginx restart

没有错误提示,服务正常启动,但是访问时出现了问题,
一直提示:

404 Not Found

通过观察日志发现并没有其他异常

2024/03/20 11:07:49 [error] 26641#26641: *1 "/tmp/index.html" is not found (2: No such file or directory), client: 192.168.0.0, server: _, request: "GET / HTTP/1.1", host: "192.168.0.1:6000"
2024/03/20 11:07:49 [error] 26641#26641: *1 open() "/tmp/404.html" failed (2: No such file or directory), client: 192.168.0.0, server: _, request: "GET / HTTP/1.1", host: "192.168.0.1:6000"
2024/03/20 11:07:49 [error] 26641#26641: *1 "/tmp/index.html" is not found (2: No such file or directory), client: 192.168.0.0, server: _, request: "GET / HTTP/1.1", host: "192.168.0.1:6000"
2024/03/20 11:07:49 [error] 26641#26641: *1 open() "/tmp/404.html" failed (2: No such file or directory), client: 192.168.0.0, server: _, request: "GET / HTTP/1.1", host: "192.168.0.1:6000"

各种检测和调试,发现设置目录为根目录/和其他目录正常,看来是和目录有关系,通过查看配置文件

 cat /usr/lib/systemd/system/nginx.service
 
 [Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true  # !!!

[Install]
WantedBy=multi-user.target

上面的PrivateTmp=true这说明这个服务使用到tmp目录是默认会创建一个私有的文件夹来使用,如果不想要使用,只需要把这个true设置为false就可以了,然后重启nginx,可以正常访问

<think>好的,用户现在的问题是文件都在,但Nginx配置导致无法正常下载,需要指导如何正确配置Nginx。首先,我需要回顾之前的对话,用户之前遇到了500错误,现在确认文件存在,所以重点在Nginx配置。 首先,用户的场景是搭建PyPI私有索引,Nginx作为Web服务器,需要正确配置`/simple/`路径,使得`pip`能通过该路径访问到包文件。用户的文件存储路径应该是`D:/FTP/ai/python_source/pypi_mirror/simple/包名/文件.whl`,所以Nginx的`root`需要指向`D:/FTP/ai/python_source/pypi_mirror`,这样`/simple/`路径会映射到该目录下的`simple`子目录。 接下来,需要考虑Nginx的`location`块配置。用户可能需要确保`location /simple/`正确设置,包括`root`、`autoindex`(如果需要自动生成目录列表)、字符集(避免文件名乱码)、以及可能的索引文件(如果手动维护`index.html`)。 然后,权限问题。Windows下Nginx服务可能需要读取文件权限,需要确认Nginx进程的运行账户是否有访问文件目录的权限。 另外,可能需要配置`charset`为UTF-8,防止文件名中的特殊字符乱码,导致`pip`无法解析链接。 还需要检查Nginx的监听端口(8777)是否正确,防火墙是否放行该端口,确保外部可以访问。 最后,测试配置是否正确,使用`nginx -t`检查语法,然后`nginx -s reload`重新加载配置,再通过浏览器或`curl`测试文件下载是否正常。 现在需要将这些点整理成步骤,确保用户能一步步配置正确。同时,要覆盖关键配置项,如`root`、`autoindex`、`charset`、权限等,并给出具体的配置示例。 </think>若文件已正确存储(如`D:/FTP/ai/python_source/pypi_mirror/simple/babel/babel-2.16.0-py3-none-any.whl`存在),需通过以下Nginx配置调整确保`pip`能正常下载文件: ### 一、核心配置项说明 以下是针对PyPI私有索引的Nginx配置模板,需重点关注`location /simple/`块的参数: ```nginx server { listen 8777; # 监听用户指定的端口(与pip命令中的端口一致) server_name _; # 任意主机名均可访问 # 字符集设置(关键!避免文件名乱码) charset utf-8; # 配置/simple/路径的文件访问 location /simple/ { # 根目录指向存储包的父目录(注意:/simple/会映射到root路径下的simple子目录) root D:/FTP/ai/python_source/pypi_mirror; # 启用自动目录列表(若未手动维护index.html时使用) autoindex on; autoindex_exact_size off; # 显示文件大小为可读格式(如KB/MB) autoindex_localtime on; # 显示文件修改时间为本地时间 # 若手动维护了包目录下的index.html(非必须),优先使用文件 index index.html; } # 错误日志(关键!排查问题的核心依据) error_log D:/nginx/logs/error.log warn; # 路径根据实际Nginx安装目录调整 } ``` ### 二、关键配置项解释 #### 1. `root`路径正确性 - **作用**:`root D:/FTP/ai/python_source/pypi_mirror;`表示请求路径`/simple/`会映射到服务器本地路径`D:/FTP/ai/python_source/pypi_mirror/simple/`。 - **验证**: 若请求`http://10.51.168.54:8777/simple/babel/babel-2.16.0-py3-none-any.whl`,Nginx会尝试读取: `D:/FTP/ai/python_source/pypi_mirror/simple/babel/babel-2.16.0-py3-none-any.whl`,需确保此路径与文件实际存储路径完全一致。 #### 2. `autoindex`自动目录列表(可选) - **启用场景**:若未在每个包目录(如`simple/babel/`)下手动创建`index.html`,需通过`autoindex on;`让Nginx自动生成包含文件链接的页面(`pip`依赖此页面发现文件)。 - **注意**:若手动维护了`index.html`(如用户之前提到的`<a href='...'>`链接),Nginx会优先使用`index.html`,否则使用自动生成的列表。 #### 3. `charset utf-8;`字符集(必配) - **作用**:确保文件名中的中文、特殊符号等在Nginx返回的页面中正确编码(如`absl_py-0.7.1`中的`_`会被转义为乱码)。 - **反例**:若未配置`charset utf-8`,Windows系统可能默认使用GBK编码,导致`pip`无法解析链接(如文件名含中文时返回`%E4%B8%AD%E6%96%87`等URL编码)。 #### 4. 权限配置(Windows必查) - **Nginx服务账户**:Windows下Nginx通常以`Local System`账户运行,但部分环境可能使用自定义账户。需确保该账户对文件目录`D:/FTP/ai/python_source/pypi_mirror/`有**读取权限**。 - **检查方法**: 右键目录 → 属性 → 安全 → 点击“编辑” → 添加`IIS_IUSRS`(若Nginx以IIS方式运行)或`SYSTEM`(Local System) → 勾选“读取”权限。 ### 三、配置验证步骤 1. **检查配置语法**: 在Nginx安装目录(如`D:/nginx/`)执行命令: ```bash nginx.exe -t # Windows # 或 ./nginx -t # Linux ``` 输出`configuration file ... test is successful`表示语法正确。 2. **重新加载配置**: 语法通过后,执行命令使配置生效: ```bash nginx.exe -s reload # Windows # 或 ./nginx -s reload # Linux ``` 3. **测试文件下载**: - **浏览器测试**:直接访问`http://10.51.168.54:8777/simple/babel/babel-2.16.0-py3-none-any.whl`,若浏览器开始下载文件,说明配置正确。 - **curl测试**(服务器本地): ```bash curl -O http://127.0.0.1:8777/simple/babel/babel-2.16.0-py3-none-any.whl ``` 若能成功下载文件,说明Nginx配置和文件路径均正确。 ### 四、常见问题补充 - **问题1**:浏览器访问返回403 Forbidden(拒绝访问)。 **原因**:Nginx进程无文件读取权限。 **解决**:检查目录权限,确保Nginx服务账户有“读取”权限。 - **问题2**:`pip`报404 Not Found文件未找到)。 **原因**:`root`路径配置错误(如将`root`指向了`D:/FTP/ai/python_source/pypi_mirror/simple`,导致实际路径变为`D:/FTP/ai/python_source/pypi_mirror/simple/simple/包名/文件`)。 **解决**:确保`root`指向包目录的父目录(即`simple`的上一级)。 ### 总结 核心是正确配置`root`路径、启用字符集和目录列表,并确保Nginx文件读取权限。通过`nginx -t`验证语法,再通过浏览器或`curl`测试下载即可确认配置是否生效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值