NGINX的日常使用之如何编译安装并且配置正向代理

本文通过介绍正向代理的原理和配置引出如何通过编译的方式安装nginx并且通过nginx配置http和https的正向代理。

文章目录

前言

一、正向代理是什么?

二、正向代理的工作原理

三、正向代理使用场景

1. 访问受限制的资源

2. 隐藏客户端的真实 IP

3. 缓存

4. 监控和过滤

四、正向代理与反向代理的区别

1. 正向代理:

2. 反向代理:

 五、Nginx的编译安装

1. 安装依赖        

2. 下载 Nginx 源代码

3. 配置编译选项

(1)参数说明:

(2)编译模块说明:

4. 编译并安装 Nginx

5. 检查目录结构

6. 启动 Nginx

7. 将Nginx注册到 Systemd 中

(1)创建 Systemd 服务文件

(2)重新加载 Systemd

(3)启动并启用 Nginx 服务

六、NGINX的正向代理的配置

1、Http请求的正向代理配置

(1)Nginx的配置文件示例

(2)配置文件中的关键部分和解释:

(3)验证Http请求正向代理配置是否成功

2、Https请求的正向代理配置

(1)HTTP 正向代理与 HTTPS 正向代理的区别

(2)HTTPS正向代理proxy_connect 模块的编译

 · 获取 proxy_connect 模块

· 应用 proxy_connect 模块的补丁

· 重新配置Nginx编译选项并重新编译Nginx

· HTTPS请求的正向代理的配置文件

· 验证HTTPS请求的正向代理配置是否成功

总结


前言

前面我们已经介绍了Nginx反向代理的使用,今天我们再介绍一下Nginx在网络中的另外一种使用方式——正向代理。


一、正向代理是什么?

       首先我们先搞清楚正向代理是什么?正向代理(Forward Proxy)是一种代理服务器,位于客户端与目标服务器之间,帮助客户端向目标服务器发出请求。正向代理的主要作用是代表客户端进行网络请求。使用正向代理时,客户端通过代理服务器访问目标服务器,而目标服务器并不知道请求的实际客户端是谁,它只知道请求是来自代理服务器。

如果让我们更加形象的来理解正向代理可以打个实际生活中的例子:

        你在某种会议上想与外国客户进行沟通交谈,但你又恰好不会说客户的语言,这时候你就可以找一位翻译员(正向代理服务器),你告诉翻译员(正向代理服务器)你要说什么,翻译员(正向代理服务器)替你与客户沟通,然后将客户的回复翻译回来给你。客户不知道你不会说他们的语言(客户不知道你的真实情况),只知道翻译员在与你沟通(代理服务器代为处理请求)。

        上面这个例子中,你就可以是需要访问某种资源的客户端服务器,而外国客户就是你想要访问的目标服务器,翻译员则充当了正向代理服务器的角色,帮助客户端服务器和目标服务器之间进行通信。如果画成图可以是这样:

二、正向代理的工作原理

1. 客户端发送请求:客户端(如浏览器)向正向代理服务器发送请求,并在请求中包含目标服务器的地址。

2. 代理服务器处理请求:代理服务器接收客户端的请求,将其转发给目标服务器。

3. 目标服务器响应:目标服务器处理代理服务器的请求,并返回响应。

4. 代理服务器返回响应:代理服务器接收到目标服务器的响应后,将其转发回客户端。

三、正向代理使用场景

1. 访问受限制的资源

• 在某些情况下,网络对某些网站或资源的访问可能被限制,比如某些网站的地理限制或公司内部网络屏蔽了某些网站。通过配置正向代理,用户可以绕过这些限制,访问受限的资源。

这里只拿公司内部的情况来举例,公司内部个人的网络可能无法访问百度等外网资源,但是有台能通公网的服务器可以访问,那么我们就可以通过配置这台通公网的服务器为正向代理服务器,通过他提供的正向代理服务访问到公网的资源。

