nginx当正向代理的时候,通过代理访问https的网站会失败,而失败的原因是客户端同nginx代理之间建立连接失败,并非nginx不能将https的请求转发出去。因此要解决的问题就是客户端如何同nginx代理服务器之间建立起连接。有了这个思路之后,就可以很简单的解决问题。我们可以配置两个server节点,一个处理http转发,另一个处理https转发,而客户端都通过http来访问代理,通过访问代理不同的端口,来区分http和https请求。
#http server{ resolver 8.8.8.8; access_log /data/logs/nginx/access_proxy.log main; listen 80; location / { root html; index index.html index.htm; proxy_pass $scheme://$host$request_uri; proxy_set_header host $http_host; proxy_buffers 256 4k; proxy_max_temp_file_size 0k; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream error timeout invalid_header http_502; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
#https server{ resolver 8.8.8.8; access_log /data/logs/nginx/access_proxy.log main; listen 443; location / { root html; index index.html index.htm; proxy_pass https://$host$request_uri; proxy_buffers 256 4k; proxy_max_temp_file_size 0k; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream error timeout invalid_header http_502; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
如果访问http网站,可以直接这样的方式: curl –proxy proxy_server:80 http://www.taobao.com/
如果访问https网站,例如https://www.alipay.com,那么可以使用nginx的https转发的server:
curl –proxy proxy_server:443 http://www.alipay.com
补记:
之前nginx配置透明代理的时候,没有特别针对端口的配置,如果之前的url是http://www.test.com:8080/这样的地址过来,通过nginx转发之后实际到了http://www.test.com:80/上面,为了修复这个问题,增加如下配置:
proxy_pass http://$host:$cookie_passport$request_uri;
其中$cookie_是获取请求中cookie的信息,这个passport的cookie值是原url中端口号。由此可以看出,如果要通过该nginx转发,需要首先设置一个cookie,这个cookie名为passport,cookie的值为原url中的端口号。
如果使用curl命令请求链接,可以这样子:
curl -b passport=80 --proxy proxy_server:80 http://www.taobao.com/
其中-b参数是为了添加cookie