Nginx反向代理
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安装包并解压
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服务。
上一篇: 02-多任务编程