一般来说,一台电脑如果要访问外部网络。正常流程应该是外部电脑上先安装一个代理软件。然后在 内部电脑上,设定 http_proxy
和 https_proxy
如果是爬虫脚本,要通过 api 接口获取数据,但需要隐藏真实 IP ,也是通过代理软件进行的。
通过配置,可以使 Nginx 成为一个代理服务器
有两种代理方式:
第一种代理方式
优点是直接通过 Nginx 进行代理访问第三方网站,无需安装软件。可以代理任意网站
但也有局限性:无法批量代理,只能代理单个 url 路径
一个网页请求中,包含 html、css、js 等资源。而使用下面的 Nginx 配置,一次只能代理一个路径。所以这种代理方式适用于单一接口代理访问。
测试代理网址: https://cn-proxy.zwc365.com/
使用方式是在网站后面直接贴上代访问的网址,例如访问百度和 必应:
https://cn-proxy.zwc365.com/https://www.baidu.com/
https://cn-proxy.zwc365.com/https://cn.bing.com/
可以访问获取出口 IP 地址的网站:
代理前:https://cip.cc/
代理后:https://cn-proxy.zwc365.com/https://cip.cc/
已经变成了我的服务器出口 IP 了
如果 Nginx 服务器部署在国外,在后面拼接谷歌的网址甚至也是可以的。这里不做进一步讨论
这种方式适用于脚本或者爬虫访问某个特定 api 接口
server{
listen 80;
server_name cn-proxy.zwc365.com;
# 主要用来解析host,否则要用 lua 模块,获取下一步的 url
# 如果不想暴露上网记录,可以自行编写一个服务或尝试用 lua
# 也可以尝试使用 CloudFlare Worker 解析 host
set $base_url "https://pd.zwc365.com";
set $base_url_host "pd.zwc365.com";
resolver 8.8.8.8;
recursive_error_pages on;
proxy_intercept_errors on;
proxy_redirect off;
location = /favicon.ico {return 404;}
location / {
proxy_pass $base_url/gethost$request_uri;
proxy_set_header Host $base_url_host;
error_page 302 = @download_302;
}
# 再次强调,获取下一步的 request_host 不一定要通过这种方式
# 这份配置文件也仅仅是一个使用 Nginx 做代理的尝试
location @download_302 {
# 注意:必须使用 set ,将 upstream 的变量保存到一个值
set $saved_x_real_host '$upstream_http_x_real_host';
set $next_req_host '$upstream_http_location';
set $down_id '$upstream_http_x_download_id';
set $x_referer '$upstream_http_x_referer';
proxy_pass $next_req_host;
proxy_set_header Host $saved_x_real_host;
proxy_set_header Referer $x_referer;
error_page 301 302 303 307 308 = @host_302;
}
# 这是用来拦截内容 302 的
# 某些资源会 302 或者 301 重定向,必须拦截
# 否则会出现无法代下的情况
location @host_302 {
set $next_req_host '$upstream_http_location';
# 最最最 主要的是要得到一个 Host
proxy_pass $base_url/gethost/$next_req_host;
proxy_set_header Host $base_url_host;
proxy_set_header X-Download-Id $down_id;
error_page 302 = @download_302;
}
}
将 Nginx 代理用于 android 开发
由于本人是 Android 开发者,所以这里的示例是将此 Nginx 代理用于仓库的
在一个 Android 项目的根目录,通常会配置两个仓库地址:
allprojects {
repositories {
google()
jcenter()
}
}
上面的这部分代码想必见过很多了,但是由于 google 位于国外,速度不尽如人意。所以加速方式有很多,科学上网、阿里云镜像站等等。
用上面的配置实测是可以做到代理 google 仓库的:
allprojects {
repositories {
maven { url 'http://cn-proxy.zwc365.com/https://dl.google.com/dl/android/maven2/' }
// google()
jcenter()
}
}
现在所有的库下载请求都由 http://cn-proxy.zwc365.com/
进行了代理。
第二种代理方式
如果想要通过 Nginx 完整的代理一个网站,也是有办法的。
但这种方式又有局限性:被代理的网址 host 是固定的,也就是 test1.example.com
只能代理 test2.example.com
,无法做到代理任意网址
这种方式适用于代理整个网站
这种代理方式网上很多:
server{
listen 80;
# 这里改成内部的ip地址即可
server_name xxxxxx;
set $base_url "https://被代理的网站";
set $base_url_host "被代理的网站域名(不带http://或https://)";
resolver 8.8.8.8;
recursive_error_pages on;
proxy_intercept_errors on;
proxy_redirect off;
location = /favicon.ico {return 404;}
location / {
proxy_pass $base_url;
proxy_set_header Host $base_url_host;
}
}
使用方式:直接请求 server_name
中设定的网址即可。它返回的内容就是 base_url
中设定的网址内容