使用Nginx实现服务器反向代理和负载均衡
前言
同事总问我Nginx做反向代理负载均衡的问题,因此特意留下一篇扫盲贴!
直接部署服务器的风险
假设,我开发了一个网站,然后买了一台Web服务器和一台数据库服务器,直接部署到公共网络上。如下图,网站用户通过手机、平板、台式机等终端设备,连上网络,输入 118.178.109.187 这个地址,我的系统就读取数据库,然后直接返回一个网页。

像这种网站部署的方式在今天的网络部署上特别常见。这种部署方式虽然简单、方便,高效,但是也存在着巨大的安全隐患。为什么呢?那是因为我将所有服务器资源都直接暴露在了公共网络上。直接将服务器暴露在网上的风险特别高。据阿里统计,他们每天在全球范围内,会被黑客攻击大概16亿次。是不是很震惊?我的两台服务器在网上裸奔,没有防火墙,没有安全策略,也不知道其他黑客还掌握了哪些漏洞。因此一旦被各种黑客扫描到了,我的服务器就很容易沦为别人的肉鸡,任人宰割。
所以啊,一旦要直接暴露在网上的服务器都应该是具有强大的安全策略来方式被攻击。比如,防火墙策略要做好,漏洞要修补好,端口不要乱开放等等。而且即便是这样,地球上也没有任何人敢保证他的服务器不被入侵。因此,不被入侵是不可能的了!那么我们应该怎么办呢?我觉得应该增加黑客入侵的门槛,以及减少入侵成功之后的收益。这样费力又不讨好的事情,我相信很多黑客是不愿意做的。
那说了那么多,怎么操作呢?我觉得要暴露在公网上的服务器,必须都应该是不存储任何数据的服务器,即便是服务器挂了。用户虽然不能访问了,但是至少数据不会丢失。 所以常用的策略就是,重要的东西尽量放内网。
如下图,手机、平板、台式机等终端设备通过公网访问反向代理服务器。反向代理服务器上有两张网卡,一张网卡是公共网卡,另一张网卡是局域网网卡。反向代理服务器通过将请求反向代理到192.168.1.1这台Web服务器,Web服务器连接局域网的数据库进行SQL查询操作,然后将数据返回给反向代理服务器,反向代理服务器再将数据通过公网传给终端设备。

这种技术就相对安全一点了,因为只有反向代理服务器直接暴露在公网上了,即便是反向代理服务器被攻击了,只要局域网内的其他服务器不被攻击,也损失不了什么。
反向代理
如何理解反向代理呢?就像刚刚那个图,反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
我们从客户端的视野来看,实际上客户端并不知道真实的服务提供者是哪台服务器,它只知道它请求了反向代理服务器。因此反向代理这种方式又对外隐藏了真实服务器的地址,从一定程度上降低了安全隐患。
在Windows上部署nginx实现Web服务器反向代理和负载均衡
本次主要通过一个例子来演示一下nginx。大概流程为,建立三个网站 分别是 192.168.17.69:20001 ,192.168.17.69:20002 ,192.168.17.69:20003 。我们在浏览器上输入 192.168.17.69 的时候,通过 nginx 反向代理这三个站点,并实现负载均衡。
那么先来介绍一下nginx吧!
nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
nginx 的下载地址 http://nginx.org/en/download.html ,我这边使用的是 Windows 版本 nginx-1.14.2 .,下载完之后解压到文件夹,如图:

nginx的常规配置文件为 conf / nginx.conf

我这边已经配置好了一个最基础的反向代理和负载均衡配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#配置 nginx 的站点为 192.168.17.67 ,反向代理 192.168.17.69:20001 , 192.168.17.69:20002 , 192.168.17.69:20003 三个站点,并实现负载均衡
server {
listen 80;
server_name 192.168.17.69;
location / {
proxy_pass http://web;
index index.html index.htm;
}
}
upstream web {
server 192.168.17.69:20001;
server 192.168.17.69:20002;
server 192.168.17.69:20003;
}
}
server 表示 nginx 服务监听 192.168.17.69 服务器的 80 端口。进行 http 协议反向代理 web ,web下面有三个站点。多个就实现负载均衡。
配置完 nginx 之后,我们将 nginx 运行起来。使用 dos 命令:nginx.exe 或者 start nginx 都可以:

