我正在使用SSH端口转发 – 如此精彩的插图和详细阐述 – 访问我的服务器。
我花了更多的时间,我想承认,解决为什么访问我的Python Web服务器404s。 全长问题在这里完成。
我的问题是,如果我使用端口转发直接将我的请求转发到Python服务器正在运行的端口(例如8282),所有的请求404。
Python服务器,为了简单起见(服务于一个index.html,包含stringhello ):
python -m http.server 8282
从主机的SSH端口转发,我想获得访问权限:
ssh -L 8181:<farawayhost-ip>:8282 <sshuser>@<remotehost-ip>
对于curl主机上的后续请求,我已经定义了环境variableshttp_proxy :
export http_proxy=127.0.0.1:8181
显然这些请求是不正确的,因为它们被IP地址所占用。 为了比较,这里是Python http.server日志,首先从服务器本地访问,然后从外部主机使用SSH端口转发。
Serving HTTP on 0.0.0.0 port 8282 ... <server-public-ip> - - [<timestamp>] "GET /index.html HTTP/1.1" 200 - <proxy-ip> - - [<timestamp>] code 404, message File not found <proxy-ip> - - [<timestamp>] "GET http://<server-public-ip>:8282/index.html HTTP/1.1" 404 -
通过在Python Web服务器和外部主机之间放置一个Nginx代理,我可以从外部主机访问Python Web服务。
Nginx安装在Python web服务所在的同一台服务器上,只需在端口80上侦听,然后代理到localhost:8282 。
Nginxconfiguration:
server { listen 80 default_server; location / { proxy_pass http://127.0.0.1:8282; }
在外部主机上,SSH端口转发configuration为端口80,而不是8282。
ssh -L 8181:<farawayhost-ip>:80 <sshuser>@<remotehost-ip> export http_proxy=127.0.0.1:8181 # proxy for curl
现在访问Web服务成功了。
Nginx日志:
<remotehost-ip> - - [<timestamp>] "GET http://<server-ip>/ HTTP/1.1" 200 6 "-" "<user-agent>"
Python http.server日志:
127.0.0.1 - - [<timestamp>] "GET / HTTP/1.0" 200 -
对我的问题:
我最初的问题已经解决,但我想明白为什么。
这些请求如何不同,为什么通过SSH端口转发直接访问Python服务器失败,通过Nginx代理访问成功?
你的问题是,SSH隧道不是HTTP代理(而nginx的),所以设置http_proxy指向SSH隧道端点导致curl发送HTTP请求格式适合HTTP代理,而SSH隧道直接发送这些请求到您的Python应用程序没有像HTTP代理那样做任何特殊的处理。 使用SSH隧道,您需要删除http_proxyvariables并直接通过curl http://localhost:8181/访问您的应用程序。