2. 隐藏客户端的真实 IP

• 正向代理可以隐藏客户端的真实 IP 地址,保护用户隐私。这在网络匿名访问、数据采集等场景中尤为重要。

还拿公司的使用来举例,假设现在你公司需要从一个敏感的竞争对手网站上收集公开数据。为了不暴露公司网络或者是个人 IP,就可以配置一台正向代理服务器,通过它转发所有数据采集请求。这样,外部网站只会看到来自代理服务器的请求,而不会看到公司内部网络或个人设备的 IP 地址。

3. 缓存

• 正向代理可以对客户端的请求进行缓存。当多个客户端请求同一资源时,代理可以从缓存中直接返回数据,而不必每次都去目标服务器请求,从而提高访问速度并减少带宽消耗。

在公司内网中的多个员工经常访问同一份外部文档或下载某些软件更新。为了提高下载速度和节省带宽,我们完全可以配置正向代理服务器来缓存这些常用文件。下次其他员工访问同样的资源时,代理服务器可以直接提供缓存的文件,而不需要再次向外部服务器请求。

4. 监控和过滤

• 企业可以通过正向代理监控员工的互联网使用情况,并对特定类型的网站或内容进行过滤。例如,企业可以配置正向代理来限制访问某些网站,或拦截不合规的数据传输。

这个就更好举例子了,不知道大家有没有碰到过工作时间,如果访问一些提供娱乐资源的网站就会返回一个禁止访问的页面,这其实就是用到的正向代理的监控和过滤功能,为了提高工作效率并保障网络安全,公司往往会配置正向代理服务器,所有员工通过正向代理服务访问互联网。网络管理员设置规则,禁止访问社交媒体和娱乐性网站,并能在后台实时查看员工访问的记录。如果员工尝试访问某些不允许的网站,代理服务器会拦截并返回一个“访问被禁止”的提示页面。

四、正向代理与反向代理的区别

1. 正向代理

        • 位于客户端和目标服务器之间,代表客户端向目标服务器发送请求。

        • 客户端知道代理的存在,目标服务器不知道。

        • 常用于绕过网络限制、访问外部资源、隐藏客户端 IP 等。

2. 反向代理

        • 位于目标服务器和客户端之间,代表目标服务器处理来自客户端的请求。

        • 客户端不知道反向代理的存在,目标服务器部署在代理后面。

        • 常用于负载均衡、缓存、提高安全性等。

可能这样讲,还是不能很通俗的理解两者的区别,那边我们可以直接用生活中在生活中完整的使用正向和反向代理的例子帮助我们理解这两者的区别:

        现在你要在公司内部部署一套需要访问外网资源的服务,而你的公司又有着严格的网络要求,不允许服务部署的服务器直接访问外网资源,这时候你就可以在dmz区部署正向代理通过正向代理帮助服务访问外网资源。当你的服务部署完成后,你需要提供服务给公司的员工进行使用,此时你可以部署一个反向代理服务器将你部署的服务提供给公司员工访问。

特点

正向代理

反向代理

作用对象

代理客户端

代理服务器

使用者

服务器端(上文中的内网服务)

服务器端(上文中的内网服务)

主要用途

帮助服务访问受限资源,隐藏客户端 IP

负载均衡,隐藏后端服务器,增强安全

谁发起请求

服务通过正向代理请求外部资源

外部用户请求通过反向代理访问内部服务器

典型场景

公司内网访问外网,隐藏客户端 IP

负载均衡、缓存、保护内部服务器

将上面的示例完整的画出来就是:

 五、Nginx的编译安装

在前面我们介绍完了正向代理,那么就让我们通过编译安装的方式安装Nginx

1. 安装依赖        

确保你的系统中安装了编译 Nginx 所需的依赖。对于基于 Debian 的系统(如 Ubuntu),可以运行以下命令:

sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

对于基于 RHEL/CentOS 的系统:

sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel

2. 下载 Nginx 源代码

