个人 二维码




公众号二维码

目录

一篇文章搞定 Nginx 反向代理与负载均衡


代理

  

  要想弄明白反向代理,首先要知道啥是正向代理,要搞懂正向代理只需要知道啥是代理即可。代理其实就是一个中介,在不同事物或同一事物内部起到居间联系作用的环节。比如买票黄牛,房屋中介等等。

  在互联网中代理更多指的是代理服务器,代理服务器位于客户端和服务器之间,它充当两者之间的中介。这种代理在生活中是比较常见的,比如我们常说的科学上网,用到的就是代理技术。

  

正向代理

  

  正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

  比如国内访问谷歌,直接访问是不行的,我们可以通过一个能够访问谷歌的正向代理服务器,请求发到代理服务器,由代理去谷歌获取数据并返回,这样就变相的实现了访问谷歌的需求。

  一句话总结:正向代理,就是代理服务器代理了客户端,去和目标服务器进行交互。

  

https://mrhelloworld.com/resources/articles/nginx/timg.jpg

  

  正向代理的用途

  • 突破 IP 访问限制
  • 通过缓存加速访问资源
  • 隐藏客户端真实 IP
  • 客户端访问授权

  

反向代理

  

  反向代理(Reverse Proxy):与正向代理正好相反,反向代理中的代理服务器,代理的是服务器那端。代理服务器接收客户端请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器的角色。

  反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。

  一句话总结:反向代理,就是代理服务器代理了目标服务器,去和客户端进行交互。

  

https://mrhelloworld.com/resources/articles/nginx/image-20200928153021318.png

  

  反向代理的用途

  • 隐藏服务器真实 IP
  • 负载均衡
  • 通过缓存加速访问资源
  • 提供安全保障

  

负载均衡

  

  实际生产环境中,反向代理服务器代理的目标服务器可能不止一个。比如开发好的某个应用部署在一台 Tomcat 服务器上,而 Tomcat 的并发上限不优化情况下,默认只有两百左右,这时候为了解决高并发的问题,就只能选择更替服务器或者搭建多台服务器通过反向代理与负载均衡的技术解决并发问题。

  

https://mrhelloworld.com/resources/articles/nginx/timg-1601280894041.jpg

  

  负载均衡(Load Balance)是由多台服务器以对称的方式组成一个服务器集群,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。经过某种负载分管技术,将外部发送来的中央请求均匀分配到对称结构中的某一台服务器上。

  

总结

  

  正向代理,就是代理服务器代理了客户端,去和目标服务器进行交互。现实生活中的场景:黄牛买票。

  反向代理,就是代理服务器代理了目标服务器,去和客户端进行交互。现实生活中的场景:房屋中介。

  

Nginx 反向代理与负载均衡

  

https://mrhelloworld.com/resources/articles/nginx/nginx.png

  

  前面我们提到搭建多台服务器并通过反向代理与负载均衡的技术可以解决并发问题,那么负载均衡的实现从哪来?为了避免重复造轮子,我们选择现成已有的成熟工具帮助我们完成这项工作。Nginx 就是一个不错的选择。

https://mrhelloworld.com/resources/articles/nginx/timg-1601278769063.jpg

  Nginx 是由 Igor Sysoev(伊戈尔 · 赛索耶夫)为俄罗斯访问量第二的 https://www.rambler.ru/ 站点开发的。Nginx 是一个高性能的 HTTP 和反向代理服务器,可以扛得住 5W 左右的并发。Ngnix 一方面可以做反向代理服务器,另外一方面还可以做静态资源服务器。本文主要学习如何使用 Nginx 实现反向代理与负载均衡。

  官网:http://nginx.org/

  

环境

  

  • 三台 CentOS 7.8.2003 机器
  • 192.168.10.101 安装 Nginx 1.18.0
  • 192.168.10.102192.168.10.103 安装 Tomcat 9.0.38

  

安装 Nginx

  

下载资源

  

  下载 Nginx 并解压。

1
2
3
4
# 下载 nginx 压缩包
wget -P /usr/local/src http://nginx.org/download/nginx-1.18.0.tar.gz
# 解压
tar -zxvf /usr/local/src/nginx-1.18.0.tar.gz -C /usr/local/src

  

安装依赖

  

  Nginx 是基于 C 语言开发的,HTTP 模块使用了 pcre 来解析正则表达式,且可以使用 zlib 对 HTTP 包的内容进行 gzip 压缩,Nginx 不仅支持 HTTP 协议,还支持 HTTPS,HTTPS 需要 openssl 提供支持,所以安装 Nginx 之前必须先安装它所依赖的环境。

1
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl-devel

  

安装 Nginx

  

  编译并安装。

1
2
3
4
5
6
7
8
# 切换至 nginx 的解压目录
cd /usr/local/src/nginx-1.18.0
# 创建 nginx 的安装目录
mkdir -p /usr/local/nginx
# 配置 nginx 的安装目录
./configure --prefix=/usr/local/nginx/
# 编译并安装
make && make install

  

