达内广州C++学院|c++培训|广州达内科技C++/C#培训|.NET培训|IT培训|达内广州岗顶中心 达内广州C++学院|c++培训|广州达内科技C++/C#培训|.NET培训|IT培训|达内广州岗顶中心
java程序员
 当前位置:主页 > 高端课程 > java程序员 >

Nginx反向代理

时间:2019-05-15  来源:未知  作者:广州达内培训

1.简介

 

 

 

Nginx是一个反向代理服务器,其启动速度极快、占用内存极少、抗高并发能力强,因此大量在互联网项目中应用。

Nginx访问速度快的原因:

1.动静分离,静态资源由Nginx直接进行管理,动态请求转发到后端。

2.Worker中的线程是AIO的(异步非阻塞),当接收到请求后会将其放入到队列中,然后继续接收新的请求。

3.可以指定Master和Worker之间的IO多路复用模型。

 

 

2.正向代理与反向代理

 

2.1 正向代理

 

 

正向代理:代理的是客户端,服务器并不知道客户端的是通过VPN进行访问的。

 

2.2 反向代理

 

 

反向代理:代理的是服务器,客户端并不知道请求具体发送到哪个服务器中。

 

 

3.Nginx的工作模型

 

 

Nginx使用Master和Worker工作模型,一个Nginx服务由一个Master和多个Worker进程组成。

 

3.1 Master进程

Master进程负责读取nginx.conf配置文件以及管理Worker进程。

 

3.2 Worker进程

Worker进程负责处理连接和请求,且每个Worker进程中维护一个线程。

 

 

4.Nginx常用功能

 

4.1 通过Nginx管理静态资源

location ~ \.(gif|jpg|png|js|css)$ {
    root static;
}

*使用root表示返回静态资源,root指定资源的根目录(相对于Nginx安装目录)

*当匹配到此Location后,会进入root指定的根目录,然后根据请求的/path访问静态资源。 

 

4.2 通过Nginx进行反向代理到某个指定URL

location = /baidu{
    proxy_pass  http://ip:port/adserving/baidu;
}

*使用proxy_pass表示反向代理,将用户的请求动态转发到某个URL。 

*当使用了反向代理,那么对于Tomcat而言用户的IP即Nginx的地址,如果想要查看用户的IP,那么需要从Nginx日志中查看。

 

4.3 通过Nginx实现负载均衡

upstream name{
    server ip:port ;
    server ip:port ;
    server ip:port ;
}

location /path {
    proxy_pass  http://name;
}

*当使用了负载均衡,那么请求在动态转发时会携带请求的/path。 

*当使用了负载均衡集群,那么要注意集群间Session的共享问题,可以将Session对象放入一个公共区域,当获取Session时从公共区域中查找。 

 

负载均衡策略:轮询、指定权重、对用户IP进行Hash

 

1.轮询:当不指定weight时,各个服务器的权重相同,每个请求按访问时间的顺序逐一分配到各个服务器中,如果服务器发生故障,能被自动剔除。

upstream name{
    server ip:port ;
    server ip:port ;
    server ip:port ;
}

 

2.指定权重:权重与访问率成正比,如果服务器发生故障,能被自动剔除。

upstream name{
    server ip:port weight=1 ;
    server ip:port weight=2 ;
    server ip:port weight=3 ;
}

 

3.对用户IP进行Hash:以元素的关键字k作为自变量,通过H(K)散列函数计算出散列值,以该散列值坐落在Hash环上的位置,找到其对应处理的节点,这里的自变量就是用户的IP,如果服务器发生故障,不会自动被剔除。

upstream name{
    ip_hash ;
    server ip:port ;
    server ip:port ;
    server ip:port ;
}

*如果使用对用户IP进行Hash的负载均衡策略,那么每个用户就固定访问后端的一个节点,就能避免集群间Session共享问题。

 

 

5.Nginx配置

 

#Nginx全局配置

events {
    #Event事件配置
}

http {
    #HTTP全局配置
    server {
        #Server全局配置
        #Location配置
    }
}

 

5.1 Nginx全局配置

Nginx全局配置主要包括:运行Nginx服务的所属组、 Worker进程的数量、错误日志存放路径、Master进程ID等。

#指定运行Nginx的所属组
user root;

#worker进程数量(建议CPU数量 x 核数)
work_processed 12;

#错误日志存放路径(相对于Nginx安装目录)
error_log logs/error.log;

#Master进程ID的存放路径(相对于Nginx安装目录)
pid logs/nginx.pid;

 

