22

Хотя мне удалось успешно настроить nginx для прокси-трафика HTTP (используя это руководство), все попытки прокси-запросов HTTPS привели к коду 400 (неверный запрос).

Журналы отладки Nginx не помогли вообще:

2013/06/05 14:38:33 [info] 74946#0: *589
    client sent invalid request while reading client request line, client: 127.0.0.1,
    server: google.com, request: "CONNECT google.com:443 HTTP/1.1"

Что это за запросы CONNECT ? Возможно ли proxy_pass HTTPS-запросов в nginx?

Обновить

Необходимо добавить, что прокси-сервер является частью моего рабочего процесса / инструментария веб-разработки. Это отличный способ для тестирования / отладки клиентского JavaScript в производственной среде (используя переписывание перед прокси).

Также язык конфигурации nginx, возможно, сам по себе является языком программирования. У него есть переменные!

4 ответа4

14

Похоже, что nginx не поддерживает режим прямого прокси с SSL. Вам нужно будет использовать что-то вроде Squid вместо этого. Вот ссылка с дополнительным объяснением от автора nginx: HTTPS и nginx как Forward Proxy.

7

Просто для пояснения: как я писал в ленте комментариев моего блога, nginx не обрабатывает вызовы методов CONNECT, которые используются для установления необработанного TCP-соединения с удаленным хостом через HTTP-прокси - что имеет смысл, учитывая, что nginx не должен работать в качестве прямого прокси-сервера, просто так получается, что он работает достаточно хорошо для обычного HTTP.

Nginx просто не знает, что делать с этими вызовами методов, поэтому сообщения об ошибках в журналах бесполезны. Я всегда обнаруживал, что использую privoxy для HTTPS: http://www.privoxy.org/ - его тоже очень легко настроить. Но все еще невозможно фильтровать или манипулировать содержимым реле HTTPS, потому что соединения HTTPS обрабатываются с помощью необработанного соединения с помощью метода CONNECT, и сервер не знает, что он передает.

2

Если вы не возражаете против компиляции nginx из исходного кода, вы можете установить ngx_http_proxy_connect_module. В Debian 9 "Stretch" на Raspberry Pi мне помогло следующее (после того, как я добавил URL-адреса deb-src в /etc/apt/sources.list и выполнил обновление apt-get):

cd /tmp &&
apt-get source nginx &&
git clone https://github.com/chobits/ngx_http_proxy_connect_module &&
cd nginx-* &&
patch -p1 < ../ngx_http_proxy_connect_module/proxy_connect.patch &&
sudo apt-get install libpcre3-dev &&
./configure --add-module=/tmp/ngx_http_proxy_connect_module &&
make && sudo make install

Затем отредактируйте /usr/local/nginx/conf/nginx.conf и сделайте так, чтобы он выглядел следующим образом (я включил пример доменов, которые вы хотите заблокировать, который работает как с SSL, так и без SSL-прокси):

user www-data;
worker_processes auto;
events { }
http {
    server_names_hash_bucket_size 128;
    server {
        listen       8888;
        server_name  spam.example.com *.spam.example.com;
        server_name  spam2.example.com *.spam2.example.com;
        access_log off;
        return 404;
    }
    server {
        listen       8888;
        server_name ~.+;
        proxy_connect;
        proxy_max_temp_file_size 0;
        resolver 8.8.8.8;
        location / {
           proxy_pass http://$http_host;
           proxy_set_header Host $http_host;
        }
    }
}

Затем запустите /usr/local/nginx/sbin/nginx . Он вполне с радостью будет сосуществовать со стандартным пакетом Debian nginx , если вы также используете производственный веб-сервер на порту 80 и не хотите рисковать этим (но обязательно запустите /usr/local версию отдельно при загрузке); альтернативно, с большей конфигурацией вы можете запускать обе службы из скомпилированного вами nginx. Но если вы настроите свой скомпилированный nginx для запуска на порт, на который ваш брандмауэр пропускает трафик, остерегайтесь того, что вам придется проверять обновления безопасности nginx вручную, поскольку система пакетов Debian больше не будет делать это за вас.

0

Я просто следовал инструкциям Сайласа С. Брауна и смог собрать двоичный файл Nginx, который может работать с пересылкой и SSL. Я собрал все вместе в образ Docker. Файл Docker и его конфигурация находятся здесь, на GitHub: https://github.com/reiz/nginx_proxy.

Образ Nginx Docker в этом хранилище Docker Hub может обрабатывать SSL-соединение и пересылку: https://hub.docker.com/r/reiz/nginx_proxy/.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .