本文主要是介绍Day92.Nginx: 反向代理、负载均衡、动静分离、安装与配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、Nginx简介
二、安装
nginx常用的命令
三、反向代理
反向代理案例二
location指令说明
四、Nginx配置实例-负载均衡
2. weight 权重
3. ip_hash
4. fair(需要第三方插件)
5. 其他:down、Bacup
五、动静分离
动静分离实验二 (重要)
六、Nginx 工作原理
技术类型
七、Nginx 配置相关
一、Nginx简介
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等
正向代理
Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
反向代理
反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
当请求过多,访问量过大时,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二、安装
需要安装:pcre、openssl、zlib、nginx,步骤略 (压缩、编译、安装)
需要开放防火墙端口,否则无法远程访问:
查看开放的端口号
firewall-cmd --list-all
设置开放的服务或端口号
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload
systemctl status firewalld :查看防火墙状态
systemctl stop firewalld:关闭防火墙
systemctl start firewalld:开启防火墙
nginx常用的命令
(1)启动命令:在/usr/local/nginx/sbin目录下执行 ./nginx
(2)关闭命令:在/usr/local/nginx/sbin目录下执行 ./nginx -s stop
(3)重新加载命令:在/usr/local/nginx/sbin目录下执行 ./nginx -s reload
(4)查看版本:在/usr/local/nginx/sbin目录下执行 ./nginx -v
(5)查看进程:ps -ef|grep nginx
三、反向代理
修改配置文件:
修改成功后, 输入 ../sbin/nginx -s reload 加载配置文件
映射域名,通过修改本地 C:/Windows/System32/drivers/etc/hosts 文件,将 www.123.com 映射到 192.168.86.86
(80是web默认端口,所以可以省略)
linux启动tomcat服务后,访问Nginx地址,或www.123.com就可以反向代理到Tomcat了!
反向代理案例二
第一步,准备两个tomcat,一个8080端口,一个8081端口,并准备好测试的页面
webapps/edu/index.html
webapps/vod/index.html
修改nginx的配置文件,在server{}中添加
location /edu/{proxy_pass http://192.168.86.86:8080;}location /vod/{proxy_pass http://192.168.86.86:8081;}
代理了两个服务器!两个都可以通过nginx 访问
location指令说明
该指令用于匹配 URL。
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 (优先级1)
2、~:用于表示 uri 包含正则表达式,并且区分大小写。 (优先级4)
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。 (优先级3)
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。(优先级2)
Location区段匹配示例location = / { //精确匹配,优先级最高# 只匹配 / 的查询.[ configuration A ]
}location / { //普通匹配,优先级低# 匹配任何以 / 开始的查询,但是正则表达式与一些较长的字符串将被首先匹配。[ configuration B ]
}location ^~ /images/ { //反正则,优先于正则匹配# 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ { // ~*正则匹配,不区分大小写,优先级高于普通匹配# 匹配任何以gif, jpg, or jpeg结尾的文件,但是所有 /images/ 目录的请求将在Configuration C中处理。[ configuration D ]
}
各请求的处理如下例:
http://192.168.140.110:9000/
http://192.168.140.110:9000/documents/document.html
http://192.168.140.110:9000/images/1.gif
http://192.168.140.110:9000/documents/1.jpg■/ → configuration A
■/documents/document.html → configuration B
■/images/1.gif → configuration C
■/documents/1.jpg → configuration D
四、Nginx配置实例-负载均衡
Nginx默认匹配策略是轮询!Dubbo框架默认匹配策略是随机访问!
负载均衡配置:
upstream称为上游服务器,即真实处理请求的业务服务器。
upstream tomcatgroup{server 192.168.86.86:8080 weight=1;server 192.168.86.86:8081 weight=2;}location /edu/{proxy_pass http://tomcatgroup;}
2. weight 权重
weight代表权,重默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3. ip_hash
第一请求是谁处理的,以后都由同一个服务器处理。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题(不建议使用)
问题:1.如果该服务器宕机,客户则需要重新登录系统,重新进行哈希计算。2.ip分步不均
4. fair(需要第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
server 192.168.10.1:80;
server 192.168.10.2:80;
server 192.168.10.3:80;
fair;
}
5. 其他:down、Bacup
五、动静分离
Nginx 动静分离简单来说就是把动态请求跟静态请求分开,Nginx 处理静态请求,Tomcat处理动态请求。
动静分离实验二 (重要)
如果开启反向代理,访问tomcat动态资源jsp,jsp中引用的静态资源可以从nginx服务器中进行加载。
配置文件:
实现了静态资源、动态资源分开访问。
六、Nginx 工作原理
Nginx 同redis类似都采用了 IO多路复用机制 ,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过 异步非阻塞 的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数量和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
异步非阻塞。io多路复用
master-workers的机制的好处
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
面试题:
第一个:发送请求,占用了woker的几个连接数?
动态资源请求:占用四个连接数。静态资源请求:占用两个连接数
因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接.
第二个:nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
总连接数:4*1024 = 4096
静态请求需要两个连接数 = 4096/2 = 2048
动态请求需要四个连接数 = 4096/4 = 1024
技术类型
select
- select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
- select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍...
- select 只能监视1024个链接。
- select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现,这个sock不用,要收回,这个select 不支持的,如果你丧心病狂的竟然关掉这个sock, select的标准行为是不可预测的
poll
- poll 去掉了1024个链接的限制
- poll仍然不是线程安全的, 这就意味着,不管服务器有多强悍也只能在一个线程里面处理一组I/O流。
epoll
- epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题
- epoll 现在是线程安全的。
- epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
七、Nginx 配置相关
#安全问题,建议用nobody,不要用root. #user nobody; #worker数和服务器的cpu数相等是最为适宜 worker_processes 2; #work绑定cpu(4 work绑定4cpu) worker_cpu_affinity 0001 0010 0100 1000
#error_log path(存放路径) level(日志等级) path表示日志路径,level表示日志等级, #具体如下:[ debug | info | notice | warn | error | crit ] #从左至右,日志详细程度逐级递减,即debug最详细,crit最少,默认为crit。 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; #这个值是表示nginx要支持哪种多路io复用。 #一般的Linux选择epoll, 如果是(*BSD)系列的Linux使用kquene。 #windows版本的nginx不支持多路IO复用,这个值不用配。 use epoll; # 当一个worker抢占到一个链接时,是否尽可能的让其获得更多的连接,默认是off 。 multi_accept on; //并发量大时缓解客户端等待时间。 # 默认是on ,开启nginx的抢占锁机制。 accept_mutex on; //master指派worker抢占锁 } http { #当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。 include mime.types; #/usr/local/nginx/conf/mime.types #如果 不能从mime.types找到映射的话,用以下作为默认值-二进制 default_type application/octet-stream; #日志位置 access_log logs/host.access.log main; #一条典型的accesslog: #101.226.166.254 - - [21/Oct/2013:20:34:28 +0800] "GET /movie_cat.php?year=2013 HTTP/1.1" 200 5209 "http://www.baidu.com" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider" #1)101.226.166.254:(用户IP) #2)[21/Oct/2013:20:34:28 +0800]:(访问时间) #3)GET:http请求方式,有GET和POST两种 #4)/movie_cat.php?year=2013:当前访问的网页是动态网页,movie_cat.php即请求的后台接口,year=2013为具体接口的参数 #5)200:服务状态,200表示正常,常见的还有,301永久重定向、4XX表示请求出错、5XX服务器内部错误 #6)5209:传送字节数为5209,单位为byte #7)"http://www.baidu.com":refer:即当前页面的上一个网页 #8)"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; #.NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider": agent字段:通常用来记录操作系统、浏览器版本、浏览器内核等信息 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #开启从磁盘直接到网络的文件传输,适用于有大文件上传下载的情况,提高IO效率。 sendfile on; //大文件传递优化,提高效率
#一个请求完成之后还要保持连接多久,0表示完成请求后直接关闭连接。默认:75s keepalive_timeout 60s; #开启或者关闭gzip模块, 文件压缩,再传输,提高效率 #gzip on ; #设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。 #gzip_min_lenth 1k; # gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu) #gzip_comp_level 4; #匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。 #gzip_types types text/plain text/css application/json application/x-javascript text/xml #动静分离 #服务器端静态资源缓存,最大缓存到内存中的文件,不活跃期限 open_file_cache max=655350 inactive=20s;
#活跃期限内最少使用的次数,否则视为不活跃。 open_file_cache_min_uses 2; #验证缓存是否活跃的时间间隔 open_file_cache_valid 30s;
upstream myserver{ # ip_hash; server 192.168.161.132:8080 weight=1; server 192.168.161.132:8081 weight=1 backup; #hash $request_uri #hash_method crc32 } server { #监听端口号 listen 80; #服务名 server_name 192.168.137.129; #字符集 #charset utf-8; location / { #匹配任何查询。 root html;#资源查找位置。 /user/local/nginx/html #默认访问首页索引文件的名称 index index.html index.htm; #反向代理路径 proxy_pass http://myserver; #反向代理的超时时间 proxy_connect_timeout 10; proxy_redirect default; } #普通匹配 location /images/ { root images ; } #反正则匹配 location ^~ /images/jpg/ { # 匹配任何以 /images/jpg/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。 root images/jpg/ ; } #正则匹配 location ~*.(gif|jpg|jpeg)$ { #所有静态文件直接读取硬盘 root pic ; #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力 expires 3d; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } |
这篇关于Day92.Nginx: 反向代理、负载均衡、动静分离、安装与配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!