Debian9下Nginx1.10仅外部访问报HTTP403,局域网内正常
排查外部域名访问Nginx出现403错误的步骤
先别急着认定是ISP端口转发的问题,咱们一步步来排查,先把本地可能的问题排除干净:
1. 检查Nginx Server块的server_name配置
你局域网内用poseidon或本地IP能正常访问,大概率是你的Nginx站点配置里的server_name没包含外部域名。打开你的站点配置文件(一般在/etc/nginx/sites-available/mysite或者/etc/nginx/sites-enabled/mysite),找到server块里的server_name指令,确保它包含了www.open-si.org和open-si.org,比如:
server_name poseidon 192.168.x.x www.open-si.org open-si.org;
修改后记得重启Nginx:systemctl restart nginx,再试试用外部域名访问。
2. 核对文件与目录权限
虽然局域网访问正常,但还是要确认Nginx运行用户(默认是www-data)对/home/www/mysite目录和index.php有读取权限:
- 查看目录权限:
ls -ld /home/www/mysite,确保权限至少是755(所有者读/写/执行,组和其他读/执行) - 查看文件权限:
ls -l /home/www/mysite/index.php,确保权限至少是644(所有者读/写,组和其他读)
如果权限不对,用下面的命令修正:
chmod 755 /home/www/mysite chmod 644 /home/www/mysite/index.php chown -R www-data:www-data /home/www/mysite
3. 查看Nginx错误日志找具体原因
这是排查403最有效的方法!打开Nginx的错误日志(默认路径/var/log/nginx/error.log),搜索最近的403相关记录,日志会明确告诉你出错原因:
- 如果是
directory index of "/home/www/mysite/" is forbidden:检查server块里的index指令是否包含index.php,比如index index.php index.html; - 如果是
permission denied:就是上面的权限问题没解决 - 如果是
no suitable server found:就是server_name没匹配上外部域名
4. 排查ISP端口转发及公网连通性
如果上面的本地排查都没问题,再聚焦到外网端口转发:
- 确认路由器端口转发规则:登录你的路由器管理后台,检查是否把外部80端口(HTTP)转发到了
poseidon的局域网IP(比如192.168.1.100)的80端口,协议要选TCP。 - 检测公网端口是否可达:用手机断开WiFi(用移动数据)访问
http://open-si.org,或者在一台外网机器上执行curl -I http://open-si.org,如果连不上,可能是:- 路由器端口转发配置错误
- 你的ISP封禁了80端口(很多家用宽带会封80端口防止个人建站),这种情况可以尝试改用8080端口,修改Nginx监听端口为8080,同时在路由器转发8080端口,访问时用
http://open-si.org:8080测试。
- 确认域名解析正确性:执行
nslookup open-si.org和nslookup www.open-si.org,看返回的IP是不是你的公网IP,如果解析到了错误的IP,需要去域名服务商那里修正解析记录。
内容的提问来源于stack exchange,提问作者Emmanuel BRUNET
相关产品推荐
相关产品推荐