常用命令

  

  Nginx 运行时默认加载的配置文件为 nginx.conf,根据不同的安装方式存放的位置也不相同。yum 安装的方式会存放在 /etc/nginx/nginx.conf,本文的安装方式会存放在 /usr/local/nginx/conf/nginx.conf

  

帮助

  

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 切换目录
cd /usr/local/nginx

# 帮助
[root@localhost nginx]# sbin/nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/local/nginx//)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file

  

查看版本

  

1
2
3
4
5
6
7
8
9
# 查看版本
[root@localhost nginx]# sbin/nginx -v
nginx version: nginx/1.18.0

# 查看版本及配置选项
[root@localhost nginx]# sbin/nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
configure arguments: --prefix=/usr/local/nginx/

  

检查配置

  

1
2
3
4
# 检测配置文件是否有语法错误,默认检测 conf/nginx.conf
[root@localhost nginx]# sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

  

启动

  

1
2
# 启动并通过 -c 指定启动时加载的配置文件,默认加载 conf/nginx.conf
sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  

重启

  

1
2
# 平滑的重启,重新加载配置
sbin/nginx -s reload

  

停止

  

1
2
3
4
5
# 完整有序的停止
sbin/nginx -s quit

# 快速停止
sbin/nginx -s stop

  

日志切割

  

1
2
# 重新打开日志文件(日志切割)。
sbin/nginx -s reopen

  比如我们把架设在 Nginx 上的所有网站访问日志都存放在一个文件里,这样日积月累所有网站的访问记录就会把日志文件越积越大,当需要查看日志文件的时候就会变得非常麻烦。如果把每天的日志文件分割开来用相应的日期进行标识,查看日志的操作就会变得非常友好了。

  日志切割实现流程如下:

  • 移动原文件到新文件目录中。其实这个时候 Nginx 还是会继续将日志写入该文件。
  • 执行 nginx -s reopen 打开一个新的日志文件,Nginx 会把新的日志信息写入该文件。

  这样就完成了日志的切割工作,同时切割过程中也不会丢失任何日志信息。

  

访问

  

  启动 Nginx 以后,浏览器访问:http://192.168.10.101:80/ 结果如下:

https://mrhelloworld.com/resources/articles/nginx/image-20200928165146842.png

  

安装 Tomcat

  

下载资源

  

  下载 Tomcat 并解压。

1
2
3
4
5
6
# 下载 tomcat 压缩包
wget -P /usr/local/src https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.tar.gz
# 创建目录
mkdir -p /usr/local/tomcat
# 解压
tar -zxvf /usr/local/src/apache-tomcat-9.0.38.tar.gz -C /usr/local/tomcat

  

修改页面

  

  修改 Tomcat 自带 ROOT 项目中的 index.jsp 页面。

1
2
# 编辑 index.jsp
vim /usr/local/tomcat/apache-tomcat-9.0.38/webapps/ROOT/index.jsp

  在 body 标签中随便添加点内容用于区分不同的服务器。

1
2
<h1 style="color:red">192.169.10.102:8080</h1>
<h1 style="color:red">192.169.10.103:8080</h1>
https://mrhelloworld.com/resources/articles/nginx/image-20200928170233146.png
https://mrhelloworld.com/resources/articles/nginx/image-20200928170011859.png

  

启动访问

  

  /usr/local/tomcat/apache-tomcat-9.0.38/bin/startup.sh 启动 Tomcat。

  启动 Tomcat 以后,浏览器访问:http://192.168.10.102:8080/ 和 http://192.168.10.103:8080/ 结果如下:

https://mrhelloworld.com/resources/articles/nginx/image-20200928170555573.png
https://mrhelloworld.com/resources/articles/nginx/image-20200928170635264.png

  

配置 Nginx

  

  vim /usr/local/nginx/conf/nginx.conf 编辑配置文件。

  在 http 节点下,添加 upstream 节点。使用 upstream name{} 语法定义一组服务器。

  然后在 server 节点的 80 端口下添加下图中的内容。默认情况下,Nginx 是按加权轮询的方式将请求分发到各个服务器,当权重 weight 不指定时,各服务器 weight 相同。关于 Nginx 启动用户的问题请根据自身实际环境进行配置。

https://mrhelloworld.com/resources/articles/nginx/image-20200928171300565.png

  

反向代理负载均衡

  

  通过上面的流程,我们已经完成基于 Nginx 实现反向代理 Tomcat 服务器集群与负载均衡的需求。重启 Nginx 以后,此时再访问 Nginx 则会被路由到被代理的 Tomcat 服务器上,并且采用了轮询方式(默认)的负载均衡算法。客户端请求到 Nginx 的中央请求会每台一次的平均分配至 Tomcat 每个机器上。关于 Nginx 更多详细的配置及负载均衡算法我们后面再另开文章细说。

https://mrhelloworld.com/resources/articles/articles_bottom/end02.gif

本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议

大家可以通过 分类 查看更多关于 Nginx 的文章。

  

🤗 您的点赞转发是对我最大的鼓励和支持。

📢 扫码关注 哈喽沃德先生「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢 ~

https://mrhelloworld.com/resources/mrhelloworld/qrcode/OfficialAccounts500-500.gif
「 感谢支持 」