![HTTPS용 정방향 프록시로서의 Nginx](https://rvso.com/image/1365821/HTTPS%EC%9A%A9%20%EC%A0%95%EB%B0%A9%ED%96%A5%20%ED%94%84%EB%A1%9D%EC%8B%9C%EB%A1%9C%EC%84%9C%EC%9D%98%20Nginx.png)
HTTP 트래픽을 프록시하도록 nginx를 성공적으로 구성할 수 있었지만(다음을 사용하여)이 가이드), 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
nginx에서 HTTPS 요청 이 가능합니까 ?
업데이트
프록시 서버가 내 웹 개발 작업흐름/툴킷의 일부라는 점을 추가해야 합니다. 클라이언트 측 JavaScript를 테스트/디버깅하는 좋은 방법입니다.생산환경(프록시 이전에 다시 쓰기 사용)
또한 nginx의 구성 언어는 틀림없이 그 자체로 프로그래밍 언어입니다. 변수가 있어요!
답변1
nginx는 SSL을 사용하는 정방향 프록시 모드를 지원하지 않는 것 같습니다. 다음과 같은 것을 사용해야합니다오징어대신에. 다음은 nginx 작성자의 자세한 설명이 포함된 링크입니다.HTTPS 및 nginx를 정방향 프록시로 사용합니다.
답변2
명확히 하자면, 내 블로그의 댓글 피드에 썼듯이 nginx는 HTTP 프록시를 통해 원격 호스트에 대한 원시 TCP 연결을 설정하는 데 사용되는 CONNECT 메서드 호출을 처리하지 않습니다. 정방향 프록시로 작동하더라도 상관없이 일반 HTTP에서는 꽤 잘 작동합니다.
Nginx는 문자 그대로 해당 메소드 호출로 무엇을 해야할지 전혀 모릅니다. 이것이 바로 로그의 오류 메시지가 쓸모가 없는 이유입니다. 저는 항상 HTTPS에 privoxy를 사용하고 있습니다.http://www.privoxy.org/- 설정도 엄청나게 쉽습니다. 그러나 HTTPS 연결은 CONNECT 메소드를 통해 원시 연결로 처리되고 서버는 그것이 무엇을 중계하는지 전혀 모르기 때문에 HTTPS 중계의 내용을 필터링하거나 조작하는 것은 여전히 불가능합니다.
답변3
소스에서 nginx를 컴파일해도 괜찮다면 다음을 설치할 수 있습니다.ngx_http_proxy_connect_module. 다음은 Raspberry Pi의 Debian 9 "Stretch"에서 저에게 효과적이었습니다(deb-src URL을 /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
. nginx
포트 80에서 프로덕션 웹서버를 실행하고 있고 이를 망칠 위험을 감수하고 싶지 않다면 데비안의 기본 패키지와 매우 행복하게 공존할 것입니다 (그러나 /usr/local
부팅 시 버전을 별도로 시작해야 합니다). 또는 더 많은 구성을 사용하면 컴파일한 nginx에서 두 서비스를 모두 실행할 수 있습니다. 하지만 방화벽이 트래픽을 허용하는 포트에서 실행되도록 컴파일된 nginx를 설정했다면 데비안 패키지 시스템이 더 이상 이를 수행하지 않으므로 nginx 보안 업데이트를 수동으로 확인해야 한다는 점에 유의하세요.
답변4
우리 팀이 이 작업을 수행하는 방법을 알아내는 데 시간이 좀 걸렸습니다. 마지막으로 우리는 아래 코드 조각을 nginx.conf에 삽입하여 이를 달성했습니다.
stream {
map_hash_bucket_size 128;
map $ssl_preread_server_name $sphere {
site-01.example.com site-01;
site-02.example.com site-02;
}
upstream site-01 {
server 192.168.0.1:443;
}
upstream site-02 {
server 192.168.0.2:443;
}
server {
listen 443;
proxy_pass $sphere;
ssl_preread on;
}
}