5.2 Event事件配置

Event事件配置主要包括: Worker进程处理连接与请求的细节、事件驱动模型的选择等。

#设置多个Worker进程接收一个新连接的方式
#当值为on时,当一个新的连接到达时,只有一个Worker进程被唤醒(默认)
#当值为off时,当一个新的连接到达时,所有的Worker进程都被唤醒,共同争夺这个连接。
accept_mutex on;

#设置Worker进程一次是否能处理多个新的连接
#当值为on时,Worker进程一次能够接收多个新的连接(默认)
#当值为off时,Worker进程一次只能接收一个新的连接。
multi_accept on;

#事件驱动模型选择,可选select、poll、epoll、kqueue
use epoll;

#Worker进程最大连接数(默认512)
worker_connections 1024;

 

5.3 HTTP全局配置

HTTP全局配置主要包括:请求的MIME类型、是否允许sendFile方式传输文件、负载均衡、长连接超时时间、长连接的最大请求数。

#指定请求的MIME类型,可以指定多个
types{
   text/html        html htm shtml;
   text/css         css;
   text/xml         xml;
   ......
}

#负载均衡
upstream name{
    ip:port;
    ip:port;
    ip:port;
}

#整个HTTP服务的访问日志(相对于Nginx安装目录),并且指定日志打印的格式
access_log logs/access_all.log main

#定义日志的打印格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';

#设置是否允许sendFile传输文件
sendFile on;

#长连接的超时时间,若在指定时间内连接没有发送新的请求,那么该连接将会被关闭
keepalive_timeout 600s;

#长连接可发送的最大请求数,当连接累计发送的请求数到达指定大小时,连接将会被关闭
keepalive_requests 1000;

*Nginx中默认使用长连接的方式,一个连接中可以发送多个请求。 

 

5.4 Server全局配置

Server全局配置主要包括:绑定基于域名或IP的虚拟主机、监听的TCP端口。

#绑定基于域名或者IP的虚拟主机
server_name 192.168.2.90;

#监听的TCP端口
listen 80;

#整个Server的访问日志,并且指定日志打印的格式
access_log logs/192.168.2.90.access.log main;

#Nginx直接返回的指定状态码直接重定向
error_page 404 500 502 /error.html

*server_name只能绑定本机的IP或者域名,不能是其他主机的。 

*error_page只适用于由Nginx直接返回的状态码,不适用于转发到后端返回的状态码。

*不允许在Server中定义日志的打印格式,只能使用HTTP全局配置中定义的日志打印格式。 

 

5.5 Location配置

Location主要为了匹配用户访问的URL,使其进入相应的逻辑处理。

location 匹配符 path{

}

 

*匹配符优先级:精确匹配 > 正则匹配(第一个符合的正则)> URL最长匹配

*其中^~与不使用直接/path作用一样,都是URL后缀匹配。

*access_log、error_log、pid、root都是相对于Nginx的安装目录,而include是相对于conf目录。  

 

 

6.Nginx访问流程

 

 

 

1.客户端向Nginx发起HTTP请求。

2.进入Nginx的HTTP模块,然后根据请求的IP与端口进入相应的Server。

3.根据请求的/path匹配Location,若找不到相应的Location,则由Nginx直接返回404状态码,否则进入相应的Location进行处理。

4.日志中记录请求的相关信息。

 

 

7.Nginx安装与使用

 

7.1 下载Nginx安装包并解压

http://nginx.org/en/download.html 

 

7.2 编译以及安装

#配置,指定Nginx的安装目录
./configure --prefix=/usr/nginx

#编译与安装
make & make install

*Nginx是由C语言进行编写的,因此需要使用gcc编译器进行编译。

 

安装成功后的目录结构:

*其中conf目录存放着Nginx的相关配置文件,html目录存放nginx预定义的静态资源文件,logs目录用于存放日志,sbin目录包含nginx进程,用于启动Nginx。

 

7.3 修改nginx配置文件

user  root;
worker_processes  8;
error_log  logs/error.log;
pid        logs/nginx.pid;


events {
    accept_mutex on;
    multi_accept on;
    use epoll;
    worker_connections 1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    keepalive_timeout  600s;
    keepalive_requests 1000; 

    upstream loadBalance {
       server 192.168.2.90:8080;
       server 192.168.2.91:8080;
       server 192.168.2.93:8080;
    }

    server {
        listen       80;
        server_name  192.168.2.90;
        access_log  logs/192.168.2.90.access.log  main;

        #精确匹配,适用于网站首页
        location = / {
            proxy_pass http://192.168.2.90:8080/web/index.html;
        }

        #匹配URL,负载均衡
        location / {
            proxy_pass http://loadBalance;
        }

        #正则匹配,静态资源直接返回
        location ~ \.(gif|jpg|png|js|css)$ {
            root static;
        }

    }
 

}

 