Nginx 官方网站下载 Nginx 源代码:

或者使用 wget 下载最新的稳定版:

wget https://nginx.org/download/nginx-1.26.2.tar.gz

PS:文章撰写时1.26.2为最新稳定版,请读者根据访问官网时显示的稳定版本为主

依次执行:

tar -zxvf nginx-1.26.2.tar.gz
cd nginx-1.26.2

3. 配置编译选项

cd 到Nginx的源代码目录下我们可以运行 ./configure,并指定 --prefix 和其他路径参数,将所有 Nginx 的文件安装到指定目录。

这里我们将Nginx的所有文件(包括配置文件、日志、可执行文件等)放在同一个目录下,所以配置的编译选项使用以下命令:

./configure --prefix=/opt/nginx \
            --sbin-path=/opt/nginx/sbin/nginx \
            --conf-path=/opt/nginx/nginx.conf \
            --pid-path=/opt/nginx/nginx.pid \
            --lock-path=/opt/nginx/nginx.lock \
            --error-log-path=/opt/nginx/logs/error.log \
            --http-log-path=/opt/nginx/logs/access.log \
            --with-pcre \
            --with-http_v2_module

(1)参数说明:

• --prefix=/opt/nginx:指定所有 Nginx 文件的根目录。这里设置为 /opt/nginx(无需提前手动创建该目录,后续Nginx 的 make install 步骤会自动创建它)。

• --sbin-path=/opt/nginx/sbin/nginx:指定 Nginx 可执行文件的位置。

• --conf-path=/opt/nginx/nginx.conf:指定 Nginx 配置文件的位置。

• --pid-path=/opt/nginx/nginx.pid:指定 Nginx PID 文件的位置。

• --lock-path=/opt/nginx/nginx.lock:指定锁文件位置。

• --error-log-path=/opt/nginx/logs/error.log:指定错误日志文件的位置。

• --http-log-path=/opt/nginx/logs/access.log:指定访问日志文件的位置。

(2)编译模块说明:

在 Nginx 编译安装时,你可以通过 ./configure 指定要启用的模块。Nginx 分为核心模块、标准模块和第三方模块。默认情况下,Nginx 编译时会启用一些核心和标准模块,但你也可以通过 ./configure 命令手动启用或禁用某些模块。

Nginx 的核心模块

Nginx 的核心模块是默认启用的,用于提供最基本的 HTTP 服务和核心功能。这些模块不能被禁用,因为它们是 Nginx 核心的一部分。核心模块包括:

HTTP 核心模块 (http_core):处理 HTTP 请求的核心模块,处理 HTTP 方法、URI、请求头、响应头等。

Events 核心模块 (events_core):处理 Nginx 的事件驱动模型和网络 I/O 的核心模块。

Nginx 默认启用的标准模块

当你编译 Nginx 而不指定任何选项时,Nginx 会自动编译并启用一些标准模块。这些模块提供常用的功能,但你可以根据需求添加或删除某些模块。

默认启用的模块包括:

HTTP 模块

• ngx_http_access_module:用于访问控制。

• ngx_http_auth_basic_module:基本 HTTP 认证模块。

• ngx_http_autoindex_module:生成自动索引页面。

• ngx_http_browser_module:处理不同浏览器的请求。

• ngx_http_charset_module:处理字符集转换。

• ngx_http_fastcgi_module:支持 FastCGI 协议的反向代理模块。

• ngx_http_gzip_module:GZIP 压缩模块。

• ngx_http_headers_module:支持自定义响应头。

• ngx_http_index_module:支持目录索引文件(如 index.html)。

• ngx_http_log_module:记录请求日志。

• ngx_http_proxy_module:用于反向代理。

• ngx_http_referer_module:基于 Referer 头的访问控制。

• ngx_http_rewrite_module:支持 URL 重写规则。

• ngx_http_static_module:提供静态文件服务。

• ngx_http_upstream_module:负载均衡和上游服务器支持。

• ngx_http_v2_module:HTTP/2 协议支持(需要编译时指定 --with-http_v2_module)。

可选的编译模块

除了默认启用的模块,Nginx 还支持通过编译选项启用其他标准模块和第三方模块。你可以通过 ./configure 来手动指定启用这些模块。

常见的可选模块:

SSL 模块

• ngx_http_ssl_module:支持 SSL/TLS,提供 HTTPS 功能(通过 --with-http_ssl_module 启用)。

HTTP/2 模块

• ngx_http_v2_module:支持 HTTP/2 协议(通过 --with-http_v2_module 启用)。

PCRE 正则表达式支持

• --with-pcre:使用 PCRE 库来处理正则表达式(如 location 块中的正则匹配)。

流量限制模块

• ngx_http_limit_conn_module:限制每个 IP 的连接数。

• ngx_http_limit_req_module:限制每个 IP 的请求速率。

Mail 模块

• ngx_mail_core_module:为邮件代理服务提供支持(如 SMTP、IMAP 和 POP3)。

• 通过 --with-mail 启用。

缓存和会话持久性模块

• ngx_http_cache_purge_module:用于缓存管理,支持清除缓存。

• ngx_http_memcached_module:与 Memcached 缓存系统集成。

Stream 模块

• ngx_stream_core_module:为 TCP/UDP 流服务提供支持(如负载均衡)。

• 通过 --with-stream 启用。

你可以通过以下命令列出所有可用的编译模块:

./configure --help

关于编译模块就不在此过多赘述。

4. 编译并安装 Nginx

当你成功运行 ./configure 后,终端中会输出类似以下的信息:

这个信息表明,./configure 已经成功生成了根据你指定的编译选项(例如 --prefix, --with-http_ssl_module )生成一个适合你环境的配置,并将这些配置写入到一个 Makefile 文件中。

再查看当前目录也会发现新生成的Makefile文件

Makefile 文件包含了编译和安装 Nginx 所需的步骤和规则,主要包括:

• 如何编译 Nginx 的源代码(make 会根据 Makefile 来编译)。

• 如何链接所需的库文件。

• 如何安装 Nginx 到指定的目录。

执行 make 和 make install

1. 编译

make

make 命令会读取 Makefile 中定义的规则,将源代码编译成二进制文件。

2. 安装

make install

make install 会将编译生成的 Nginx 二进制文件、配置文件和其他所需的文件安装到你通过 ./configure 指定的目录(如本文的示例/opt/nginx)下。

5. 检查目录结构

观察到编译完成后:

Nginx 的所有文件应该都位于 /opt/nginx 目录下,检查目录结构:

• nginx.conf:Nginx 的配置文件。

• html:默认的静态资源目录,存放默认的首页等内容。

• logs:存放 Nginx 的日志文件(error.log 和 access.log)。

• sbin:存放 Nginx 的可执行文件。

6. 启动 Nginx

若想启动 Nginx,需要使用/opt/nginx/sbin目录下的 Nginx 可执行文件:

/opt/nginx/sbin/nginx

也可以通过以下命令重启或停止 Nginx:

/opt/nginx/sbin/nginx -s reload   # 重启
/opt/nginx/sbin/nginx -s stop     # 停止

可以看到启动的nginx进程

7. 将Nginx注册到 Systemd 中

首先我们先停掉刚刚启动的Nginx进程

(1)创建 Systemd 服务文件

Systemd 服务文件通常存放在 /etc/systemd/system/ 目录下。在这个目录下创建一个 Nginx 的服务文件。

vim /etc/systemd/system/nginx.service

在文件中添加以下内容:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
ExecStart=/opt/nginx/sbin/nginx      # Nginx 可执行文件的路径
ExecReload=/opt/nginx/sbin/nginx -s reload
ExecStop=/opt/nginx/sbin/nginx -s stop
PIDFile=/opt/nginx/nginx.pid          # Nginx 的 PID 文件路径
PrivateTmp=true