然后我们来访问一下 192.168.17.69




可以看到,我每次刷新 或者 进入 192.168.17.69 的时候,看到的页面都有些不一样。通过观察,我们可以得知,nginx 将我们的请求进行了反向代理和负责均衡。
使用Nginx实现服务器反向代理和负载均衡的更多相关文章
- Nginx的upstream反向代理、负载均衡详解
这篇文章的前提是已经配置好了NGINX,而且tomcat已经配置好了,而且能能够访问了. 说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式. 正向代理最大的特点是客户端非常明 ...
- nginx详解反向代理、负载均衡、LNMP架构上线动态网站(week4_day1_part1)-技术流ken
nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理 ...
- nginx详解反向代理、负载均衡、LNMP架构上线动态网站
简介 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.N ...
- 循序渐进nginx(二):反向代理、负载均衡、缓存服务、静态资源访问
目录 反向代理 使用 1.创建代理目标服务端: 2.配置nginx反向代理目标服务端: 3.测试使用: 负载均衡 使用 1.准备服务端 2.修改nginx配置 3.测试 负载均衡策略 负载均衡的额外参 ...
- Nginx(三):反向代理,负载均衡
环境准备 配置反向代理,负载均衡,动静分离需要的必备环境,JDK,2个tomcat开启8080和8081端口. 安装jdk [root@localhost ~]# rpm -qa|grep jav ...
- Nginx七层反向代理和负载均衡
1.介绍 1.1 Nginx不仅是一个出色的web软件,其七层代理和负载均衡也是相当出色.Nginx做前端代理,当用户请求服务时,可以根据url进行判断,然后分配到不同的后台webserver上. 1 ...
- Nginx 笔记(三)nginx 配置实例 - 反向代理、负载均衡、动静分离
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.反向代理 反向代理准备工作: (1)在 liunx 系统安装 tomcat,使用默认端口 8080 ...
- Nginx反向代理以及负载均衡配置
项目地址:http://git.oschina.net/miki-long/nginx 前提:最近在研究nginx的用法,在windows上小试了一下,由于windows下不支持nginx缓存配置,所 ...
- Nginx详解(正向代理、反向代理、负载均衡原理)
Nginx配置详解 nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行 ...
随机推荐
- maven的标准pom.xml详解
maven是构建和管理理项目的利器,pom.xml 是其核心.一个标准的pom.xml该怎么写?其中的标签又有什么意义?话不多说,请看代码: <?xml version="1.0&qu ...
- 使用JDOM解析xml文档
一.使用JDOOM解析xml文档 准备工作 1.下载JDOM.jar 包 解析代码如下 import org.jdom2.Attribute; import org.jdom2.Document; i ...
- C# 算法之选择排序
1.简介 选择排序是排序中比较简单的一种,实现的大致思路如下:首先我们拿到一个需要排序的数组,假设该数组的第一个元素是最小的,然后将数组中剩下的元素,于最小的元素进行比较,如果中间有比第一个元素的小的 ...
- PHP Socket 编程进阶指南
学习准备 Linux 或者 Mac 环境: 安装有 Sockets 扩展: 了解 TCP/IP 协议. socket函数只是PHP扩展的一部分,编译PHP时必须在配置中添加 --enable-sock ...
- Web Service 部分内容简述(1)
1.什么是Web服务(web service) Wb服务是一种可以用来解决跨网络应用集成问题的开发模式,是基于网络的.分布式的模块化组件,它执行特定的任务遵守具体的技术规范,这些规范使得Web Ser ...
- leetcode — unique-paths
import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/unique-paths/ * * * A robot ...
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...
- [转]【Angular4】基础(六):HTTP模块
本文转自:https://blog.csdn.net/u013451157/article/details/79519719 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- c#等程序中的关于时间的最大值【DateTime.MaxValue】和最小值【DateTime.MinValue】
运行之后得到的结果 c# DateTime.MaxValue:// :: DateTime.MinValue:// :: Sql Server DateTime 类型必须介于 1/1/1753 12: ...
- sql查询语句时怎么把几个字段拼接成一个字段
sql查询语句时怎么把几个字段拼接成一个字段SELECT CAST(COLUMN1 AS VARCHAR(10)) + '-' + CAST(COLUMN2 AS VARCHAR(10) ...) a ...