正向代理:局域網中的客戶端不能直接訪問Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。Nginx本身只支持http的正向代理,並通過ngx_http_proxy_connect_module模塊支持http、https的正向代理;
反向代理:如果局域網向Internet提供資源服務,讓Internet上的其他客戶端來訪問局域網內不的資源,使它們必須通過一個代理服務器來進行訪問內部資源,這種服務就稱為反向代理;Nginx通過proxy模塊實現反向代理功能。
假設現在的環境是,局域網中只有一台機器:192.168.10.154配有某個公網IP,如此可以直接訪問公網,而其他局域網服務器需要通過154上的代理來訪問公網:
正向代理http:
1、# vim /etc/nginx/conf.d/proxy.conf
server {
resolver 8.8.8.8;
listen 9999;
access_log /var/log/nginx/proxy.access.log main;
error_log /var/log/nginx/proxy.error.log;
location / {
proxy_pass http://$http_host$request_uri;
}
}
2、在需要訪問公網的服務器配置環境變量
# vim /etc/profile
export http_proxy=http://192.168.10.154:9999
# source /etc/profile
yum源配置:
# vim /etc/yum.conf
proxy=http://192.168.10.154:9999
通過curl指定代理來測試http串是否返回200
# curl -x 192.168.10.154:9999 -I http://xxxx.xxxx.xxxx/xxx.xxx
3、不支持代理 Https 網站
作為 web_server Nginx 當然是可以處理 ssl 的,但作為proxy則是不行的。因為nginx不支持CONNECT,收到“CONNECT /:443 HTTP/1.1”后會報一個包含“client sent invalid request while reading client request line,” 的錯誤。因為 CONNECT 是正向代理的特性。
例:
訪問:# curl -I -x 192.168.10.154:9999 'https://www.baidu.com/?tn=93380420_hao_pg'
日志:192.168.10.X - [04/Nov/2017:10:23:46 +0800] "CONNECT www.baidu.com:443 HTTP/1.1" 400 173 "-" "-" - - - - "-"
那么,如何讓nginx的正向代理,既支持http又支持https的代理訪問呢?
需要安裝模塊:ngx_http_proxy_connect_module
1、安裝(具體省略)
./configure --add-module=/path/to/ngx_http_proxy_connect_module
make && make install
2、配置
server {
listen 3128;
# dns resolver used by forward proxying
resolver 8.8.8.8;
# forward proxy for CONNECT request
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# forward proxy for non-CONNECT request
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
3、測試
# curl https://github.com/ -v -x 192.168.10.154:3128
……
HTTP/1.0 200 Connection Established
……