原本是只想学习 Nginx 的,然而想来只学 Nginx 学过来有些狭隘,因为当初反向代理服务器
什么是代理?
作为一个沪漂程序员,听到代理这个词,我下意识的想到了中介,当初在上海曾经很少能找到房东看房子了,基本上都是从中介那里看房,从这个角度来说中介代理了房东的局部职责,带你看房。在汉语词典中也是这么阐释的,待别人处理事务。那咱们给代理后面加上正向这个词呢,这也就成为了计算机领域内的专有名词,正向代理。
什么是正向代理?
那什么是正向代理呢,我想起大学的上机课,为了让咱们好好学习,上机课的电脑是无奈看到一些娱乐网站的, 比方知乎、腾讯游戏。因为有同学的确在课上打游戏,丝毫不听课。学校如同意识到了问题的不对,加上了限度,再一次上课的咱们,就发现一些娱乐网站上不了了。是通过网络白名单来进行的限度,那有什么办法可能绕开这个限度呢,答案就是代理,上网的时候,流量先达到咱们的代理服务器,获取到内容之后,再给咱们。像上面这样:
这是代理服务器的第一个用途,绕开浏览限度,一些学校和其余组织应用防火墙来使用户拜访受限制的互联网。代理服务器能够用于绕开这些限度,因为它们使用户能够连贯到代理服务器,而不是间接连贯到它们正在拜访的沾点。与之绝对,咱们也能够应用代理服务器来组织特定用户群拜访某些站点,比方学校网络可能配置为通过启动内容筛选规定的代理连贯到 Web,不在白名单的,回绝转发响应。某些场景下,互联网用户也心愿爱护本人的在线身份,在一些状况下,互联网用户心愿加强其在线匿名性,比方不想显示本人的实在 ip,如果咱们用代理服务器来拜访互联网,发表评论的时候就更难追溯到实在 ip。这是正向代理,咱们能够认为正向代理,代理的是人。
什么是反向代理?
那反向代理呢,反向代理代理的则是服务器,有的时候咱们并不违心将咱们的服务端利用残缺的裸露进来,这会增大服务端被攻打的危险,这也就是反向代理服务器,如下图所示:
图片来自 ByteByteGo。反向代理服务器能够帮忙咱们爱护服务端,同时也能够帮咱们做负载平衡,缓存动态资源,加密和解密 SSL 申请。本篇咱们的重头戏就是反向代理服务器。
反向代理服务器
想我刚实习的时候,因为会的比拟少,感觉本人用的技术比拟没有逼格,听到 Nginx、Redis 这些名词的时候,心里总是有几分敬畏,觉得很有感觉。那反向代理服务器有哪些呢?比拟出名的是 Nginx,网站用的什么服务器解决申请,有些网站能够在响应中看到,咱们首先看下掘金有没有申明本人用的是什么服务器解决的申请:
是 Nginx,原本我认为反向代理服务器会应用一个,我扒了扒其余申请,发现不是:
这个 Tengine 是啥,咱们搜寻一下:
原来是基于 Nginx 的 HTTP 服务器,咱们进他的官网看看:
在原来 Nginx 的根底上,针对大访问量网站的需要,增加了很多高级性能和个性。那能够了解为 Nginx Plus 嘛,那咱们天然就会有一个问题,既然 Tengine 比 Nginx 更弱小,为什么没有取代 Nginx 呢? 写到这里,忽然想起一句话,物竞天择,适者生存。不是更弱小的齐全就能齐全取代弱的,适合的,适宜环境的,天然可能生存下来。bing 还贴心的搜出了上面这个问题:
既然 Tengine 比 Nginx 更弱小,为什么没有取代 Nginx 呢?
这个问题来自于知乎,上面节选一下我认为比拟不错的答复:
开源软件的模式从来不是谁取代谁,而是百花齐放,博采众长。若意见不合,也欢送自立门户。
写到这里,想起知乎之前看到的一个问题:
Cloudflare 弃用 NGINX,改用 Rust 编写的 Pingora,你怎么看?
还真是白花齐放哈,又来了一个 Pingora,对于 Pingora,咱们目前就权且了解到另一个反向代理服务器吧,对于 Cloudflare 为什么用 Pingora 取代 Rust,参看上面这篇文章: https://blog.cloudflare.com/zh-cn/how-we-built-pingora-the-pr…。
在下面的知乎问答中,我又看到了其余方向代理服务器:
- BFE
BFE (Beyond Front End) 是百度开源的现代化、企业级的七层负载平衡零碎。应用 Go 编写。
对应的文章参看: 为什么 BFE 能够取代 Nginx:十问十答 https://zhuanlan.zhihu.com/p/533272410
- Higress
Higress 是基于阿里外部两年多的 Envoy Gateway 实际积淀,以开源 Istio 与 Envoy 为外围构建的下一代云原生网关。Higress 实现了平安防护网关、流量网关、微服务网关三层网关合一,能够显著升高网关的部署和运维老本。
这些只做理解,咱们的重头戏还在 Nginx 上。
Nginx 入门
本篇的定位是入门,会简略应用即可。下面的的理解是从宏观上意识的 Nginx,当初让咱们走进 Nginx 官网,去看看 Nginx。
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex Mail.Ru , VK , and Rambler . According to Netcraft, nginx served or proxied 21.23% busiest sites in February 2023 . Here are some of the success stories: Dropbox , Netflix, WordPress.com, FastMail.FM
nginx(engine x 的缩写) 是一个 HTTP 代理服务器,邮箱代理服务器,通用的 TCP/UDP 代理服务器。原作者为 Igor Sysoev。长期以来,工作在一些负载很重的俄罗斯网站,包含 Yandex、Mail.Ru、VK、Rambler。依据 Netcraft 的调研报告显示,2023 年 2 月,最忙碌的网站中,21.23% 都由 Nginx 提供服务或进行代理。
这里做到对 Nginx 有个根本印象,其余个性咱们放到前面来讲,咱们当初首先将 Nginx 装起来,咱们仍然在官网寻找,看看有没有写好的命令,让咱们复制一下就能够让 Nginx 跑起来的命令。
很全面,咱们就跟着文档走就行了:
# 装置 Nginx
sudo yum install yum-utils
cd /etc/yum.repos.d
# 创立 Nginx.repo
touch nginx.repo
# 而后在 Nginx.repo 外面增加配置
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# 而后执行上面命令
yum install nginx
执行完下面的命令,我发现我把 Nginx 装置到了 etc 目录下,那如何确定安装文件的地位呢:
# 执行上面命令,会找到装置的文件名
rpm -qa|grep nginx
rpm -ql 上一步找到的文件名
个别在 Linux 上装置第三方软件,咱们举荐装置在 /opt 上面,当初让咱们给 Nginx 挪一挪窝:
mv /etc/nginx /opt/nginx
挪过来之后发现,启动不行,我又挪回去了。这里先不深究了。
咱们当初来简略的看下 Nginx 的目录构造:
貌似惟一意识的就是 nginx.conf,反向代理和负载平衡应该就是在这里配置的,要不,咱们先让 Nginx 启动下,给本人一点成就感:
nginx
默认配置中,Nginx 会主动在 80 端口(HTTP)上提供一个欢送页面,如果可能胜利拜访该页面,则示意 Nginx 曾经胜利启动。像上面这样:
接着咱们来配置反向代理和负载平衡,首先我是一名 Java 程序员,我有一个服务端我的项目,我当初做了集群,一共是两个节点,我心愿为这两个节点提供负载平衡和反向代理, 那应该怎么配置呢?这也就是反向代理。咱们关上 nginx 上面的 nginx.conf 配置文件
events {worker_connections 1024;}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格局
log_format main '$remote_addr - $remote_user [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';
# 日志所在位置
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#蕴含 /etc/nginx/conf.d/ 门路下所有后缀为.conf 的配置文件
include /etc/nginx/conf.d/*.conf;
}
在 /etc/nginx/conf.d 有一个配置文件叫 default.conf,外面是一个 server{} 格局的代码块,所以在 Nginx 的根本配置格局:
http{server {}
}
解决申请首先要申明你要解决什么申请,比方咱们有个利用驻留在 8080 端口,根门路是 test,所以所有申请根门路的最前缀是 test,都转发到这个利用。
反向代理
那咱们应该在这个配置文件的 http 语法块下写一个 server 语法块:
server{
listen 8080;
location /test{proxy_pass http://192.168.2.2:8080/test;}
}
nginx 临时监听的是本机,那么所有本机 ip,端口 8080,根门路是 test 的申请都会被转发到 http://192.168.2.2:8080/test。而后 nginx -s reload 从新加载配置文件即可。反向代理好了,当初咱们来做负载平衡。
负载平衡
Nginx 反对的负载平衡策略:
- round-robin — requests to the application servers are distributed in a round-robin fashion,
申请被被利用循环承受
- least-connected — next request is assigned to the server with the least number of active connections,
当一个新的申请与须要被解决时,零碎会查找所有的服务器,并且抉择以后连贯数量起码的服务器来解决这个申请。
- ip-hash — a hash-function is used to determine what server should be selected for the next request (based on the client’s IP address).
依据客户端的 ip 地址,通过 hash 算法来决定应该有哪个服务器解决申请。
根本语法:
upstream myapp1 {
# ip_hash; 这里申明负载平衡算法, 候选值有:ip_hash、least_conn
# 默认是轮询
server 192.168.2.2:8080;
server 192.168.2.2:8081;
}
server{
listen 8080;
location /test{proxy_pass http://myapp1/test;}
}
之间的映射关系如下图所示:
nginx 反对热加载,语法如下:
nginx -s signal
signal 的取值为: stop、quit、reload、reopen。stop — fast shutdown 疾速进行
quit — graceful shutdown 优雅的进行
reload — reloading the configuration file 再次加载配置文件
reopen — reopening the log files 再次关上日志文件
总结一下
到当初为止,咱们对正向代理、反向代理曾经有了一个大抵的印象,并且咱们可能应用 Nginx 来搭建负载平衡和反向代理。原本还打算介绍一下 Nginx 作为动态资源的服务器,发现映射过来老是 403,折腾好久,遂放弃。
参考资料
- Why is Nginx called a“reverse”proxy? https://blog.bytebytego.com/p/ep25-proxy-vs-reverse-proxy#%C2…
- 为什么 BFE 能够取代 Nginx?https://zhuanlan.zhihu.com/p/528485453
- 深刻分析 Nginx 负载平衡算法 https://www.taohui.tech/2021/02/08/nginx/%E6%B7%B1%E5%85%A5%E…