You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Nginx访问指定目录文件出现404问题求助

问题描述

我希望将test.txt文件放置在/var/www/certbot目录下,通过公网地址http://www.example.com/.well-known/acme-challenge/test.txt访问该文件。已配置Nginx的location规则,并在docker-compose中挂载了对应目录,但访问时返回Nginx 404错误,且指定日志目录无错误日志生成。请问如何正确配置以公开该目录?

当前配置

Nginx配置

server {
    listen 80;

    server_name www.example.com;
    server_tokens off;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";

    error_log /var/log/nginx/sdr-fe-nginx-error.log info;
    access_log /var/log/nginx/sdr-fe-nginx-access.log;

    ignore_invalid_headers off;
    underscores_in_headers on;

    # Allow larger than normal headers
    large_client_header_buffers 4 64k;
    proxy_buffers         8 16k;  # Buffer pool = 8 buffers of 16k
    proxy_buffer_size     16k;    # 16k of buffers from pool used for headers
    

    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    } 
}

Docker Compose配置

nginx:
    environment:
      - TZ=Asia/Singapore
    image: nginx:latest
    ports:
      - 80:80
      - "443:443"
    restart: unless-stopped
    networks: 
    - ${NETWORK}
    volumes:
      - ./:/etc/nginx/conf.d
      - "/etc/timezone:/etc/timezone:ro"
      - "/etc/localtime:/etc/localtime:ro"
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
排查与修复步骤

1. 修正文件存放路径

Nginx的root指令会将location路径拼接在指定目录后,当前配置下,Nginx会去/var/www/certbot/.well-known/acme-challenge/找test.txt,而非直接读取/var/www/certbot/test.txt。

执行以下操作调整文件位置:

# 在宿主机创建对应子目录
mkdir -p ./data/certbot/www/.well-known/acme-challenge
# 将test.txt移入该目录
cp test.txt ./data/certbot/www/.well-known/acme-challenge/

2. 验证容器内文件权限

进入Nginx容器,确认文件存在且Nginx进程有读取权限:

# 替换<nginx-container-id>为实际容器ID或名称
docker exec -it <nginx-container-id> /bin/bash

# 检查文件是否存在
ls -l /var/www/certbot/.well-known/acme-challenge/test.txt

# 设置正确权限(Nginx通常以www-data用户运行)
chmod 644 /var/www/certbot/.well-known/acme-challenge/test.txt
chown -R www-data:www-data /var/www/certbot

3. 修复日志未生成问题

当前日志路径未挂载到宿主机,日志仅存于容器内部,重启后会丢失。修改Docker Compose的volumes部分,添加日志目录挂载:

volumes:
  # 保留原有挂载项
  - ./:/etc/nginx/conf.d
  - "/etc/timezone:/etc/timezone:ro"
  - "/etc/localtime:/etc/localtime:ro"
  - ./data/certbot/conf:/etc/letsencrypt
  - ./data/certbot/www:/var/www/certbot
  # 新增日志挂载
  - ./data/nginx/logs:/var/log/nginx

重启Nginx容器:

docker-compose restart nginx

4. 可选:调整Location规则简化路径

如果不想创建子目录,可将root替换为alias,让Nginx直接读取/var/www/certbot下的文件:

location /.well-known/acme-challenge/ {
    allow all;
    alias /var/www/certbot/;
}

注意alias末尾的斜杠必须保留,否则路径拼接会出错。

5. 验证配置有效性

重启容器后,访问目标URL,同时查看日志确认请求状态:

# 实时查看访问日志
tail -f ./data/nginx/logs/sdr-fe-nginx-access.log

# 实时查看错误日志
tail -f ./data/nginx/logs/sdr-fe-nginx-error.log

内容的提问来源于stack exchange,提问作者JianYA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:42:41