前言
对于个人开发者来说,在一台 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
、代理服务器 B
、Web 服务器 C
:
-
正向代理:
客户端 A
向代理服务器 B
发送一个请求并指定Web 服务器 C
为目标,代理服务器 B
转交请求并将获得的内容返回给客户端 A
。主要实践是突破网络封锁的各类工具。 -
反向代理:
客户端 A
类似于 Web 服务器,发出的内容和请求将由代理服务器 B
进行判断分发,客户端 A
不知道代理服务器 B
的存在。主要实践是 WEB 服务。 -
透明代理:
客户端 A
不知道代理服务器 B
的存在,在访问服务器 C
时,由代理服务器 B
代为访问,但代理服务器 B
对报文进行改写和过滤。主要实践是公司内部的网络管理系统(如深某服)。
反向代理的意义
- 如前言所述,把不同的子域名转发到同一机器的不同的服务上。
- 进一步地,把不同的请求转发到不同的服务器上——即负载均衡。
- 隐藏实际服务,提升安全性
配置 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 端口的例子如下图: