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

1|0代理

  

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

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

  

2|0正向代理

  

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

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

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

  

  

  正向代理的用途

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

  

3|0反向代理

  

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

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

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

  

  

  反向代理的用途

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

  

4|0负载均衡

  

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

  

  

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

  

5|0总结

  

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

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

  

6|0Nginx 反向代理与负载均衡

  

  

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

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

  官网:http://nginx.org/

  

6|1环境

  

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

  

6|2安装 Nginx

  

1|0下载资源

  

  下载 Nginx 并解压。

# 下载 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

  

1|0安装依赖

  

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

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

  

1|0安装 Nginx

  

  编译并安装。

# 切换至 nginx 的解压目录 cd /usr/local/src/nginx-1.18.0 # 创建 nginx 的安装目录 mkdir -p /usr/local/nginx # 指定 nginx 的安装路径 ./configure --prefix=/usr/local/nginx/ # 编译并安装 make && make install

  

1|0常用命令

  

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

  

1|0帮助

  

# 切换目录 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|0查看版本

  

# 查看版本 [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|0检查配置

  

# 检测配置文件是否有语法错误,默认检测 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|0启动

  

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

  

1|0重启

  

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

  

1|0停止

  

# 快速停止 sbin/nginx -s stop # 完整有序的停止 sbin/nginx -s quit

  

1|0日志切割

  

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

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

  日志切割实现流程如下:

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

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

  

1|0访问

  

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

  

6|3安装 Tomcat

  

1|0下载资源

  

  下载 Tomcat 并解压。

# 下载 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

  

1|0修改页面

  

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

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

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

<h1 style="color:red">192.169.10.102:8080</h1> <h1 style="color:red">192.169.10.103:8080</h1>

  

1|0启动访问

  

  /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/ 结果如下:

  

6|4配置 Nginx

  

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

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

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

  

6|5反向代理负载均衡

  

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

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

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

  

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

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


__EOF__

本文作者哈喽沃德先生
本文链接https://www.cnblogs.com/mrhelloworld/p/nginx.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   哈喽沃德先生  阅读(8765)  评论(6编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示