文章摘要(AI生成)
答案:nginx反向代理nginx反向代理首先我们要理解代理,所谓代理,就是两台机器之间的通信非直接通信,而是通过代理服务进行间接通信。假设我们原来与服务器直接的交互如下:‘添加了代理后,我们的请求会首先通过代理协议发送到代理服务,代理服务再转发到服务器上:根据代理服务部署再客户端(请求方)和服务端
答案:nginx反向代理
nginx反向代理
首先我们要理解代理,所谓代理,就是两台机器之间的通信非直接通信,而是通过代理服务进行间接通信。假设我们原来与服务器直接的交互如下:
‘
添加了代理后,我们的请求会首先通过代理协议发送到代理服务,代理服务再转发到服务器上:
根据代理服务部署再客户端(请求方)和服务端(被请求方)的区别,我们将代理分为正向代理和方向代理。
正向代理:一般用与我们个人电脑上,由于直接访问服务端被拉黑导致访问不了的原因,我们需要通过代理服务来访问。这里常见的应用为加速器、VPN等。
反向代理:一般在服务器端,用来做负载均衡、隐藏服务真实地址、统一访问控制来使用。常见的反向代理工具如nginx,CDN等。
NGINX反向代理: nginx对服务端进行反向代理我们需要通过修改nginx的配置文件nginx.conf
来完成对服务端的代理
nginx配置文件结构
nginx.conf
由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,由空格分隔并以分号 ;
结尾。块指令与简单指令具有相同的结构,但它不是以分号结尾,而是以一组由大括号 {
和}
包围的附加指令。如果块指令可以在大括号内包含其他指令,则称为上下文. nginx.conf
的主要结构如下:
events {
#events块
}
http {
#http全局块
server{
#server块
location [PATTERN] {
#location块
}
}
}
- 全局块:配置运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
同一机器,不同端口的泛域名解析如何做到?
回到本文问题,我们已经了解完反向代理以及nginx相关配置文件了,所以如何实现我们泛域名对同一机器不同端口的反向代理呢?
反向代理写在哪里?
由于是同一台主机的反向代理,所以我们需要将我们的反向代理逻辑写到同一server块中。则我们的伪代码实现如下:
server{
设置监听的主机端口
设置服务名称(域名)、https认证等
location / {
#location块\
如果域名前缀为a,
反向代理到a对应的端口1;
如果域名前缀为b,
反向代理到b对应的端口2;
走默认兜底的代理端口3或返回404;
}
}
及对一个泛域名,采用前缀解析的方式,将不同前缀反向代理到同一机器的不同端口上。
实际我们的配置如下:
server
{
listen 80;
listen 443 ssl http2;
server_name baidu.com ~^(?<subdomain>.+).baidu.com$;
index index.html index.htm default.htm default.html;
location / {
if ($subdomain = "sub-web"){
proxy_pass http://127.0.0.1:1001;
}
if ($subdomain = "dev-data"){
proxy_pass http://127.0.0.1:1002;
}
if ($subdomain = "json"){
proxy_pass http://127.0.0.1:1003;
}
if ($subdomain = "monitor"){
proxy_pass http://127.0.0.1:1004;
}
proxy_pass http://127.0.0.1:1005;
proxy_set_header Host $Host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
proxy_set_header X-Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
思维发散:不同机器的泛域名解析如何做到?
由于是不同主机的反向代理,所以我们需要将我们的反向代理逻辑写到不同server块中。则我们的伪代码实现如下:
server{
设置监听的主机端口
设置子域名a、https认证等
location / {
#location块\
反向代理到a对应的端口1;
}
}
server{
设置监听的主机端口
设置子域名b、https认证等
location / {
#location块\
反向代理到b对应的端口1;
}
}
反向代理的部分的代码是相同的,所以这里不再追写具体实现。总之要想解答本文的问题,我们需要了解nginx,学会nginx每个块指令的作用域,这样才能真正运用好反向代理。
评论区