yokila
yokila
Published on 2024-03-23 / 13 Visits
0
0

Nginx HTTPS转发HTTP

本文默认两台服务器都已经安装了 Nginx,且网关服务器已经申请并获得了 SSL证书

那么现在,就可以按步骤进行操作了。

注:关于 Nginx 更详细的安装和介绍,可以参考文章:Linux nginx的安装与入门

注:本文默认两台服务器在一个局域网内,交互时是通过对方的内网IP地址。

注:本文只是一个场景示例,你完全可以把本文提及的网关服务器当作A服务器,应用服务器当作B服务器。不必纠结于生产实际是否长这样。

最终效果

如下图所示:

注:通常情况下,网关服务器和应用服务器是在局域网中交互,才会是使用HTTP。如果是在公网中交互,建议还是用HTTPS(此时可参考文章:Nginx HTTPS转发HTTPS)。

实际访问交互流程:

  1. 用户使用浏览器,先访问到网关服务器。

  2. 浏览器校验网关服务器提供的域名证书。

  3. 在网关服务器内部,把请求代理转发到应用服务器去(HTTP)。

  4. 应用服务器进行真正的业务处理,然后应答。

  5. 网关服务器接收到应用服务器的应答后,将应答返回给用户的浏览器。

申请域名及SSL证书

参考另外的文档:免费SSL证书申请(华为云)

记得把申请到的证书下载下来,然后上传到服务器上。(放置位置随便你,能找得到就行)

比如这是我申请到的博客服务的 SSL证书私钥

image-hiox.png

配置防火墙

在正式配置两台服务器代理和被代理之前,我们需要确保两台服务器之间是能通信的

此时,我们应该想到的第一件事,就是——防火墙

你要先确保 应用服务器的Nginx监听端口 允许 网关服务器 访问。也要确保 网关服务器对外开放了Nginx监听的端口 (不然浏览器怎么访问)

以下是防火墙的管理命令简单示例,更复杂的请借助搜索引擎:

  • Ubuntu查看防火墙信息(允许访问的端口信息),命令:sudo ufw status

  • Ubuntu允许外部访问端口(以12300为例):sudo ufw allow 12300

  • Ubuntu删除增加的规则(以12300为例):sudo ufw delete allow 12300

如果是云服务器,则还要保证安全组配置了访问白名单!!!

注:由于不同云服务商的操作步骤不同,所以这不做安全组配置的展示。

Nginx代理配置(应用服务器)

先进入到存放服务器证书和证书链的文件夹,记录一下路径。

然后进入到nginx的配置文件路径:cd /etc/nginx/conf.d/

编辑生成一个新的配置文件:vi xxx.conf

注:配置文件的文件名请自定义。

注:下面配置仅为示例,可以自行补充扩展,以及注意地址、域名要改成正确的

注:关于 Nginx 更详细的介绍,可以参考文章:Linux nginx的安装与入门

配置文件内容如下:

server {
  # 这里任意没被用过的端口都行
  listen 4433;
  # IPv6地址格式,这里忽略
  # listen [::]:4433;
  server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址
  
  # on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
  underscores_in_headers on;

  charset utf-8;

  # 设置客户端请求body的最大允许大小,默认1m
  client_max_body_size 100m;

  # 内部进行转发
  location / {
    proxy_pass http://127.0.0.1:8080; # 服务器内部真正处理业务的服务
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

执行nginx校验配置文件命令:nginx -t

如果没问题,就热更新nginx配置执行命令:nginx -s reload

Nginx代理配置(网关服务器)

先进入到存放服务器证书和证书链的文件夹,记录一下路径。

然后进入到nginx的配置文件路径:cd /etc/nginx/conf.d/

编辑生成一个新的配置文件:vi xxx.conf

注:下面配置仅为示例,可以自行补充扩展,以及注意地址、域名要改成正确的

注:关于 Nginx 更详细的介绍,可以参考文章:Linux nginx的安装与入门

配置文件内容如下:

server {
  listen 443 ssl; # https默认是443端口
  # IPv6地址格式,这里忽略
  # listen [::]:443 ssl;
  server_name example.com; # 有域名写域名,没域名写自身IP,需要和服务器证书的CN保持匹配
  
  # on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
  underscores_in_headers on; 

  # 服务端证书配置(网关的SSL证书,给浏览器验证的)
  ssl_certificate      /path/ssl/example.crt;
  ssl_certificate_key  /path/ssl/example.key;

  # ssl协议
  ssl_protocols TLSv1.2 TLSv1.3;
  # ssl 加密套件
  ssl_ciphers HIGH:!aNULL:!MD5;

  charset utf-8;

  # 设置客户端请求body的最大允许大小,默认1m
  client_max_body_size 100m;

  # 内部进行转发
  location / {
    # 代理转发的目标应用服务器地址和端口,注意是https
    proxy_pass http://5.6.7.8:4433;

    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

执行nginx校验配置文件命令:nginx -t

如果没问题,就热更新nginx配置执行命令:nginx -s reload

实际测试

启动应用服务器的业务处理服务,然后用浏览器访问网关服务器,如果访问正常,就说明配置正确。

访问示例:

  • 如果网关服务器配置的是域名+443端口,则访问: https://example.com

  • 如果网关服务器配置的是IP+443端口,则访问:https://1.2.3.4

  • 如果网关服务器配置的是域名+非443端口(如12312),则访问: https://example.com:12312


Comment