我正在使用 SSH 端口转发 - 在这里得到了很好的说明和阐述- 来访问我的服务器。
我愿意承认,我花了更多的时间来解决访问我的 Python Web 服务器 404 的原因。完整的问题在这里完成。
我的问题是,如果我使用端口转发将我的请求直接转发到运行 Python 服务器的端口(例如 8282),所有请求都是 404。
Python 服务器,为简单起见(提供 index.html,包含字符串hello
):
python -m http.server 8282
从我想要访问的主机转发的 SSH 端口:
ssh -L 8181:<farawayhost-ip>:8282 <sshuser>@<remotehost-ip>
对于主机上的后续请求curl
,我定义了环境变量http_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
.
Nginx 配置:
server {
listen 80 default_server;
location / {
proxy_pass http://127.0.0.1:8282;
}
在外部主机上,SSH 端口转发配置为端口 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_proxy
变量并直接使用curl http://localhost:8181/
.