Nginx为IP摄像头配置反向代理硬编码URL参数失败求助
问题原因排查
首先你Nginx启动失败的核心原因是配置文件中使用了HTML转义字符"代替了正常的英文双引号",Nginx配置解析器无法识别这种转义格式,直接抛出语法错误导致启动失败。
另外你当前配置还有两个隐性问题会导致即使启动成功也无法正常访问摄像头:
- 你设置了
proxy_set_header Host $host,会将Nginx服务器的域名/IP作为Host头转发给摄像头,大部分IP摄像头会校验Host头和自身IP是否一致,不一致会直接拒绝访问 - 如果你用Authorization头的方式,
Basic后面的内容需要是用户名:密码字符串经过Base64编码后的结果,不能随便填写占位符
正确配置方案
方案1:直接在proxy_pass中写入凭证和参数(最简方案)
不需要额外配置Authorization头,Nginx会自动将proxy_pass URL中携带的用户名密码转换为对应的基础认证头,修改你的server块为以下内容:
server { listen 56700; location / { # 后端摄像头需要的Host头设为摄像头自身IP proxy_set_header Host 172.16.0.38; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 完整写入摄像头访问路径、参数和认证信息 proxy_pass http://username:password@172.16.0.38/cgi-bin/mjpg/video.cgi?channel=1&subtype=1; } }
方案2:使用Authorization头显式配置认证
如果不想将明文凭证写在proxy_pass中,可以先将你的用户名:密码字符串做Base64编码,比如用户名是admin密码是123456,执行命令echo -n "admin:123456" | base64得到编码结果,再填入配置:
server { listen 56700; location / { proxy_set_header Host 172.16.0.38; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 替换为你自己的用户名密码生成的Base64编码值 proxy_set_header Authorization "Basic 这里替换为你的Base64编码结果"; proxy_pass http://172.16.0.38/cgi-bin/mjpg/video.cgi?channel=1&subtype=1; } }
配置生效步骤
修改完成后先执行配置校验命令:nginx -t
如果输出test is successful,再执行重载命令生效:nginx -s reload
即可正常访问http://nginx-server:56700获取摄像头流。
内容的提问来源于stack exchange,提问作者Kermit
相关产品推荐
相关产品推荐

