关于nginx:反向代理学习笔记一-Nginx与反向代理绪论

4次阅读

共计 5520 个字符,预计需要花费 14 分钟才能阅读完成。

原本是只想学习 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…
正文完
 0