Nginx 配置成代理服务器

Nginx 配置成代理服务器

一般来说,一台电脑如果要访问外部网络。正常流程应该是外部电脑上先安装一个代理软件。然后在 内部电脑上,设定 http_proxyhttps_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 中设定的网址内容

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2020/10/20/nginx-setting-proxy-host

Buy me a cup of coffee ☕.