Я использую переадресацию портов SSH - как ни удивительно проиллюстрировано и разработано здесь - для доступа к моему серверу.
Я потратил больше времени, чем хотел бы признать, на устранение неполадок, связанных с доступом к моему веб-серверу Python 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 с внешнего хоста, разместив прокси Nginx между веб-сервером Python и внешним хостом.
Nginx устанавливается на том же сервере, что и веб-сервис Python, и просто слушает порт 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
Доступ к веб-службе теперь успешен.
Журнал Nginx:
<remotehost-ip> - - [<timestamp>] "GET http://<server-ip>/ HTTP/1.1" 200 6 "-" "<user-agent>"
Журнал http.server Python:
127.0.0.1 - - [<timestamp>] "GET / HTTP/1.0" 200 -
На мой вопрос:
Моя первоначальная проблема решена, но я хочу понять, почему.
Чем отличаются эти запросы, почему прямой доступ к серверу Python с переадресацией портов SSH не работает, а доступ через прокси-сервер Nginx завершается успешно?
Ваша проблема в том, что SSH-туннель не является HTTP-прокси (в то время как nginx
это) так установка http_proxy
указать на причины конечной точки туннеля SSH curl
для отправки HTTP-запросов в формате, подходящем для HTTP-прокси, в то время как туннель SSH отправляет эти запросы непосредственно в ваше приложение python без какой-либо специальной обработки, как это делал бы HTTP-прокси. С туннелем SSH вам нужно удалить http_proxy
переменной и получить доступ к своему приложению напрямую с помощью curl http://localhost:8181/
.