Nginx配置反向代理隐藏服务端口

前言

对于个人开发者来说,在一台 Linux 服务器或自己的 VPS 上,通常会部署多个 Web 服务,有的服务默认监听的是 80/443 端口,只需对 Nginx 进行简单的配置、设置伪静态等等即可完成,而有的服务既非静态网页,也不使用 Linux 中既有的 PHP 等程序,而是使用自己项目内部构建的程序(比如 Node.js、Tomcat 等),这些服务往往监听的是非 80/443 端口,在配置个人域名后,不得不在域名后加上服务器端口才能访问,既不美观,也不方便。是否有办法可以隐藏 URL 中的服务器端口,使用域名进行区分?

例如: http://1.1.1.1:1111 -> http://1.example.com http://1.1.1.1:2222 -> http://2.example.com http://example.com:3333 -> http://3.example.com

代理服务器的类型

与代理服务器相关的概念,主要有正向代理、反向代理、透明代理。这三者的关系在这篇文章里介绍的很清楚,在此言简意赅地做举例梳理: 假设有客户端 A代理服务器 BWeb 服务器 C

  • 正向代理客户端 A代理服务器 B 发送一个请求并指定 Web 服务器 C 为目标,代理服务器 B 转交请求并将获得的内容返回给 客户端 A。主要实践是突破网络封锁的各类工具。

  • 反向代理客户端 A 类似于 Web 服务器,发出的内容和请求将由 代理服务器 B 进行判断分发,客户端 A 不知道 代理服务器 B 的存在。主要实践是 WEB 服务。

  • 透明代理客户端 A 不知道 代理服务器 B 的存在,在访问 服务器 C 时,由 代理服务器 B 代为访问,但 代理服务器 B 对报文进行改写和过滤。主要实践是公司内部的网络管理系统(如深某服)。

反向代理的意义

  1. 如前言所述,把不同的子域名转发到同一机器的不同的服务上。
  2. 进一步地,把不同的请求转发到不同的服务器上——即负载均衡。
  3. 隐藏实际服务,提升安全性

配置 Nginx 反向代理

实际上对前沿所述的情况,针对某个服务进行 Nginx 反向代理配置很简单,下面是监听域名 example.com 并转发到 8080 端口的例子:

server {
    listen   80;
    server_name  example.com;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    location / {
        proxy_pass http://127.0.0.1:8080/;
    }
}

另外一篇文章中,我看到了如下示例:

upstream webServer01 {
    server 127.0.0.1:3001;
    keepalive 64;
}

upstream webServer02 {
    server 127.0.0.1:3002;
    keepalive 64;
}

server {
    listen 80;
    server_name www.myApp01.com;
    #access_log /var/log/nginx/test.log;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Nginx-Proxy true;
        proxy_set_header Connection "";
        proxy_pass       http://webServer01;

    }

}

server {
    listen 80;
    server_name www.myApp02.com;
    #access_log /var/log/nginx/test.log;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Nginx-Proxy true;
        proxy_set_header Connection "";
        proxy_pass       http://webServer02;
    }
}

这一配置也能实现以 www.myApp01.com 访问时,将进入webServer01,当我们以 www.myApp02.com 访问时,将进入webServer02。其中已经用到的 upstream 模块就是用来配置负载均衡的。关于负载均衡的详细资料,可以参考Nginx 开发从入门到精通

宝塔面板配置

如果使用了宝塔面板进行建站,可以在面板菜单【网站】中对特定网站进行设置,转发 1200 端口的例子如下图:

宝塔面板配置网站反向代理


参考链接: 图解正向代理、反向代理、透明代理 Nginx 反向代理的一次使用总结 Nginx 开发从入门到精通

updatedupdated2023-09-272023-09-27