前言

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

代理服务器的类型

与代理服务器相关的概念,主要有正向代理、反向代理、透明代理。这三者介绍的很清楚,在此言简意赅地做举例梳理:

假设有​​客户端 A​​、​​代理服务器 B​​、​​Web 服务器 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


参考链接:

​图解正向代理、反向代理、透明代理​

​Nginx 反向代理的一次使用总结​

​Nginx 开发从入门到精通​