【愚公系列】2022年04月 .NET架构班 034-分布式中间件 Nginx多场景使用问题分析之反向代理
【摘要】 前言众所周知,nginx是一款高性能的web服务器,常用于负载均衡和反向代理。所谓的反向代理是和正向代理相对应。正向代理即我们常规意义上理解的“代理”:例如正常情况下在国内是无法访问google的,如果我们需要访问,就需要通过一层代理去转发。这个正向代理代理的是服务端(也就是google)。反向代理则相反,代理的是客户端(也就是用户),用户的请求到达nginx后,nginx会代理用户的请求...
前言
众所周知,nginx是一款高性能的web服务器,常用于负载均衡和反向代理。所谓的反向代理是和正向代理相对应。
正向代理
即我们常规意义上理解的“代理”:例如正常情况下在国内是无法访问google的,如果我们需要访问,就需要通过一层代理去转发。这个正向代理代理的是服务端(也就是google)。
反向代理
则相反,代理的是客户端(也就是用户),用户的请求到达nginx后,nginx会代理用户的请求向实际的后端服务发起请求,并将结果返回给用户。
正向代理和反向代理
实际上是站在用户的角度来定义的,正向也就是代理用户所要请求的服务,而反向则是代理用户向服务发起请求。两者一个很重要的区别:
正向代理服务方不感知请求方,反向代理请求方不感知服务方。
一、数据库反向代理
stream {
upstream cloudsocket {
hash $remote_addr consistent;
# $binary_remote_addr;
server 192.168.182.155:3306 weight=5 max_fails=3 fail_timeout=30s;
}
server {
listen 3306;#数据库服务器监听端口
proxy_connect_timeout 10s;
proxy_timeout 300s;#设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。
proxy_pass cloudsocket;
}
#redis
server {
listen 4001;
proxy_pass ***.***.***.***:***;
}
#mongdb
server {
listen 4002;
proxy_pass ***.***.***.***:***;
}
}
二、服务反向代理
2.1 GRPC反向代理
upstream grpcservers {
server 172.17.0.1:13009; # 如果有多个可以定义多次
keepalive 1800; # 保持长连接的秒数。如果不配置这个参数,Nginx 与你的服务之间的连接,大概率会是短连接而不是长连接。
}
server {
listen 443 ssl http2; # gRPC 基于 Http2 协议,非常推荐启用 SSL
# 下面5行根据实际情况进行配置
server_name 你的域名;
access_log 你的域名.log main;
error_log 你的域名.log error;
ssl_certificate 证书.crt;
ssl_certificate_key 证书.key;
# grpc 代理设置
location ~* ^/(.+)\.(.+)/(.+)$ {
grpc_set_header Host $host;
grpc_set_header X-Real-IP $remote_addr;
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
grpc_socket_keepalive on;
grpc_pass grpc://grpcservers;
}
# 你的接口或者站点,如果不需要可以去掉
location / {
index index.html index.htm;
root /var/www/你的域名/html;
}
}
2.2 HTTP反向代理
通过路径区分
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location ~ ^/server1/ {
proxy_pass http://domain1/;
}
location ~ ^/server2/ {
proxy_pass http://domain2/;
}
}
}
通过请求参数区分
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location /service/method {
if ($query_string ~ x_server=(.*)) {
proxy_pass http://$1;
}
}
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)