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

Nginx HTTP/HTTPS反向代理

本文默认只有一台服务器,且已经安装了 Nginx

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

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

注:本文只是一个场景示例,不必纠结于生产实际是否长这样。

配置防火墙

在正式配置 反向代理 之前,我们需要确保 Nginx要监听的端口是对外开放的(例如HTTPS默认端口443)。

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

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

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

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

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

如果是云服务器,则还要保证 安全组 配置了 Nginx要监听的端口允许外部访问!!!

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

正常启动应用服务

怎么启动你的应用服务不是本文内容,所以不进行说明。

不过,不管怎样,此时你应该要明确这几件事:

  • 如果反向代理的是静态文件(如前后端分离项目的前端静态文件),则文件路径是在哪

  • 如果反向代理的是一个服务(比如运行的JAR包服务),则这个服务监听的端口是什么,比如SpringBoot项目常见的8080端口。(被代理的端口不必允许外部访问)

Nginx代理配置(HTTP)

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

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

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

注:下面配置仅为示例,可以自行补充扩展,以及注意IP地址域名静态文件访问路径 要改成正确的

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

静态文件时配置文件内容如下:

server {
  # HTTP默认访问80端口
  listen 80;
  # IPv6地址格式,这里忽略
  # listen [::]:80;
  server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址
  
  location / {
      root /path/dist; # 请求的根路径,即虽然可能请求时只输入了 IP:Port/ , 但是最终Nginx处理时会变成 IP:Port/path/dist/
      index index.html index.htm; # 定义索引文件,即如果路径只输入到/,则内部会重定向加载index匹配到的文件
  }
    
  # 定义发生特定错误时给访问者展示的页面
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   /usr/share/nginx/html;
  }
}

代理服务时配置文件内容如下:

server {
  # HTTP默认访问80端口
  listen 80;
  # IPv6地址格式,这里忽略
  # listen [::]:80;
  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代理配置(HTTPS)

此处默认已经申请并有 SSL证书。SSL证书需要区分两种情况:

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

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

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

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

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

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

静态文件时配置文件内容如下:

server {
  # HTTPS默认访问443端口
  listen 443 ssl;
  # IPv6地址格式,这里忽略
  # listen [::]:443 ssl;
  server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址,需要和服务器证书的CN保持匹配

  # 允许客户端与服务端的连接保持活跃时长,以减少频繁的SSL握手
  keepalive_timeout 75s;
  
  # on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
  underscores_in_headers on; 

  # 服务端证书配置
  ssl_certificate      /path/ssl/5678.crt; # 证明自身的服务器证书
  ssl_certificate_key  /path/ssl/5678.key; # 证明自身的私钥 
  # ssl协议
  ssl_protocols TLSv1.2 TLSv1.3;
  # ssl cipher套接字
  ssl_ciphers HIGH:!aNULL:!MD5;

  charset utf-8;

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

  location / {
      root /path/dist; # 请求的根路径,即虽然可能请求时只输入了 IP:Port/ , 但是最终Nginx处理时会变成 IP:Port/path/dist/
      index index.html index.htm; # 定义索引文件,即如果路径只输入到/,则内部会重定向加载index匹配到的文件
  }

  # 定义发生特定错误时给访问者展示的页面
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   /usr/share/nginx/html;
  }
}

代理服务时配置文件内容如下:

server {
  # HTTPS默认访问443端口
  listen 443 ssl;
  # IPv6地址格式,这里忽略
  # listen [::]:443 ssl;
  server_name 5.6.7.8; # 有域名写域名,无域名写自身IP地址,需要和服务器证书的CN保持匹配

  # 允许客户端与服务端的连接保持活跃时长,以减少频繁的SSL握手
  keepalive_timeout 75s;
  
  # on为开启将客户端请求头中带有下划线的字段标识为无效字段,默认为off
  underscores_in_headers on; 

  # 服务端证书配置
  ssl_certificate      /path/ssl/5678.crt; # 证明自身的服务器证书
  ssl_certificate_key  /path/ssl/5678.key; # 证明自身的私钥
  # 验证客户端的CA链(如果是客户端单向验证服务端,则这里不需要配置)
  ssl_client_certificate /path/ssl/1234CaChain.pem;
  # 开启校验客户端(如果是客户端单向验证服务端,则这里为off)
  ssl_verify_client on; 
  # ssl协议
  ssl_protocols TLSv1.2 TLSv1.3;
  # ssl cipher套接字
  ssl_ciphers HIGH:!aNULL:!MD5;
  # 设置验证客户端证书链的深度,默认是1(如果是客户端单向验证服务端,则这里不需要配置)
  ssl_verify_depth 10;

  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监听的端口,如前文中配置的 80端口(HTTP)、443端口(HTTPS)访问资源,如果访问正常,就说明配置正确。

  • 如果是80端口,则可以像这样访问:http://5.6.7.8

  • 如果是443端口,则可以像这样访问:https://5.6.7.8

  • 如果是其他端口(如1234端口),则可以像这样访问:http://5.6.7.8:1234

可以看出,如果是协议默认端口,则访问时不需要附带端口号,如果不是协议默认端口,访问时就需要附带端口号。


Comment