7.4 启动Nginx

*当Nginx服务启动后,会启动一个Master进程和多个Worker进程。

 

7.5 Nginx常用命令

#启动nginx,默认加载conf/nginx.conf配置文件,可以使用-c选项配置
./nginx

#检查nginx.conf配置文件
./nginx -t

#重启Nginx(热部署)
./nginx -s reload

#关闭nginx
./nginx -s stop

 

 

8.Keepalived实现Nginx的高可用

 

由于Nginx作为流量的入口,一旦Nginx发生故障时则无法对外提供服务,因此需要通过Keepalived实现Ngixn的高可用。

Keepalived是一个高可用集群的解决方案,其使用VRRP协议(Virtual Router Redundancy Protocol),其对外提供一个虚拟IP,用户的请求直接到达虚拟IP,然后进入状态为Master的Keepalived节点,当状态为Master的Keepalived节点故障时,会自动将状态为Backup的Keepalived节点切换为Master状态。

 

 

*每个包含Nginx服务的节点中都需要安装Keepalived服务,并且需要自定义一个脚本去定时检测Nginx的进程状态,当发现Nginx故障时,及时kill掉本节点的Keepalived服务。

 




上一篇:Spring Cloud(3):Ribbon的使用
下一篇:ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十二天

友情链接:
  • 全球最大晶圆代工半导体制造厂,台积电斥资订购艾斯摩尔机器设备
  • 英特尔依然是那个英特尔,且看英特尔的城防体系
  • 支持双 DRAM 内存接口,慧荣企业级 SSD 主控方案披露
  • 在全球被反垄断罚款,冤!高通到底哪里得罪了欧盟?
  • 强强联合!万业、微电子所和芯鑫共同打造全新半导体设备
  • 复旦大学校长称:对于集成电路产业发展,大学应该主动担当
  • 技术再升级!无锡中科芯攻克晶圆级再布线及晶圆级凸点制备关键技
  • 聚力!万业企业设立集成电路装备集团,提供自主可控设备
  • 德州仪器C2000微控制器增强连通性和控制性
  • 英特尔打出降价策略,以免被竞争对手 AMD 打败?
  • 贸易摩擦的闹剧没有赢家,苹果有勇气离开中国吗?
  • 图像信号与视觉处理器的发展趋势
  • 真干快消品定位方案班(第二期)火热开班
  • Java集合 ArrayList原理及使用
  • TDD(测试驱动开发)死了吗?
  • JAVA基础之XML相关
  • javaweb项目搭建ehcache缓存系统
  • 每日一码——字符串统计
  • 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生
  • 九:模板方法模式
  • 十二:命令模式(人员解耦和)
  • Java 转PPT为图片、PDF、SVG、XPS、ODP以及PPT和PPTX互转
  • SpringCloud学习(SPRINGCLOUD微服务实战)一
  • 记一次微信网页授权后获取用户信息并重定向
  • 速途新营销五点实战洞察解码“品效合一”
  • 十一:外观模式详解(Service,action与dao)
  • 手把手教你学会 基于JWT的单点登录
  • mysql锁机制总结,以及优化建议
  • 解决多个版本jar包冲突【jar内包名重命名】
  • 中国首张5G终端电信设备进网许可证 华为Mate 20 X 5G版入网
  • RPC之Thrift
  • 高级Java工程师必备 ----
  • 天猫618期间实物支付GMV增长38.5%
  • 换季了,老板你的库存处理好了吗?
  • 从“618”大数据看中国消费新活力
  • 小米生态链:贵在格局感与收放度
  • CODING 2.0 企业级持续交付解决方案
  • 老铁奇趴“新京济” 快手*京东618战报出炉
  • 中小企业新媒体运营基本技能
  • 上汽大通房车再度携手LINE FRIENDS 魔都巡游顺利开启
  • 华为高端手机国内市场份额超苹果夺得榜首
  • 中国智能制造分析报告
  • iPlus艾加营销助力腾讯广告牵手吴晓波 推进商业IP变现
  • 2019世界新能源汽车大会7月1日将在海南举行
  • 区域酒企如何转型突围
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载