我正在通过 SSH 将一些远程摄像头隧道传输到 VPS。我希望能够通过 URL 传递端口号,然后 nginx 将其代理到 localhost:'该端口'。
大致如下:
http://test.doman.com/1234/ -> localhost:1234/something/
我发现一个非常相似的问题,但我无法理解它并根据我的需要进行修改。
更新:
我尝试以多种方式修改示例(下面是一种更有意义的示例)但每次我尝试 curl 时,我都会得到第 500 页而不是所需的端口。
server {
listen 80;
server_name my.domain.com;
location ~ ^/cam/([0-9]+)$ {
set $port $1;
proxy_pass http://localhost:$port/cgi-bin/mjpg/video.cgi?channel=1&subtype=1;
}
}
更新2
显然我的规则配置是正确的(重写整个 nginx.conf 以确保万无一失),但我仍然收到 502 Bad Gateway 消息。我可以从外部服务器 curl localhost:8080,它到达我的相机页面,但我无法使用 nginx 重定向它。
http {
server {
listen 80;
root /var/www/;
location ~ ^/cam/([0-9]+) {
set $port_num $1;
# Debug my variable
#return 200 $port_num;
proxy_pass http://localhost:$port_num;
}
}
}
events { }
更新 3
我确实查看了日志文件(感谢您的建议),并注意到 NGINX 无法解析本地主机(???)。
2020/10/07 13:53:39 [error] 1997#1997: *4 no resolver defined to resolve localhost, client: 127.0.0.1, server: , request: "GET /cam/8080 HTTP/1.1", host: "localhost"
我将 localhost 字符串替换为 127.0.0.1,然后重试。这次我从 curl 收到 404 消息,但日志中没有错误。
<html><body><h1>404 Not Found</h1></body></html>
答案1
好吧。我希望这个例子对某些人有帮助。
location ~ ^/cam/([0-9]+)/ {
set $port_num $1;
proxy_pass http://localhost:$port_num/;
}
如果您对那里发生的事情感到困惑(就像我之前读文档时一样),该位置使用正则表达式来查找以 /cam/ 开头的任何内容(在 URL 之后)并获取其后的内容(告诉([0-9]+)
nginx 仅获取其数字,字符串将转到 404)。允许set
创建一个变量(只是为了使事情更清楚)并且 proxy_pass 重定向 URL。