Nginx反向代理和负载均衡

上次分享了怎么用docker创建nginx服务 说到nginx 我们往往都会用到nginx的两个重要功能,反向代理和负载均衡,今天我来和大家分享一下Nginx的反向代理和负载均衡

什么是反向代理?

说到反向代理,大家一般都会提一下:正向代理,正向代理就是代理,比如我们写爬虫的时候IP被封、Google的时候404,这个时候我们都会用到代理,你可以把代理理解成一个跳板,我们的电脑不能访问Google,那我们就去访问能访问Google的服务器,一般我都是在这两种情况下使用代理,可能有更高深的用法,具体我也没用过。 说完代理,就来说一下我们今天的主角--反向代理

定义

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

功能

对客户端隐藏服务器的IP地址 通过缓存静态资源,加速Web请求 更安全,因为任何来自Internet的请求都必须先经过代理服务器,可以在这里做防护(例如ip过滤)

实现方法:

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_pass http://abc.com;
}

第一次看到上面这些内容时,大多人可能还是不明白 简单点说就是你有A、B两台服务器,这两台服务器上都放着你的代码,当用户访问你的内容时,会访问A服务器,A服务器再去请求B内容返回给用户,用户不知道请求的是B,这样就是实现了反向代理

下面我们通过以下简单的几步演示一下反向代理
通过上一篇的Docker创建Nginx服务,我们可以快速创建3个nginx服务,来模拟3台服务器

  • 首先创建一个nginx的配置文件
#创建 nginx配置文件
touch nginx.conf 
# 创建a、b、c三个文件夹存放项目
mkdir a b c
  • 编写Nginx配置文件
# Nginx的配置文件,这里主要作用是为了指定端口和项目路径
events {
    #每个工作进程的并发连接数
    worker_connections 1024;
}
http {
        server {
               #监听端口
                listen 80;
                #绑定域名
                server_name localhost;
                #项目路径
                root /nginx/share/nginx/html;
        }
}
  • 启动Nignx服务

#创建a容器
docker run -p 80:80 -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf
 -v $PWD/html/a:/usr/share/nginx/html --name a-server -d nginx
#创建b容器
docker run -p 80:8081 -v $PWD/html/b:/usr/share/nginx/html 
--name b-server -d nginx
#创建c容器
docker run -p 80:8082 -v $PWD/html/c:/usr/share/nginx/html 
--name c-server -d nginx 
 
#参数解释
    -p 8080:80 将容器的80端口映射到宿主机的8080端口
    -v $PWD/a.conf:/etc/nginx/nginx.conf 
    将宿主机中当前目录下的a.conf挂载到容器的/etc/nginx/nginx.conf
    -v $PWD:/a  将主机中当前目录a挂载到容器的/usr/share/nginx/html
    --name 容器的名称
    -d 后台运行容器,并返回容器ID
  • 判断Nginx是否启动成功
docker ps -a 查看容器是否成功启动
或者
curl 127.0.0.1 
curl 127.0.0.1:8081 
curl 127.0.0.1:8082

  • 修改配置文件
events {
    #每个工作进程的并发连接数
    worker_connections 1024;
}
http {
    server {
        #监听端口
        listen 80;
        #绑定域名
        server_name localhost;
        #项目路径
        root /nginx/share/nginx/html;
        
        # 反向代理
        location /b {
            rewrite ^/b(.*) /$1 break;
            proxy_pass http://127.0.0.1:8081
        }
        
        # 反向代理
        location /c {
            rewrite ^/c(.*) /$1 break;
            proxy_pass http://127.0.0.1:8082
        }
    }
}

这个时候就我们就已经实现了方向代理,可以在浏览器中访问

http://127.0.0.1  输出this is a
http://127.0.0.1/b 输出 this is b 
http://127.0.0.1/c 输出 this is c

今天的另外一个主角是负载均衡

什么是负载均衡 很多新手在听说负载均衡的时候,都会感觉是很高深莫测,其实实现起来也不难, 下面我们修改配置实现一个简单的负载均衡
首先来了解一下负载均衡

定义

用来在多个计算机、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性

功能

将流量分配给多个应用程序服务器,提高Web应用程序的可伸缩性和可靠性

实现方法

http {
    upstream myServer {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myServer;
        }
    }
}

对于上面的很官方定义,我再用大白话解释一下, 将用户的请求分配到压力小的服务器上,从而减轻服务器压力

下面我们通过简单的Demo演示一下负载均衡

修改刚才的配置文件nginx.conf

events {
    #每个工作进程的并发连接数
    worker_connections 1024;
}
http {
    #定义负载均衡设备的 Ip及设备状态 
    upstream myServer {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    
    server {
        #监听端口
        listen 80;
        #绑定域名
        server_name localhost;
        #项目路径
        root /nginx/share/nginx/html;
        
        location / {
            proxy_pass http://myServer;
        }
    }
}
打开浏览器输入http://127.0.0.1 我们刷新浏览器,就输出this is b或者this is a

到这里反向代理和负载均衡的基本配置就分享完了。

但是机智的你可能会发提出一些疑问,通过负载均衡,用户访问到B服务器时,下次刷新又去访问C服务器,能不能还继续访问A服务器。当然Nginx提供了方法 具体配置内容如下

upstream myServer {            
  #weight 指定轮询几率,如果现在有5个请求,
  #有4个会请求到B服务器上,1个请求到C服务器上,
  #一般我们会把服务器配置比较高的权重加大

  server b.com weight=4; 
  server c.com;

  #通过客户端的IP地址,确定下一个请求应该选择哪个服务器
  ip_hash;            
}

本次主要分享了Nginx的反向代理和负载均衡,当然,分享的内容还是比较基础,Nginx虽然体积不大,但是功能很全面,更多模块和配置文件可以去查看官方文档

注意事项

  • 如果 nginx没有开启热更新,修改配置文件一定要重启
#docker 容器的重启命令
docker restart id(容器ID)
#不是使用docker安装的nginx
service nginx restart
  • 反向代理中nginx的配置 proxy_pass
 location /c {
         #如果是绑定目录,这里的rewrite一定要写
         rewrite ^/c(.*) /$1 break;
         # docker容器中这里一定要填写本机的ip地址,不能填写127.0.0.1
         proxy_pass http://117.189.124.134:8082;
    }

总结:Nginx的反向代理、负载均衡配置还是比较简单的,主要用到proxy_pass和upstream,避免上述几个坑,应该没有什么问题,本人对Nginx只是属于入门阶段,如有错误,欢迎指正

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容