nginx之反向代理与端口转发
反向代理
- 反向代理是指客户端不直接访问服务端,而是通过反向代理服务器来访问服务端资源。反向代理服务器负责转发客户端请求,并将响应结果返回给客户端。通常情况下,反向代理服务器的IP地址对于客户端来说是可见的,而服务端的IP地址则是不可见的。
- 反向代理通常用于隐藏服务端的真实IP地址,提高系统的安全性和稳定性。同时,反向代理还可以实现负载均衡、缓存加速等功能。
- proxy_pass 作用是nginx的反向代理,用的是nginx的 Proxy 模块
- 以下示例 Nginx 监听
80端口,当客户端请求example.com域名时,会将请求转发到nacos8848(即服务端),并在HTTP头中添加Host和X-Real-IP信息。
http {
upstream nacos8848{
ip_hash;
server 10.30.4.151:8848 max_fails=5 fail_timeout=300s weight=5;
server 10.30.4.152:8848 max_fails=5 fail_timeout=300s weight=5;
}
server {
listen 80;
index index.html index.htm;
server_name example.com;
location / {
proxy_pass http://nacos8848;
proxy_read_timeout 360;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
端口转发
- 端口转发是指将来自一个端口的数据包转发到另一个端口。通常情况下,在网络中应用层协议只监听一种端口,因此需要端口转发来实现不同应用程序之间的互访。
- 以下示例通过 Nginx 将 HTTP 请求转发到 java 服务器的
8100端口上
stream {
upstream java8100{
ip_hash;
server 10.30.3.201:8100 max_fails=5 fail_timeout=300s weight=5;
server 10.30.3.202:8100 max_fails=5 fail_timeout=300s weight=5;
}
server {
listen 8100;
proxy_pass java8100;
proxy_timeout 300s;
}
}
- 以下是 sqlserver 主备的场景(只有201宕机才会访问202):
注1:要在Nginx中实现SQL Server的主备模式,核心是使用stream模块中的backup参数。通过这个配置,可以让Nginx只将流量转发给当前健康的主库,只有当主库故障时,备库才会被启用。
stream {
upstream sqlserver_100{
server 10.30.3.201:1433 max_fails=3 fail_timeout=60s;
server 10.30.3.202:1433 backup max_fails=3 fail_timeout=60s;
}
server {
listen 1433;
proxy_pass sqlserver_100;
proxy_timeout 60s;
}
}
注2:由于直连正常但nginx转发却异常,为了排查,开启对所有 stream 流量的日志记录
stream {
# 1. 定义日志格式
log_format main '$remote_addr [$time_local] $protocol $status '
'$bytes_sent $bytes_received $session_time';
# 2. 启用访问日志
access_log ./logs/stream.log main;
# 3.其他不变
}
如何区分
- 端口转发也属于一种反向代理
- 端口转发需要编译nginx的时候指定 --with-stream,而反向代理没有此限制
- 反向代理主要用来转发http或https请求,端口转发主要用来转发tcp请求