Nginx 访问静态资源报错404 Not Found 的问题解决过程

本文详细介绍了如何排查和修复静态资源访问时出现的404错误,通过调整iptables配置,解决了因多余OUTPUT记录导致的HTTP请求被拒绝的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

 

 

1、静态资源访问报错404:

[nginx@dev_121_21 tmp]$ wget  http://bsstatic.powerlong.com/commonStatic/css/merchant_patch.css

 

--2016-11-22 18:18:28--   http://bsstatic.powerlong.com/commonStatic/css/merchant_patch.css

 

正在解析主机 bsstatic.powerlong.com... 192.168.121.91

 

正在连接 bsstatic.powerlong.com|192.168.121.91|:80... 已连接。

 

已发出 HTTP 请求,正在等待回应... 404  Not Found

 

2016-11-22 18:18:28 错误 404:Not Found。

 

 

 

[nginx@dev_121_21 tmp]$

 

telnet端口是OK的

[root@dev_121_21 ~]# telnet  bsstatic.powerlong.com 80

 

Trying 192.168.121.91...

 

Connected to bsstatic.powerlong.com.

 

Escape character is '^]'.

 

 

 

 

 

2、查看iptables状态,有多余的output记录

[root@dev_121_21 ~]# service iptables  status

 

表格:nat

 

Chain PREROUTING (policy ACCEPT)

 

num   target     prot opt source               destination        

 

1     REDIRECT   tcp  --   0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8081

 

 

 

Chain POSTROUTING (policy ACCEPT)

 

num   target     prot opt source               destination        

 

 

 

Chain OUTPUT (policy ACCEPT)

 

num   target     prot opt source               destination        

 

1     REDIRECT   tcp  --   0.0.0.0/0             127.0.0.1           tcp dpt:80  redir ports 8081

 

2     REDIRECT   tcp  --   0.0.0.0/0            127.0.0.1           tcp dpt:80 redir ports 8081

 

3     REDIRECT   tcp  --   0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8081

 

 

 

[root@dev_121_21 ~]#

 

 

 

3、删除配置文件,多余的2条OUTPUT记录,保持一条配置记录,如下所示

[root@dev_121_21 ~]# vim  /etc/sysconfig/iptables

 

 

 

# Generated by iptables-save v1.4.7 on  Tue Nov 22 12:34:48 2016

 

*nat

 

:PREROUTING ACCEPT [22:1583]

 

:POSTROUTING ACCEPT [6:326]

 

:OUTPUT ACCEPT [6:326]

 

-A PREROUTING -p tcp -m tcp --dport 80 -j  REDIRECT --to-ports 8081

 

-A OUTPUT -d 127.0.0.1/32 -p tcp -m tcp  --dport 80 -j REDIRECT --to-ports 8081

 

COMMIT

 

# Completed on Tue Nov 22 12:34:48 2016

 

 

 

4、然后重启iptables服务

重启iptables服务

[root@dev_121_21 ~]# service iptables restart

 

iptables:清除防火墙规则:                                 [确定]

 

iptables:将链设置为政策 ACCEPT:filter nat                [确定]

 

iptables:正在卸载模块:                                   [确定]

 

iptables:应用防火墙规则:                                 [确定]

 

[root@dev_121_21 ~]#

 

 

然后查看iptables状态,只有一条REDIRECT记录存在:

[root@dev_121_21 ~]# service iptables  status

 

表格:nat

 

Chain PREROUTING (policy ACCEPT)

 

num   target     prot opt source               destination        

 

1     REDIRECT   tcp  --   0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8081

 

 

 

Chain POSTROUTING (policy ACCEPT)

 

num   target     prot opt source               destination        

 

 

 

Chain OUTPUT (policy ACCEPT)

 

num   target     prot opt source               destination        

 

1     REDIRECT   tcp  --   0.0.0.0/0            127.0.0.1           tcp dpt:80 redir ports 8081

 

 

 

[root@dev_121_21 ~]#

 

 

 

 

5、再尝试下,wget下载,可以wget成功了

[root@dev_121_21 ~]#  wget  http://bsstatic.powerlong.com/commonStatic/css/merchant_patch.css

 

--2016-11-22 18:27:52--   http://bsstatic.powerlong.com/commonStatic/css/merchant_patch.css

 

正在解析主机 bsstatic.powerlong.com... 192.168.121.91

 

正在连接 bsstatic.powerlong.com|192.168.121.91|:80... 已连接。

 

已发出 HTTP 请求,正在等待回应... 200 OK

 

长度:18298 (18K) [text/css]

 

正在保存至: “merchant_patch.css”

 

 

 

100%[====================================================================================================================================================================================================================================>]  18,298      --.-K/s   in 0s      

 

 

 

2016-11-22 18:27:52 (77.6 MB/s) - 已保存 “merchant_patch.css” [18298/18298])

 

 

总结:telnet能进nginx的80端口,但是HTTP请求访问拒绝,而nginx服务正常启动的情况下,一般就要查看下iptables端口转发,90%的问题都是因为iptables配置引发的。

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

