- 第五章:Nginx动静分离
- 第六章:Nginx高可用集群
- 第七章:Nginx配置详解
- 第八章:Nginx原理分析
第五章:Nginx动静分离
5.1、概述
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx来分开。
5.2、实现效果
如果不设置动静分离,默认会通过Nginx的反向代理去找Tomcat对应的资源,现在我们在根目录下创建一个/data/www/文件夹,里边放上静态资源,比如一个html页面,在8080的那台Tomcat的WebApps下也创建一个www目录,同样是放一个静态资源,当输入这个静态资源的请求时,访问到的是/data/www中的数据。
5.3、实现思路
5.4、实现步骤
第一步:创建静态资源文件,为了对比,Tomcat中也放一个
[root@caochenlei ~]# mkdir -p /data/www/ [root@caochenlei ~]# mkdir -p /usr/local/tomcat/webapps/ROOT/www [root@caochenlei ~]# echo "<h1>/data/www/a.html</h1>" > /data/www/a.html [root@caochenlei ~]# echo "<h1>/usr/local/tomcat/webapps/ROOT/www/a.html</h1>" > /usr/local/tomcat/webapps/ROOT/www/a.html
第二步:修改Nginx的配置文件
[root@caochenlei ~]# vi /usr/local/nginx/conf/nginx.conf server { listen 80; server_name 192.168.206.128; #charset koi8-r; #access_log logs/host.access.log main; location /www/ { root /data/; index index.html index.htm; } [root@caochenlei ~]# /usr/local/nginx/sbin/nginx
第三步:启动Tomcat
[root@caochenlei ~]# /usr/local/tomcat/bin/startup.sh
第四步:启动浏览器进行测试
打开浏览器输入:http://192.168.206.128/www/a.html
5.5、关闭服务
[root@caochenlei ~]# /usr/local/nginx/sbin/nginx -s quit [root@caochenlei ~]# /usr/local/tomcat/bin/shutdown.sh
第六章:Nginx高可用集群
6.1、概述
前边我们学习了反向代理、负载均衡、动静分离,但试想一下,如果Nginx挂掉了,那么服务肯定就没有了,有没有一种解决方案,可以保证Nginx挂掉了,服务也可以照常使用,答案肯定是有的,这就是我们接下来要学习的高可用集群,采用的是一主一备的模式,当主节点Nginx挂掉,备份服务器Nginx立刻跟上,这样就保证了服务的高可用性。
6.2、实现效果
当主节点Nginx挂掉以后,服务依然可以正常使用。
6.3、实现思路
6.4、实现步骤
第一步:修改主
Kubernetes 是目前唯一被业界广泛认可的 Docker 分布式解决方案。通过Kubernetes,我们可以轻装上阵的开发与管理复杂的业务系统。Kubernetes 已经毫无疑问地成为容器领域当之无愧的事实标准。
节点上的Nginx的配置文件
[root@caochenlei ~]# vi /usr/local/nginx/conf/nginx.conf upstream myserver { server 192.168.206.128:8080; server 192.168.206.128:8081; } server { listen 80; server_name 192.168.206.128; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://myserver; } [root@caochenlei ~]# /usr/local/nginx/sbin/nginx
第二步:启动主节点上的两台Tomcat
[root@caochenlei ~]# /usr/local/tomcat1/bin/startup.sh [root@caochenlei ~]# /usr/local/tomcat2/bin/startup.sh
第三步:安装主节点上的keepalived
安装keepalived:
[root@caochenlei ~]# yum install -y keepalived
删除keepalived的配置文件:
[root@caochenlei ~]# rm -f /etc/keepalived/keepalived.conf
新增keepalived的配置文件:
[root@caochenlei ~]# vi /etc/keepalived/keepalived.conf
注意:一定要注意router_id、state、interface的值,我就在这里踩坑了。
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #邮件服务器通知地址(暂不配置,默认即可) smtp_server 192.168.200.1 #邮件服务器超时时间(暂不配置,默认即可) smtp_connect_timeout 30 #当前虚拟机的IP地址 router_id 192.168.206.128 } vrrp_script Monitor_Nginx { script "/etc/keepalived/nginx_check.sh" #检测脚本执行的路径 interval 2 #检测脚本执行的间隔 weight 2 #检测脚本执行的权重 } vrrp_instance VI_1 { state MASTER #标识这个机器是MASTER还是BACKUP interface eth0 #当前机器的网卡名称 virtual_router_id 51 #虚拟路由的编号,主备必须一致 priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 #(VRRP Multicast广播周期秒数) authentication { auth_type PASS #(VRRP认证方式) auth_pass 1111 #(密码) } track_script { Monitor_Nginx #(调用Nginx进程检测脚本) } virtual_ipaddress { 192.168.206.50 #虚拟IP地址 } }
新增keepalived的检测脚本:
[root@caochenlei ~]# vi /etc/keepalived/nginx_check.sh #!/bin/bash if [ "$(ps -ef | grep "nginx: master process" | grep -v grep )" == "" ] then killall keepalived fi
启动keepalived服务:
[root@caochenlei ~]# service keepalived start
第四步:准备一台全新的虚拟机,安装Nginx和keepalived
启动虚拟机:
安装Nginx依赖:
[root@caochenlei ~]# yum install -y gcc gcc-c++ make libtool wget pcre pcre-devel zlib zlib-devel openssl openssl-devel
下载Nginx文件:
[root@caochenlei ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
安装Nginx程序:
[root@caochenlei ~]# tar -zxvf nginx-1.18.0.tar.gz [root@caochenlei ~]# cd nginx-1.18.0 [root@caochenlei nginx-1.18.0]# ./configure [root@caochenlei nginx-1.18.0]# make && make install [root@caochenlei nginx-1.18.0]# cd ~
开放Nginx防火墙:
[root@caochenlei ~]# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT [root@caochenlei ~]# /etc/rc.d/init.d/iptables save iptables:将防火墙规则保存到 /etc/sysconfig/iptables: [确定]
修改Nginx的配置:
[root@caochenlei ~]# vi /usr/local/nginx/conf/nginx.conf upstream myserver { server 192.168.206.128:8080; server 192.168.206.128:8081; } server { listen 80; server_name 192.168.206.128; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://myserver; }
启动Nginx的服务:
[root@caochenlei ~]# /usr/local/nginx/sbin/nginx
安装keepalived:
[root@caochenlei ~]# yum install -y keepalived
删除keepalived的配置文件:
[root@caochenlei ~]# rm -f /etc/keepalived/keepalived.conf
新增keepalived的配置文件:
[root@caochenlei ~]# vi /etc/keepalived/keepalived.conf
注意:一定要注意router_id、state、interface的值,我就在这里踩坑了。
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #邮件服务器通知地址(暂不配置,默认即可) smtp_server 192.168.200.1 #邮件服务器超时时间(暂不配置,默认即可) smtp_connect_timeout 30 #当前虚拟机的IP地址 router_id 192.168.206.129 } vrrp_script Monitor_Nginx { script "/etc/keepalived/nginx_check.sh" #检测脚本执行的路径 interval 2 #检测脚本执行的间隔 weight 2 #检测脚本执行的权重 } vrrp_instance VI_1 { state BACKUP #标识这个机器是MASTER还是BACKUP interface eth1 #当前机器的网卡名称 virtual_router_id 51 #虚拟路由的编号,主备必须一致 priority 10 #主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 #(VRRP Multicast广播周期秒数) authentication { auth_type PASS #(VRRP认证方式) auth_pass 1111 #(密码) } track_script { Monitor_Nginx #(调用Nginx进程检测脚本) } virtual_ipaddress { 192.168.206.50 #虚拟IP地址 } }
新增keepalived的检测脚本:
[root@caochenlei ~]# vi /etc/keepalived/nginx_check.sh #!/bin/bash if [ "$(ps -ef | grep "nginx: master process" | grep -v grep )" == "" ] then killall keepalived fi
启动keepalived服务:
[root@caochenlei ~]# service keepalived start
第五步:测试两个Nginx是否能正确的将请求分发到不同的Tomcat(负载均衡)
打开IE浏览器输入:http://192.168.206.128/edu/a.html
按住F5多刷新两遍,看看会不会,将请求转发到Tomcat2中去。
打开IE浏览器输入:http://192.168.206.129/edu/a.html
按住F5多刷新两遍,看看会不会,将请求转发到Tomcat2中去。
打开IE浏览器输入:http://192.168.206.50/edu/a.html,测试虚拟IP能不能实现负载均衡。
按住F5多刷新两遍,看看会不会,将请求转发到Tomcat2中去。
经过测试,我们发现一主一从、虚拟IP都能正常的进行负载均衡,接下来我们测试主节点挂掉,从节点会不会自动顶上,打开主节点机器,查看相关进程,杀死Nginx,然后打开浏览器,输入配置的虚拟IP地址:http://192.168.206.50/edu/a.html,发现负载均衡的效果还在,说明配置成功了。
6.5、关闭服务
主机节点:
[root@caochenlei ~]# service keepalived stop [root@caochenlei ~]# /usr/local/nginx/sbin/nginx -s quit [root@caochenlei ~]# /usr/local/tomcat1/bin/shutdown.sh [root@caochenlei ~]# /usr/local/tomcat2/bin/shutdown.sh
备份节点:
[root@caochenlei ~]# service keepalived stop [root@caochenlei ~]# /usr/local/nginx/sbin/nginx -s quit
第七章:Nginx配置详解
Nginx是通过配置文件来做到各个功能的实现的。Nginx的配置文件的格式非常合乎逻辑,学习这种格式以及如何使用这种每个部分是基础,这将帮助我们有可能手工创建一个配置文件。
7.1、整体结构图
7.2、配置演示图
7.3、全局块
配置影响Nginx全局的指令。主要包括:
- 配置运行Nginx服务器用户(组)
- worker process数
- Nginx进程
- PID存放路径错误日志的存放路径
- 一个Nginx进程打开的最多文件描述符数目
例如:
#配置worker进程运行用户(和用户组),nobody也是一个Linux用户,一般用于启动程序,没有密码 user nobody; #user www www; #配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量 worker_processes 1; #配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #配置进程pid文件 pid logs/nginx.pid; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与Nginx进程数相除,但是Nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。 worker_rlimit_nofile 65535;
7.4、events块
配置影响Nginx服务器或与用户的网络连接。主要包括:
- 事件驱动模型的选择
- 最大连接数的配置
例如:
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; #epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535;
7.5、http块
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。主要包括:
- 定义MIMI-Type
- 自定义服务日志
- 允许sendfile方式传输文件
- 连接超时时间
- 单连接请求数上限
例如:
#常见的一些基础配置 include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 charset utf-8; #默认编码 server_names_hash_bucket_size 128; #服务器名字的hash表大小 client_header_buffer_size 32k; #上传文件大小限制 large_client_header_buffers 4 64k; #设定请求缓冲 client_max_body_size 8m; #设定请求缓冲 sendfile on; #开启高效文件传输模式,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 tcp_nopush on; #防止网络阻塞 tcp_nodelay on; #防止网络阻塞 keepalive_timeout 120; #长连接超时时间,单位是秒 #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型 gzip_vary on; #增加响应头'Vary: Accept-Encoding' limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
7.6、server块
配置虚拟主机的相关参数,一个http中可以有多个server。主要包括:
- 配置网络监听
- 配置https服务
- 基于名称的虚拟主机配置
- 基于IP的虚拟主机配置
例如:
#虚拟主机的常见配置 server { listen 80; #配置监听端口 server_name localhost; #配置服务名 charset utf-8; #配置字符集 access_log logs/host.access.log main; #配置本虚拟主机的访问日志 location / { root html; #root是配置服务器的默认网站根目录位置,默认为Nginx安装主目录下的html目录 index index.html index.htm; #配置首页文件的名称 } error_page 404 /404.html; #配置404错误页面 error_page 500 502 503 504 /50x.html; #配置50x错误页面 } #配置https服务,安全的网络传输协议,加密传输,端口443 server { listen 443 ssl; server_name localhost; ssl_certificate cert.pem; ssl_certificate_key cert.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
7.7、location块
配置请求的路由,以及各种页面的处理情况。主要包括:
- 请求根目录配置更改
- 网站默认首页配置
- location的URI
例如:
root html; #root是配置服务器的默认网站根目录位置,默认为Nginx安装主目录下的html目录 index index.html index.htm; #配置首页文件的名称 proxy_pass http://127.0.0.1:88; #反向代理的地址 proxy_redirect off; #是否开启重定向 #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; #以下是一些反向代理的配置,可选。 client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(Nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小
location的URI:
描述:该指令用于匹配URL
语法:
通配符:
- =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
- ~:用于表示uri包含正则表达式,并且区分大小写。
- ~*:用于表示uri包含正则表达式,并且不区分大小写。
- ^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意:如果uri包含正则表达式,则必须要有~或者~*标识。
第八章:Nginx原理分析
8.1、Nginx的线程模型?
Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。
Nginx的进程模型如图所示:
8.2、worker的工作模式?
worker对于连接是采用争抢的模式,谁先抢到就先交给谁处理,如果想要重新更新配置,由于已经抢到任务的worker不会参与争抢,那些空闲的worker就会去争抢连接,拿到连接后会自动更新配置信息,当那些有任务的worker完成任务后,会自动更新配置,这样就实现了无缝热部署。由于每个worker是独立的进程,如果有其中的一个worker出现问题,并不会影响其它worker继续进行争抢,在实现请求的过程,不会造成服务中断,建议worker数和服务器的CPU数相等是最为适宜的。
8.3、如何计算worker连接数?
如果只访问Nginx的静态资源,一个发送请求会占用了woker的2个连接数
而如果是作为反向代理服务器,一个发送请求会占用了woker的4个连接数
8.4、如何计算最大的并发数?
如果只访问nginx的静态资源,最大并发数量应该是:worker_connections * worker_processes / 2
而如果是作为反向代理服务器,最大并发数量应该是:worker_connections * worker_processes / 4


















