公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部Tomcat返回内容给所有用户。
但是慢慢的,使用用户越来越多了,并发量越来越大了,这时候一台服务器满足不了需求。
于是横向扩展,又增加了服务器,这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器,通过代理服务器实现转发和处理请求。
希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,还希望他可以按照服务器的性能提供不同的权重选择,保证最佳体验。所以使用Nginx。
参考文档:狂神说Nginx、https://www.cnblogs.com/jasonbourne3/p/14099700.html
1、什么是Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的 网站中有12.18%的使用比率,大约为2220万个网站。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,支持热启动,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
Nginx作为HTTP服务器,有以下几个基本特性:
-
处理静态文件,索引文件以及自动索引,打开文件描述符缓冲
-
无缓存的反向代理加速,简单的负载均衡和容错
-
FastCGI(可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口)
-
模块化的结构。各模块之间可以并行运行,不需要相互等待
-
支持SSL
2、反向代理原理
Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
正向代理:代理客户端,客户端、浏览器配置代理服务器,通过代理服务器进行互联网访问
客户端 --> 代理 --> 云、互联网 --> 服务器
反向代理器:代理服务器
客户端 --> 云、互联网 --> 代理 --> 服务器
反向代理的工作原理是,代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
优点:以校园网举例
1)提高了内部服务器的安全
外部网络用户通过反向代理访向内部服务器,只能看到反向代理服务器的IP地址和端口号,内部服务器对于外部网络来说是完全不可见。而且反向代理服务器上没有保存任何的信息资源,所有的网页程序都保存在内部服务器上,对反向代理服务器的攻击并不能使真的网页信息系统受到破坏,这样就提高了内部服务器的安全性。
2)加快了对内部服务器的访问速度
在内部服务器前放置两台反向代理服务器,分别连接到教育网和公网,这样公网用户就可以直接通过公网线路访问学校服务器,从而避开了公网和教育网之间拥挤的链路。同时反向代理服务器的缓存功能也加快了用户的访问速度。
3)节约了有限的IP资源
校园网内部服务器除使用教育网地址外,也会采用公网的IP地址对外提供服务,公网分配的IP地址数目是有限的,如果每个服务器有分配一个公网地址,那是不可能的,通过反向代理技术很好的解决了IP地址不足的问题。
3、负载均衡原理
单个服务器解决不了,增加服务器,将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载按某种策略分发到不同的服务器,即负载均衡。
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。
加权轮询就是给代理的服务器设置不同的权重,权重大的能处理更多的请求,并按权重分配请求。
iphash对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理
4、动静分离原理
动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件,写死的不会改动),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器解析,加快解析速度,降低原来单个服务器的压力。
客户端 --> Nginx --> Nginx (静态请求本地)
资源:html、css、image……
--> web服务(动态服务请求)部署动态资源:jsp、Servlet……
5、Linux安装Nginx
5.1、常规安装
环境:使用CentOS7,安装在虚拟机上,使用远程访问工具FinalShell访问,虚拟机ip为192.168.56.100
nginx官方文档说明:http://nginx.org/en/linux_packages.html#RHEL-CentOS
需要安装一些依赖:
1、安装gcc
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
2、PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
3、zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
4、OpenSSL 安装 OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。 nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
5、下载安装包
手动下载.tar.gz安装包,地址:https://nginx.org/en/download.html
选择Stable Version稳定版本
下载完毕上传到服务器上 /root,可以直接将压缩包拖进目录
6、解压
解压后进入nginx根目录
tar -zxvf nginx-1.20.0.tar.gz
cd nginx-1.20.0
7、配置
使用默认配置,在nginx根目录下执行
./configure
make && make install
查找安装路径: whereis nginx
安装成功后,在usr文件夹中多一个文件夹local/nginx,在sbin中有启动脚本
[root@k8s-master01 nginx-1.20.2]# whereis nginx
nginx: /usr/local/nginx
打开sbin目录,运行./nginx
如果防火墙有设置80端口开启或未开启防火墙,则访问主机192.168.56.100:80
若开启防火墙需要这样设置:
防火墙设置
# 查看firewall服务状态 systemctl status firewalld # 开启、重启、关闭、firewalld.service服务 # 开启 service firewalld start # 重启 service firewalld restart # 关闭 service firewalld stop # 查看防火墙规则 firewall-cmd --list-all # 查看全部信息 firewall-cmd --list-ports # 只看端口信息 # 开启端口 开8080端口命令:firewall-cmd --zone=public --add-port=80/tcp --permanent 开启端口后需要重启防火墙:systemctl restart firewalld.service
命令含义:
--zone #作用域
--add-port=80/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
启动成功访问 服务器ip:80,得到登录成功提示
5.2、在docker下安装
使用docker 下载nginx 镜像 docker pull nginx
启动nginx :docker run --name nginx -p 80:80 -d nginx
6、基本命令
进入Nginx的sbin目录:cd /usr/local/nginx/sbin/
-
启动nginx:./nginx
-
以特定目录下的配置文件启动:./nginx -c /特定目录/nginx.conf
-
重新加载配置:./nginx -s reload 执行这个命令后,master进程会等待worker进程处理完当前请求,然后根据最新配置重新创建新的worker进程,完成Nginx配置的热更新。
-
立即停止服务: ./nginx -s stop
-
从容停止服务: ./nginx -s quit 执行该命令后,Nginx在完成当前工作任务后再停止。
-
检查配置文件是否正确 : ./nginx -t
-
检查特定目录的配置文件是否正确:./nginx -t -c /特定目录/nginx.conf
-
查看版本信息: ./nginx -v
7、基本配置
如果使用docker安装,在mydata/nginx目录下找到nginx.conf
如果是常规安装:位置在/usr/local/nginx/conf/nginx.conf
配置文件nginx.conf结构:
main
events { ... }
http{
server{
location { ... }
}
}
Nginx默认的配置文件主要有 main、events、http、server、location 五个块组成。其中 http 、server、location 属于嵌套关系。
-
main全局块:影响整体的配置,主要控制Nginx子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等。
-
events:影响Nginx服务器与用户的网络连接。控制Nginx处理连接的方式。
-
http:Nginx处理http请求的主要配置块。配置最频繁的部分。代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里。
-
http全局块:文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server:Nginx中主机配置块,可用于配置多个虚拟主机。每个server相当于一个虚拟主机。每个server又包括全局和多个location
-
全局server块:监听端口配置、虚拟主机名称、IP
-
location:server中对应目录级别的控制块,可以有多个。
-
-
使用常规安装的配置示例如下:
1 #user nobody; 2 worker_processes 1; 3 4 #error_log logs/error.log; 5 #error_log logs/error.log notice; 6 #error_log logs/error.log info; 7 8 #pid logs/nginx.pid; 9 10 11 events { 12 worker_connections 1024; 13 } 14 15 16 http { 17 include mime.types; 18 default_type application/octet-stream; 19 20 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 21 # '$status $body_bytes_sent "$http_referer" ' 22 # '"$http_user_agent" "$http_x_forwarded_for"'; 23 24 #access_log logs/access.log main; 25 26 sendfile on; 27 #tcp_nopush on; 28 29 #keepalive_timeout 0; 30 keepalive_timeout 65; 31 32 #gzip on; 33 34 server { 35 listen 80; 36 server_name localhost; 37 38 #charset koi8-r; 39 40 #access_log logs/host.access.log main; 41 42 location / { 43 root html; 44 index index.html index.htm; 45 } 46 47 #error_page 404 /404.html; 48 49 # redirect server error pages to the static page /50x.html 50 # 51 error_page 500 502 503 504 /50x.html; 52 location = /50x.html { 53 root html; 54 } 55 56 # proxy the PHP scripts to Apache listening on 127.0.0.1:80 57 # 58 #location ~ \.php$ { 59 # proxy_pass http://127.0.0.1; 60 #} 61 62 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 63 # 64 #location ~ \.php$ { 65 # root html; 66 # fastcgi_pass 127.0.0.1:9000; 67 # fastcgi_index index.php; 68 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 69 # include fastcgi_params; 70 #} 71 72 # deny access to .htaccess files, if Apache's document root 73 # concurs with nginx's one 74 # 75 #location ~ /\.ht { 76 # deny all; 77 #} 78 } 79 80 81 # another virtual host using mix of IP-, name-, and port-based configuration 82 # 83 #server { 84 # listen 8000; 85 # listen somename:8080; 86 # server_name somename alias another.alias; 87 88 # location / { 89 # root html; 90 # index index.html index.htm; 91 # } 92 #} 93 94 95 # HTTPS server 96 # 97 #server { 98 # listen 443 ssl; 99 # server_name localhost; 100 101 # ssl_certificate cert.pem; 102 # ssl_certificate_key cert.key; 103 104 # ssl_session_cache shared:SSL:1m; 105 # ssl_session_timeout 5m; 106 107 # ssl_ciphers HIGH:!aNULL:!MD5; 108 # ssl_prefer_server_ciphers on; 109 110 # location / { 111 # root html; 112 # index index.html index.htm; 113 # } 114 #} 115 116 }
使用docker的配置示例如下:
1 #运行用户 2 user nobody; 3 #工作进程数,值越大,可以支持的并发处理量越多,但是会受到硬件、软件的制约 4 worker_processes 1; 5 #全局错误日志及PID文件 6 #error_log logs/error.log; 7 #error_log logs/error.log notice; 8 #error_log logs/error.log info; 9 #pid logs/nginx.pid; 10 #工作模式及连接数上限 11 events { 12 #epoll是多路复用IO(I/O Multiplexing)中的一种方式, 13 #仅用于linux2.6以上内核,可以大大提高nginx的性能 14 use epoll; 15 #单个后台worker process进程的最大并发链接数 16 worker_connections 1024; 17 } 18 http { 19 #设定mime类型,类型由mime.type文件定义 20 include mime.types; 21 default_type application/octet-stream; 22 #设定日志输出模板 23 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 24 '$status $body_bytes_sent "$http_referer" ' 25 '"$http_user_agent" "$http_x_forwarded_for"'; 26 access_log logs/access.log main; 27 #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件, 28 #对于普通应用,必须设为 on, 29 #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off, 30 #以平衡磁盘与网络I/O处理速度,降低系统的uptime. 31 sendfile on; 32 #tcp_nopush on; 33 #连接超时时间 34 #keepalive_timeout 0; 35 keepalive_timeout 65; 36 tcp_nodelay on; 37 #开启gzip压缩 38 gzip on; 39 gzip_disable "MSIE [1-6]."; 40 #设定请求缓冲 41 client_header_buffer_size 128k; 42 large_client_header_buffers 4 128k; 43 #设定虚拟主机配置 44 server { 45 #侦听80端口 46 listen 80; 47 #定义使用 www.nginx.cn访问 48 server_name www.nginx.cn; 49 #定义服务器的默认网站根目录位置 50 root html; 51 #设定本虚拟主机的访问日志 52 access_log logs/nginx.access.log main; 53 #默认请求 54 location / { 55 #定义首页索引文件的名称 56 index index.php index.html index.htm; 57 } 58 # 定义错误提示页面 59 error_page 500 502 503 504 /50x.html; 60 location = /50x.html { 61 } 62 #静态文件,nginx自己处理 63 location ~ ^/(images|javascript|js|css|flash|media|static)/ { 64 #过期30天,静态文件不怎么更新,过期可以设大一点, 65 #如果频繁更新,则可以设置得小一点。 66 expires 30d; 67 } 68 #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置. 69 location ~ .php$ { 70 fastcgi_pass 127.0.0.1:9000; 71 fastcgi_index index.php; 72 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 73 include fastcgi_params; 74 } 75 #禁止访问 .htxxx 文件 76 location ~ /.ht { 77 deny all; 78 } 79 } 80 }
其中location根据不同前缀的使用方式,大致分为普通location和正则location。多个正则location之间会按照先后顺序进行匹配,匹配成功后,就不会继续匹配后面定义的location。多个普通location之间遵循“最大匹配原则”,匹配度最高的location将会被执行,同时也可以利用 =精准匹配和 ^~非正则匹配可以在正则匹配之前优先匹配,禁止执行原有的正则匹配。因此,当多种类型的 location 匹配同时出现时,最终执行结果为“= ”匹配优先于"^~"
匹配,“^~”
匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配。只要优先的location 匹配成功,就不会执行其他的location。
配置实例
8、使用反向代理和负载均衡
对于一个大型网站来说,随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须以增加服务器的方式,提高计算机系统的处理能力,计算速度,进而满足当前业务量的需求。那么如何实现服务器之间的协同功能呢?Nginx提供的反向代理和负载均衡功能是一个很好的解决方案。
8.1、反向代理
在Nginx服务器中,反向代理的配置非常简单,最主要的指令就是“proxy_pass”,用于设置后端服务器的地址。
1 server { 2 listen 80; 3 server_name localhost; 4 location / { 5 proxy_pass http://localhost:9000; 6 } 7 }
如上配置 所有 http://localhost:80的请求都会被转发到http://localhost:9000。
8.1.1、实例1,proxy_pass
打开浏览器,在浏览器地址栏输入地址www.123.com,跳转Linux系统tomcat主页面
准备工作:安装Tomcat,使用默认端口8080,启动Tomcat(安装见Linux篇)防火墙开放8080端口。
访问过程:Windows浏览器(www.123.com)--> nginx(192.168.56.100:80)--> tomcat(127.0.0.1:8080)
具体配置:C:\Windows\System32\drivers\etc\hosts,也可以使用switchhosts修改
1.windows的host文件进行配置。配置域名映射的ip地址。地址为:
192.168.56.100 www.123.com
2.在nginx进行请求转发的配置(反向代理配置)
1 server { 2 listen 80; 3 server_name 192.168.56.100; 4 5 #charset koi8-r; 6 7 #access_log logs/host.access.log main; 8 9 location / { 10 root html; 11 proxy_pass http://127.0.0.1:8080; 12 index index.html index.htm; 13 }
只显示修改部分,修改了server_name为主机ip,新增proxy_pass代理为本机8080端口。保存:wq退出。
[root@k8s-master01 conf]# cd .. [root@k8s-master01 nginx]# cd sbin/ [root@k8s-master01 sbin]# ls nginx [root@k8s-master01 sbin]# ./nginx -s reload
reload重新加载
浏览器访问www.123.com,能直接跳转到Tomcat首页。实验成功!
8.1.2、实例2,location
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001.
访问http://127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8080
访问http://127.0.0.1:9001/vod/ 直接跳转到127.0.0.1:8081
准备工作:准备2个tomcat,8080、8081、9001需要防火墙开启端口,修改配置文件,端口为8080和8081。创建文件夹和测试网页。找到nginx配置文件,进行反向代理配置。开放对外访问
server { listen 9001; server_name 192.168.56.100; location ~ /edu/ { proxy_pass http://127.0.0.1:8080; } location ~ /vod/ { proxy_pass http://127.0.0.1:8081; } }
访问http://192.168.56.100:9001/edu/a.html和http://192.168.56.100:9001/vod/b.html效果与之前相同。
location语法
location [=|~|~*|^~] uri {
}
=:用于不含正则表达式的url前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
~:用于表示uri,包含正则表达式,并且区分大小写。
~*:用于表示uri,包含正则表达式,并且不区分大小写。
^~:用于不含正则表达式的uri前,要求nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意:如果uri包含正则表达式,则必须要有~
或~*
标识。
8.2、负载均衡
负载均衡就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。
Nginx默认支持轮询、权重、ip Hash等多种负载均衡策略。
-
轮询:默认设置方式,每个请求按时间顺序逐一分配到不同的后端服务器进行处理,可以自动剔除宕机服务器。
-
权重方式:利用weight指定轮询的权重比率,用于后端服务器性能不均的情况。
-
ip_hash方式:每个请求按照IP的hash结果分配,这样可以让每个访客每次请求都访问同一个后端服务器,可以解决session共享的问题。
-
第三方模块:fair或url_hash等策略,nginx本身不包含该实现,需要下载对应的软件包。
负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。nginx提供了几种分配方式(策略)
1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动删除
2.weight代表权重,默认为1,权重越高被分配的客户端越多,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
此时upstream修改为:a、b为可设置的权重值
upstream myserver { server 192.168.56.100:8080 weight=a; server 192.168.56.100:8081 weghit=b; }
3.ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
此时upstream修改为:
upstream myserver { ip_hash; server 192.168.56.100:8080; server 192.168.56.100:8081; }
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
此时upstream修改为:
upstream myserver { server 192.168.56.100:8080; server 192.168.56.100:8081; fair; }
再举几个例子:
轮询配置:
1 server { 2 listen 80; 3 server_name localhost; 4 location / { 5 proxy_pass http://web_server; 6 } 7 } 8 #配置负载均衡服务器组 轮询方式 9 upstream web_server 10 { 11 server 192.168.78.128; 12 server 192.168.78.129; 13 }
权重方式配置:
upstream web_server1 { server 192.168.78.128 weight=1; server 192.168.78.129 weight=3; } upstream web_server2 { server 192.168.78.128 weight=1 max_fails=1 fail_timeout=2; server 192.168.78.129 weight=3; server 192.168.78.130 backup; }
按上图web_server1配置后,3/4的流量会转发到192.168.78.129的服务器上,1/4的流量会转发到192.168.78.128的服务器上,web_server2的配置表示 nginx在2s内发现后端服务异常达到max_fails次,就将该服务器标记为不可用。backup标记为预留的备份机器,当上面上个服务都宕机时,会将流量转发到备份机器。
IP Hash方式:
upstream web_server1 { ip_hash; server 192.168.78.128; server 192.168.78.129; server 192.168.78.130 down; }
down参数可以将服务器标记为下线状态,在路由分配时,会忽略该服务器。
实例upstream
浏览器地址栏输入地址http://192.168.56.100/edu/a.html,平均到8080和8081端口中
准备工作:准备2台tomcat服务器8080和8081,在两台tomcat里面webapps目录中,创建名称是edu的文件夹,在edu文件夹中创建页面a.html,不同的网页加入对应的端口号作为标记,用于测试
在nginx配置文件中加入upstream,location加入该upstream
upstream myserver { server 192.168.56.100:8080; server 192.168.56.100:8081; } server { listen 80; server_name 192.168.56.100; location / { root html; proxy_pass http://myserver; index index.html index.htm; }
reload后访问http://192.168.56.100/edu/a.html,不断刷新,可以看到访问不同的端口,不同的tomcat服务器
没有设置权重,默认概率相同。
9、动静分离
动态请求和静态请求分开,使用nginx处理静态页面,tomcat处理动态页面。
动静分离从目前实现角度来讲大致分为两种:一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另一种是动态跟静态文件混合在一起发布,通过nginx分开。
通过location指定不同的后缀名实现不同的请求转发。
通过expires参数设置浏览器缓存过期时间,减少与服务器之间的请求和流量。无需去服务端验证,直接通过浏览器身确认是否过期。所以不会产生额外的流量,此种方法非常适合不经常变动的资源,经常更新的不建议使用expires缓存。设置3d表示这3天内访问这个uri,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
实例
准备工作:准备一些静态资源用于访问,在/data中新建www和image文件夹,存放html网页和图片
配置nginx配置文件
server { listen 80; server_name 192.168.56.100; location /www/ { root /data/; index index.html index.htm; } location /image/ { root /data/; autoindex on; } }
访问 :http://192.168.56.100/image/
可以看到image资源,开启了autoindex on得到索引。点击图片链接能完成查看图片。
访问:http://192.168.56.100/www/a.html
可以看到www的html网页资源
10、高可用
nginx有可能宕机,仍需要保证发送接收请求。
设置主服务器(MASTER)和备份服务器(BACKUP)
准备工作:2台nginx服务器,keepalived,虚拟ip
2台nginx服务器ip设置为192.168.56.100和192.168.56.101,安装nginx和keepalived
yum install keepalived -y # 安装
rpm -q -a keepalived # 查看安装版本
安装后配置文件在/etc/keepalived目录下的keepalived.conf
完成高可用配置(主从配置)
1.修改主从机/etc/keepalived/keepalived.conf配置
主机192.168.56.100
1 ! Configuration File for keepalived 2 3 global_defs { 4 5 notification_email { 6 7 acassen@firewall.loc 8 9 failover@firewall.loc 10 11 sysadmin@firewall.loc 12 } 13 14 notification_email_from Alexandre.Cassen@firewall.loc 15 16 smtp_server 192.168.56.100 17 18 smtp_connect_timeout 30 19 20 router_id LVS_DEVEL # 主机名字 21 } 22 23 24 vrrp_script chk_http_port { 25 script "/usr/local/src/nginx_check.sh" 26 interval 2 #(检测脚本执行的间隔) 27 weight 2 # 权重 28 } 29 vrrp_instance VI_1 { 30 state MASTER # 备份服务器上将 MASTER 改为 BACKUP 31 interface eth1 # 网卡,在ifconfig中查找192.168.56.100的接口名 32 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 33 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 34 advert_int 1 35 authentication { 36 auth_type PASS 37 auth_pass 1111 38 } 39 40 virtual_ipaddress { 41 192.168.56.50 # VRRP H 虚拟地址 42 } 43 44 }
从机192.168.56.101
1 ! Configuration File for keepalived 2 3 global_defs { 4 5 notification_email { 6 7 acassen@firewall.loc 8 9 failover@firewall.loc 10 11 sysadmin@firewall.loc 12 13 } 14 15 notification_email_from Alexandre.Cassen@firewall.loc 16 17 smtp_server 192.168.56.100 18 19 smtp_connect_timeout 30 20 21 router_id LVS_DEVEL # 访问到主机,在hosts文件中可设置127.0.0.1 22 } 23 24 25 vrrp_script chk_http_port { 26 script "/usr/local/src/nginx_check.sh" 27 interval 2 28 weight 2 29 } 30 vrrp_instance VI_1 { 31 state BACKUP # 修改为从机 BACKUP 32 interface eth1 # 修改为从机 ip 33 virtual_router_id 51 34 priority 90 # 优先级比主机低 35 advert_int 1 36 authentication { 37 auth_type PASS 38 auth_pass 1111 39 } 40 41 virtual_ipaddress { 42 192.168.56.50 43 } 44 45 }
2.在主从机/usr/local/src添加检测脚本nginx_check.sh,内容相同。
检测nginx是否还在运行(检测nginx的pid),不运行(pid=0)就终止keepalived进程
1 #!/bin/bash 2 A=`ps -C nginx –no-header | wc -l` 3 if [ $A -eq 0 ];then 4 /usr/local/nginx/sbin/nginx 5 sleep 2 6 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 7 killall keepalived 8 fi 9 fi
3.两台服务器上的nginx和keepalived启动
1 systemctl start keepalived.service 2 ps -ef | grep keepalived # 查看运行状态 3 root 16057 1 0 22:30 ? 00:00:00 /usr/sbin/keepalived -D 4 root 16058 16057 0 22:30 ? 00:00:00 /usr/sbin/keepalived -D 5 root 16059 16057 0 22:30 ? 00:00:00 /usr/sbin/keepalived -D 6 root 16722 1382 0 22:30 pts/0 00:00:00 grep --color=auto keepalived
4.测试正常运行时场景
在浏览器地址栏输入虚拟地址192.168.56.50,能访问到nginx首页。
主机输入ip a
查看ip配置,可以在对应ip下找到新的inet,使用了虚拟ip地址,完成了绑定
以主机192.168.56.100为例:
1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 2 link/ether 08:00:27:09:1a:85 brd ff:ff:ff:ff:ff:ff 3 inet 192.168.56.100/24 brd 192.168.56.255 scope global noprefixroute eth1 4 valid_lft forever preferred_lft forever 5 inet 192.168.56.50/32 scope global eth1 6 valid_lft forever preferred_lft forever
5.把主服务器nginx和keepalived停止,再用浏览器访问虚拟地址
1 [root@k8s-master01 sbin]# systemctl stop keepalived.service 2 [root@k8s-master01 sbin]# ./nginx -s stop 3 [root@k8s-master01 sbin]# ps -ef | grep keepalived 4 root 9741 5569 0 22:37 pts/0 00:00:00 grep --color=auto keepalived
仍然能出现nginx首页,在从机使用ip a
查看,也能找到虚拟ip地址,表示已经跳转到了从机使用。完成了高可用。
keepalived.conf配置文件详解
1 ! Configuration File for keepalived 2 3 global_defs { 4 5 notification_email { 6 7 acassen@firewall.loc 8 9 failover@firewall.loc 10 11 sysadmin@firewall.loc 12 } 13 14 notification_email_from Alexandre.Cassen@firewall.loc 15 16 smtp_server 192.168.56.100 17 18 smtp_connect_timeout 30 19 20 router_id LVS_DEVEL # 主机名字,可在hosts文件中127.0.0.1设置 21 } 22 23 24 vrrp_script chk_http_port { 25 script "/usr/local/src/nginx_check.sh" 26 interval 2 #(检测脚本执行的间隔) 27 weight 2 # 设置服务器权重 28 } 29 vrrp_instance VI_1 { 30 state MASTER # 备份服务器上将 MASTER 改为 BACKUP 31 interface eth1 # 网卡,在ifconfig中查找192.168.56.100的接口名 32 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 33 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 34 advert_int 1 # 每隔1s发送一个心跳,检测是否还存活 35 authentication { # 校验身份 36 auth_type PASS 37 auth_pass 1111 38 } 39 40 virtual_ipaddress { 41 192.168.56.50 # VRRP H 虚拟地址 42 } 43 44 }
11、nginx原理
11.1、master&worker
运行nginx后查看进程,可以看到两个进程master process和worker process
1 [root@k8s-master01 sbin]# ps -ef | grep nginx 2 root 4433 1 0 22:56 ? 00:00:00 nginx: master process ./nginx 3 nobody 4434 4433 0 22:56 ? 00:00:00 nginx: worker process
管理员发信号到nginx的master进程,master进程分发任务给worker进程,并完成管理和监控,worker进程通过争抢机制完成和client的连接
好处:
-
可以使用nginx -s reload热部署,除了正在处理任务的worker外,其余worker能直接更新配置
-
对于每个worker进程来说,独立的进程不需要加锁,省去了锁带来的开销,方便编程和查找问题。互相不受影响,一个进程退出后,其他进程仍在工作不会中断,master进程会很快启动新的worker进程,降低了风险。
11.2、需要设置多少个worker?
nginx和redis类似都采用了io多路复用机制,每一个worker都是一个独立的进程,但每个进程只有一个主线程,通过异步非阻塞的方式处理请求,可能处理成千上万的请求。每个worker进程可以使用1个CPU处理,所以设计为服务器CPU核数相等是最为适宜的。设置少了会浪费CPU,多了会造成CPU频繁切换上下文带来的损耗。
设置数量举例:4个worker绑定8个CPU的4个
worker_processes 4
work_cpu_affinity 0001 0010 0100 1000
11.3、连接数worker_connection
表示每个worker进程所能建立连接的最大值。
发送请求,占用了worker的多少个连接数?2或4个
2个:没有抢到的,只和master有双向2个连接
4个:抢到客户端连接的worker每个并发会建立与客户端的连接和与后端服务的连接,会增加2个连接。
nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
普通的静态访问(没抢到连接的)最大并发数是:
worker_connections*worker_processes/2
=1024*4/2=2048
而如果是 HTTP 作为反向代理(抢到client连接的)来说,最大并发数量应该是
worker_connections*worker_processes/4
=1024*4/4=1024