<think>我们正在处理用户关于Docker中Nginx容器的问题,用户提到两个可能的问题:容器命名错误和404NotFound错误。同时用户提供了Nginx版本为1.27.4。根据之前的对话历史,用户已经遇到了容器命名无效字符的错误,并且也引用了挂载配置可能出现的问题。现在用户想排查Nginx容器相关问题。我们需要分两部分来排查:第一部分:容器命名无效字符的问题(根据之前的错误)第二部分:Nginx404NotFound错误首先,回顾用户提供的引用:引用[1]:展示了如何停止Nginx容器,编辑nginx.conf,然后重新启动。但要注意,如果容器是通过挂载配置的,修改宿主机的配置文件即可。引用[2]:显示容器名称冲突,即尝试使用已存在的容器名称。解决方案是删除或重命名现有容器。引用[3]:展示了正确的挂载命令,将宿主机的目录和文件挂载到容器中。注意路径的写法,不能使用相对路径(如一个点),要使用绝对路径。引用[4]:特别强调了挂载路径不能使用相对路径(如./nginx.conf),而应该使用绝对路径,否则会报错。引用[5]:提到了挂载失败,命令和路径看起来正确,但访问不了。现在用户的问题可能包括:1.容器名称使用了非法字符(如空格、特殊字符等)导致无法启动。2.配置错误(比如挂载路径问题,或者nginx.conf配置错误)导致404错误。步骤:1.解决容器命名问题(确保容器名称合法,并且不冲突)2.检查Nginx配置,特别是挂载的配置文件是否正确,以及挂载的静态资源路径是否正确。由于用户提到了Nginx版本1.27.4,我们假设用户已经拉取了正确的镜像。第一部分:容器命名规则:只允许[a-zA-Z0-9][a-zA-Z0-9_.-]字符,长度2-64,不能以单独的数字或保留字作为名字。第二部分:404错误可能的原因:-挂载的目录不正确,导致Nginx无法找到资源文件(比如index.html)-nginx.conf中配置的root路径不正确(没有指向挂载的目录)-挂载时文件权限问题我们将按照以下步骤来指导用户:步骤1:检查容器命名如果用户有命名问题,按照之前给出的规则重新命名。步骤2:检查挂载命令确保挂载命令使用绝对路径,并且宿主机的目录存在。步骤3:检查nginx.conf配置文件查看配置文件中的root路径是否与容器内的挂载路径一致。步骤4:检查挂载的静态资源确保宿主机上的静态资源文件(如index.html)存在于挂载的目录中。步骤5:检查Nginx容器的日志,以获取更多错误信息。现在,根据以上思路,我们给出详细回答。</think> ### 完整排查指南:Nginx容器命名与404错误解决方案 --- #### 🔍 **问题1:容器命名无效字符错误** **错误原因**:容器名称包含非法字符(空格、冒号等) ```bash docker: Error response from daemon: Invalid container name (nginx:latest) ``` **解决方案**: 1. **移除非法字符**:将`:`改为`-`或`_` ```bash # 错误命名 ❌ docker run --name "nginx:latest" ... # 正确命名 ✅ docker run --name nginx_latest -d -p80:80 nginx:1.27.4 ``` 2. **检查现有冲突容器**: ```bash docker ps -a | grep nginx # 查看同名容器[^2] docker rm -f 容器ID # 强制删除冲突容器 ``` --- #### 🌐 **问题2:Nginx 404 Not Found错误** **常见原因及解决方案**: 1. **挂载路径错误**(主要问题) ```bash # 错误:使用相对路径 ❌[^4] -v ./html:/usr/share/nginx/html # 正确:使用绝对路径 ✅[^3][^4] -v /home/user/web/dist:/usr/share/nginx/html ``` 2. **文件权限问题**: ```bash chmod -R 755 /home/user/web/dist # 确保Nginx有读取权限 ``` 3. **配置文件错误**: ```nginx # nginx.conf 关键检查点 server { listen 80; # 确认root路径与挂载路径一致 ✅ root /usr/share/nginx/html; location / { try_files $uri $uri/ /index.html; } } ``` 4. **端口映射验证**: ```bash # 检查映射关系(宿主机:容器) docker run -p 8080:80 ... # 访问 http://localhost:8080 netstat -tuln | grep 8080 # 确认端口监听 ``` --- #### 🛠️ **完整启动命令模板** ```bash docker run -d --name nginx_v1.27.4 \ -p 8080:80 \ -v /home/user/nginx.conf:/etc/nginx/nginx.conf \ -v /home/user/web/dist:/usr/share/nginx/html \ nginx:1.27.4 ``` --- #### 🔎 **调试步骤** 1. **查看容器日志**: ```bash docker logs --tail 100 容器名 ``` 2. **进入容器检查文件**: ```bash docker exec -it 容器名 bash ls -l /usr/share/nginx/html # 检查文件是否存在 nginx -t # 测试配置语法 ``` 3. **验证静态资源**: ```bash curl -I http://localhost:8080 # 预期返回:HTTP/1.1 200 OK ``` --- #### ⚠️ **版本注意事项** Nginx 1.27.4 默认配置路径: - 主配置:`/etc/nginx/nginx.conf` - 站点配置:`/etc/nginx/conf.d/default.conf` - 默认站点目录:`/usr/share/nginx/html` --- #### ❓ 常见Q&A 1. **为何挂载后仍返回404?** → 80%因路径大小写不一致(如`/Usr` vs `/usr`) 2. **容器启动成功但无法访问?** → 检查防火墙:`sudo ufw allow 8080/tcp`[^5] 3. **修改配置后不生效?** → 需重启容器:`docker restart 容器名` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值