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
相关产品推荐
相关产品推荐