[Install]
WantedBy=multi-user.target

PS:service文件中不要有#注释,此为方便理解添加,修改文件时请去掉。

配置文件解释:

[Unit]:定义服务的基本信息和依赖。

        • Description:对服务的简要描述。

        • After:定义服务启动的顺序,这里表示在网络服务之后启动 Nginx。

[Service]:定义如何启动、停止和重载服务。

        • Type=forking:表示 Nginx 在启动后会产生一个子进程运行,因此使用 forking 类型。

        • ExecStart:指定 Nginx 的启动命令。这里填写你编译安装 Nginx 的可执行文件路径(例如 /opt/nginx/sbin/nginx)。

        • ExecReload:指定重载配置文件的命令。

        • ExecStop:指定停止服务的命令。

        • PIDFile:指定 Nginx 的 PID 文件路径,用于追踪 Nginx 进程(通常是 /opt/nginx/nginx.pid)。

[Install]:定义如何将服务集成到系统中。

        • WantedBy=multi-user.target:表示该服务将会在系统的多用户模式下启动。

(2)重新加载 Systemd

在创建服务文件后,使用以下命令重新加载 Systemd 配置,以使其识别新的 Nginx 服务文件:

systemctl daemon-reload

(3)启动并启用 Nginx 服务

完成上述步骤后,即可使用systemctl命令启停编译安装的Nginx服务

• 启动 Nginx 服务:

systemctl start nginx

• 查看 Nginx 服务状态:

systemctl status nginx

• 停止 Nginx 服务:

systemctl stop nginx

至此将 Nginx 的所有文件集中在一个目录下的编译安装完成。这种方式更加的便于管理,特别是在特定环境或容器中时,可以更容易地对 Nginx 进行备份、迁移或分发。

六、NGINX的正向代理的配置

1、Http请求的正向代理配置

(1)Nginx的配置文件示例

server {
    listen 8080;  # Nginx 监听端口,客户端需要将代理服务器设置为 http://<nginx_ip>:8080
    server_name _;  # 泛指所有域名和IP请求

    # DNS 解析器,用于解析客户端请求中的目标域名
    resolver 114.114.114.114 valid=300s;
    resolver_timeout 5s;

    # HTTP 请求代理配置
    location / {
        proxy_pass http://$http_host$request_uri;  # 代理请求并转发给客户端请求的目标服务器
        proxy_set_header Host $host;               # 将原始请求中的 Host 保留,传递给目标服务器
        proxy_set_header X-Real-IP $remote_addr;   # 设置客户端真实 IP,传递给目标服务器
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 记录客户端 IP 和代理链信息
        proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议(HTTP)

        # 设置超时配置
        proxy_connect_timeout 10s;   # 连接到目标服务器的超时时间
        proxy_read_timeout 60s;      # 读取目标服务器响应的超时时间
        proxy_send_timeout 60s;      # 向目标服务器发送请求的超时时间

        # 关闭缓存,实时转发请求和响应
        proxy_buffering off;
    }

    # 自定义错误页面,捕获代理失败的情况
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;  # 错误页面存储位置
    }
}

(2)配置文件中的关键部分和解释:

1. listen 8080

• Nginx 监听的端口,客户端需要将代理服务器的地址设置为 http://<nginx_ip>:8080,以使用该 HTTP 代理服务。

原理:代理服务器接收客户端发来的 HTTP 请求并将其转发给目标服务器。

2. resolver 114.114.114.114 valid=300s;

• 配置 DNS 解析器,用于解析客户端请求中的目标服务器域名。

原理:正向代理服务器需要知道目标服务器的 IP 地址,代理服务器会通过配置的 DNS 解析器来解析域名。

PS:这几种 DNS 服务器(DNS resolver)较为流行并被广泛使用:

国外:

1. Google Public DNS

IP 地址:IPv4:8.8.8.8 和 8.8.4.4       IPv6:2001:4860:4860::8888 和 2001:4860:4860::8844

特点

        • 全球范围内使用最广泛的公共 DNS 服务之一。

        • 提供高速、可靠的 DNS 解析服务,并且完全免费。

        • 提供 DNS-over-HTTPS(DoH)和 DNS-over-TLS(DoT)加密支持,以保护用户隐私和安全。

适用场景:用户需要稳定、高速的公共 DNS 服务。

(2). Cloudflare DNS

IP 地址: IPv4:1.1.1.1 和 1.0.0.1       IPv6:2606:4700:4700::1111 和 2606:4700:4700::1001

特点

        • 以低延迟、高隐私保护著称的 DNS 服务。

        • Cloudflare 承诺不会记录用户的 IP 地址,并且每 24 小时删除日志。

        • 提供 DNS-over-HTTPS(DoH)、DNS-over-TLS(DoT)支持,保障 DNS 查询的隐私和安全。

适用场景:对隐私保护和低延迟有较高要求的用户。

(3). OpenDNS (由 Cisco 提供)

IP 地址:IPv4:208.67.222.222 和 208.67.220.220    IPv6:2620:119:35::35 和 2620:119:53::53

特点

        • 提供免费和高级的 DNS 服务,支持自定义域名过滤、内容控制等功能。

        • OpenDNS 提供针对家长控制和企业防护的高级服务。

        • 有较强的防钓鱼功能和高可靠性。

适用场景:需要域名过滤、家长控制或者增强的网络安全防护。

原理:正向代理服务器需要知道目标服务器的 IP 地址,代理服务器会通过配置的 DNS 解析器来解析域名。

国内:

(1). 114 DNS

IP 地址:IPv4:114.114.114.114 和 114.114.115.115       IPv6:240C::6644 和 240C::6645

特点

        • 114 DNS 是中国电信推出的免费公共 DNS 服务,广泛使用,解析速度快,适合国内网络用户。

        • 提供稳定的 DNS 解析服务,适用于国内的网络访问。

适用场景:国内用户访问国内网站时的首选 DNS 服务,解析速度和稳定性较好。

(2). 阿里云公共 DNS

IP 地址:IPv4:223.5.5.5 和 223.6.6.6         IPv6:2400:3200::1 和 2400:3200:baba::1

特点

        • 阿里云提供的公共 DNS 服务,解析速度快,尤其适合阿里云生态下的业务和应用。

        • 支持 IPv6,适用于国内用户访问阿里云和其他国内网络资源。

适用场景:适合国内用户,特别是在阿里云生态下进行应用和服务访问时,具有较快的解析速度。

(3). 百度 DNS

IP 地址: IPv4:180.76.76.76

特点

        • 百度推出的公共 DNS 服务,针对国内网络优化,特别适合访问百度相关的服务和资源。

        • 提供快速解析国内主要网站的 DNS 请求。

适用场景:国内用户,尤其是经常使用百度服务或依赖百度生态系统的应用。

3. proxy_pass http://$http_host$request_uri;

• 转发客户端的请求到目标服务器,$http_host 是客户端请求的目标主机,$request_uri 是完整的请求 URI。

原理:Nginx 代理将客户端的 HTTP 请求转发给目标服务器。

4. proxy_set_header Host $host;

• 将客户端请求中的 Host 保留并传递给目标服务器。

原理:保留客户端原始请求中的 Host 头信息,确保目标服务器识别为原始请求。

5. proxy_set_header X-Real-IP $remote_addr;

• 向目标服务器传递客户端的真实 IP 地址。

原理:代理服务器会向目标服务器传递客户端的真实 IP 地址,而不是代理服务器的 IP。

6. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

• 传递客户端的原始 IP 地址以及代理服务器链的信息。

原理:记录客户端的 IP 地址和代理链信息,目标服务器可以查看通过哪些代理服务器到达的。

7. proxy_connect_timeout 10sproxy_read_timeout 60sproxy_send_timeout 60s

• 分别定义了代理服务器与目标服务器的连接、读取和发送超时时间。

原理:这些超时配置确保代理服务器不会长时间等待目标服务器的响应。如果超时,Nginx 将返回错误给客户端。

8. proxy_buffering off;

• 关闭代理的响应缓冲区,确保请求和响应被实时转发。

原理:禁用 Nginx 缓冲功能,让代理服务器实时转发客户端请求和目标服务器的响应。

9. error_page 500 502 503 504 /50x.html;

• 自定义错误页面,当代理失败(如服务器不可用或连接超时)时返回自定义的错误页面。

原理:如果代理服务器无法连接目标服务器或遇到其他错误,返回用户友好的错误页面。

(3)验证Http请求正向代理配置是否成功

/opt/nginx/sbin/nginx -t    #验证配置文件是否正确
systemctl stop nginx.service   #停止nginx
systemctl start nginx.service   #启动nginx
curl http://www.baidu.com -v -x 127.0.0.1:8080   #使用本机的正向代理服务访问http的百度地址

可以看到正常返回了200的信息表示正向代理配置成功

2、Https请求的正向代理配置

上面我们配置的是http请求的正向代理请求,如果我们把请求的http://www.baidu.com 改成https的请求就会发现一个问题

会发现报了400的错误,这是因为我们现在编译和配置的Nginx还不支持Https的正向代理配置

(1)HTTP 正向代理与 HTTPS 正向代理的区别

HTTP 正向代理:代理服务器可以直接访问和处理客户端的请求和响应数据。客户端发送的是明文请求,代理服务器可以读取、修改请求内容并进行转发。

HTTPS 正向代理:由于 HTTPS 协议加密了客户端和目标服务器之间的通信,代理服务器不能直接查看请求内容。因此,代理服务器需要通过 CONNECT 方法建立一个隧道,将加密的数据直接传输给目标服务器,而不做任何修改。

Nginx官方是并不支持直接转发Https请求,为了支持 HTTPS 正向代理,Nginx 需要使用 proxy_connect 模块来处理 CONNECT 方法。该模块允许客户端使用 CONNECT 方法通过 Nginx 建立与目标服务器的加密隧道。至此我们需要重新编译刚才编译好的Nginx对其新增模块。

(2)HTTPS正向代理proxy_connect 模块的编译

  · 获取 proxy_connect 模块

    proxy_connect 模块不是 Nginx 官方内置的模块,需要从第三方获取源码。    

可以直接使用命令将git上的仓库clone到本地

git clone https://github.com/chobits/ngx_http_proxy_connect_module.git

也可直接在github主页根据Nginx版本直接进行选择下载然后再上传到服务器上

· 应用 proxy_connect 模块的补丁

我们的Nginx的版本是1.26.2所以我们需要用到的补丁名称为proxy_connect_rewrite_102101.patch

进入到补丁的下载目录中(请根据自己下载的路径,这里不给出命令)

在进入到Nginx的源码目录中,使用适合我们Nginx版本的补丁使用patch 命令为 Nginx 源代码应用补丁

patch -p1  < /opt/nginx-connect/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch

PS:这个命令是将当前目录下的补丁包打到Nginx的源码中,若Nginx的源码之前被删除了,请重新下载,注意后面patch文件的路径,请将后面的patch文件的路径改为正确的绝对路径

根据输出信息可以看到文件的补丁都成功应用

· 重新配置Nginx编译选项并重新编译Nginx

补丁已经应用,需要重新编译 Nginx 以使 proxy_connect 模块生效。

再编译之前建议备份一下之前的Nginx二进制执行文件和nginx.conf配置文件,虽然Nginx 的 make install 并不会自动删除或覆盖已有的配置文件,但是一切为了稳妥起见,如果出现问题可以及时还原而不造成任何的损失。

cp /opt/nginx/nginx.conf /opt/nginx/nginx.conf.bak   #备份配置文件
cp /opt/nginx/sbin/nginx /opt/nginx/sbin/nginx.old   #备份二进制启动文件

PS:记得操作前停止Nginx服务

进入Nginx的源码目录重新执行 ./configure命令,并添加 proxy_connect 模块的配置选项。在原来的配置基础上,添加 --add-module 选项以包含 proxy_connect 模块。

./configure --prefix=/opt/nginx \
            --sbin-path=/opt/nginx/sbin/nginx \
            --conf-path=/opt/nginx/nginx.conf \
            --pid-path=/opt/nginx/nginx.pid \
            --lock-path=/opt/nginx/nginx.lock \
            --error-log-path=/opt/nginx/logs/error.log \
            --http-log-path=/opt/nginx/logs/access.log \
            --with-pcre \
            --with-http_v2_module \
            --add-module=/opt/nginx-connect/ngx_http_proxy_connect_module

这里的各个配置文件的路径一定要和之前编译时的一致,唯一不同的就是新增了一个

 --add-module=/opt/nginx-connect/ngx_http_proxy_connect_module  模块,这里的路径一定要是你自己下载的路径,我的下载路径是/opt/nginx-connect/ngx_http_proxy_connect_module

重新生成Makefile文件成功,重新编译安装

make && make install

编译安装成功,进入到/opt/nginx 目录中查看新编译的目录

配置文件也在,并且到sbin目录下执行 ./nginx -V 命令也可以查看到新增的模块

Nginx的Https模块的重新编译至此完成,接下来就是修改配置文件使之支持HTTPS请求的正向代理。

· HTTPS请求的正向代理的配置文件
server {
    listen 8080;  # Nginx 监听的端口

    resolver 114.114.114.114 valid=300s;
    resolver_timeout 5s;

    # 启用 CONNECT 方法支持,用于代理 HTTPS 请求
    proxy_connect;
    proxy_connect_allow all;  # 允许代理所有主机
    proxy_connect_connect_timeout 10s;  # 连接到目标服务器的超时时间
    proxy_connect_read_timeout 10s;     # 读取目标服务器响应的超时时间
    proxy_connect_send_timeout 10s;     # 发送请求给目标服务器的超时时间

    location / {
        proxy_pass http://$http_host$request_uri;  # 转发 HTTP 请求
        proxy_set_header Host $host;               # 保持原始的 Host 请求头
        proxy_set_header X-Real-IP $remote_addr;   # 记录客户端的真实 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 记录客户端和代理链信息
        proxy_set_header X-Forwarded-Proto $scheme; # 记录请求使用的协议(HTTP/HTTPS)

        proxy_connect_timeout 10s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
        proxy_buffering off;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

这里我们主要的修改就是在配置文件中新增了proxy_connect模块,

proxy_connect 模块

• 允许代理服务器处理 CONNECT 方法,用于 HTTPS 请求的加密隧道建立。

原理:通过该模块,代理服务器能够为客户端和目标服务器之间的 HTTPS 请求建立加密隧道。

Nginx服务重载成功

· 验证HTTPS请求的正向代理配置是否成功
curl https://www.baidu.com -v -x 127.0.0.1:8080   #使用本机的正向代理服务访问http的百度地址

可以看到正常的返回信息了,代表我们的HTTPS请求的正向代理配置成功

此等配置兼容HTTP请求的正向代理,此时无需再配置HTTP的请求的正向代理服务。


总结

本文介绍Nginx的正向代理展示了如何编译安装Nginx和打补丁的操作,理解本文中的正向代理可以帮助客户端通过代理服务器访问目标资源的机制,它可以绕过网络限制、提高安全性、隐藏客户端 IP 等。在日常生活中,它也常用于访问受限制的内容、保护用户隐私以及监控和过滤网络流量。通过理解正向代理的用途和工作方式,可以更好地将其应用到不同场景中。

本文内容仅作为参考和学习交流使用,如有错误请麻烦指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值