一、nginx实战
1、nginx 反向代理配置
(1)概述
反向代理:⽤户直接访问反向代理服务器就可以获得⽬标服务器(后端服务器)的资源。
(2)修改配置
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location /status {
stub_status on;
access_log off;
}
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.33.11:80;
}
[root@server2 ~]# systemctl reload nginx.service
(3)建⽴后端服务器
使⽤另⼀台虚拟机,安装 nginx ,然后进⼊/usr/share/nginx/html/ ⽬录,修改其中的 index.html ⽂件,随 便写⼊⼀条内容进⾏测试。
[root@YH1 ~]# vim /usr/share/nginx/html/index.html
这⾥是192.168.33.11
(4)访问测试
浏览器输⼊本机地址 192.168.33.110,将会⾃动跳转到后端服务器 192.168.33.11 上
2、nginx 访客 IP ⿊名单
(1)修改配置
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
charset utf-8;
allow 192.168.33.22; //允许192.168.33.22⽤户访问
deny 192.168.33.0/24; //拒绝33.0⽹段的⽤户访问
deny all; //拒绝所有
(2)访问测试
1)因为当前服务器拒绝了 33.0 ⽹段的⽤户访问,⽽本机浏览器正是通过 33.1 ⽹关与服务器建⽴连接,所以浏览器被拒绝访问了,显示 403 错误信息。
2)使⽤也是 192.168.33.0 ⽹段的 33.11 的 YH1 主机访问服务器进⾏测试。
[root@YH1 ~]# ip a //查看当前主机的IP
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500 qdisc fq_codel state UP group default qlen
1000
link/ether 00:0c:29:72:29:0b brd
ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.33.11/24 brd 192.168.33.255 scope
global noprefixroute ens32
[root@YH1 ~]# curl 192.168.33.110 //访问33.110服务器进⾏测试
<html>
<head><title>403 Forbidden</title></head> //可以看到403错误,说明访问同样被拒
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.24.0</center>
</body>
</html>
3)使⽤之前允许的 192.168.33.22 的 YH2 主机进⾏访问服务器测试。
[root@YH2 ~]# ip a //查看当前主机的IP
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500 qdisc fq_codel state UP group default qlen
1000
link/ether 00:0c:29:10:45:e6 brd
ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.33.22/24 brd 192.168.33.255 scope
global noprefixroute ens32
[root@YH2 ~]# curl 192.168.33.110 #访问33.110服务器进⾏测试欢迎访问!
这⾥是 192.168.33.110 服务器! //测试成功,可以访问
3、为 server 主机配置访问和错误⽇志
(1)控制⽇志参数
1)nginx 访问⽇志主要控制参数
log_format:⽤来定义记录⽇志的格式(可以定义多种⽇志格式,取不同名字即可)access_log:⽤来指定⽇志⽂件的路径及使⽤何种⽇志格式记录⽇志
2)log_format ⽇志格式变量
$remote_addr:记录访问⽹站的客户端地址。$remote_user:远程客户端⽤户名。$time_local:记录访问时间与时区。$request:⽤户的http请求起始⾏信息。$status:http状态码,记录请求返回的状态码,例如:200、301、404等。$body_bytes_sent:服务器发送给客户端的响应body字节数。$http_referer:记录此次请求是从哪个连接访问过来的,可以根据该参数进⾏防盗链设置。$http_user_agent:记录客户端访问信息,例如:浏览器、⼿机、客户端等。$http_x_forwarded_for:当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进⾏相关的x_forwarded_for设置。
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
#log_format main '$remote_addr -
$remote_user [$time_local] "$request" '
# '$status $body_bytes_sent
"$http_referer" '
# '"$http_user_agent"
"$http_x_forwarded_for"';
(2)access_log 访问⽇志
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
#access_log logs/access.log main; #访问⽇志的路径和格式
(3)error_log 错误⽇志
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
错误⽇志:error_log 不能改变.⽇志⽂件:指定⽇志的存放⽬录错误⽇志级别:debug、info、notice、warn、error、crit、alert、emerg,级别越⾼记录的信息越少⽣产环境⼀般为 warn、error、crit 这三个级别之⼀。不要配置 info 等级较低的级别,会造成磁盘消耗。
4、nginx 错误⻚⾯
nginx 的错误⻚⾯与访问⾸⻚⼀样,都有⾃⼰的索引⽂件,⼀般⽤户访问的⽹站都是对应的索引⽂件。
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
error_page 500 502 503 504 /50x.html;
#500~504错误代码,不论哪个代码,错误⻚⾯都是50x.html
location = /50x.html { #错误⽂件所在路径
root html; #该⽹站的根⽬录
}
5、location 块的匹配规则和优先级
(1)location⼤致可以分为三类
精准匹配:location = / {...}正则匹配:location ~ / {...}⼀般匹配:location / {...}
(2)location常⽤的匹配规则
= :进⾏普通字符精确匹配,也就是完全匹配。^~ :表示普通字符匹配。使⽤前缀匹配。如果匹配成功,则不再匹配其它 location。}~ :区分⼤⼩写的匹配。~* :不区分⼤⼩写的匹配。!~ :区分⼤⼩写的匹配取⾮。!~* :不区分⼤⼩写的匹配取⾮。
(3)location优先级
⾸先精确匹配 =其次前缀匹配 ^~其次是按⽂件中顺序的正则匹配 或 *然后匹配不带任何修饰的前缀匹配最后是交给 / 通⽤匹配
精确>前缀>正则>⼀般>通⽤(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) >(location 部分起始路径) >(location /)
(4)location 示例说明
1)location = / {}
a、= 为精确匹配 / ,主机名后⾯不能带任何字符串,⽐如访问 / 和/data,则 / 匹配,/data 不匹配。b、再⽐如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc、/abcd/ 同时也匹配/abc/。
2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求⽐如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后⾯是正则表达式会和最⻓字符串优先匹配(最⻓匹配)。
3)location /file/ {}
匹配任何以 /file/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location。只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这⼀条。
4)location /file/abc {}
匹配任何以 /file/abc 开头的地址,匹配符合以后,还要继续往下搜索其它location。只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这⼀条。
5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停⽌往下搜索正则,采⽤这⼀条。
6)location ~ .(gif|jpg|jpeg)$ {}*
匹配所有以 gif、jpg或jpeg 结尾的请求.然⽽,所有请求/images/ 下的图⽚会被 location ^~ /images/ 处理,因为 ^~ 的优先级更⾼,所以到达不了这⼀条正则。
7)location /images/abc {}
最⻓字符匹配到 /images/abc,优先级最低,继续往下搜索其它location,会发现 ^~ 和 ~ 存在。
8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location^~ /images/ 才会采⽤这⼀条。
9)location /images/abc/1.html {}
匹配/images/abc/1.html ⽂件,如果和正则location ~/images/abc/1.html 相⽐,正则优先级更⾼。
6、rewrite 重写和⽹站跳转
(1)301 永久跳转
1)301 永久跳转:当⽤户或搜索引擎向⽹站服务器发起浏览请求时,服务器返回的 HTTP 数据流中头信息(index.html 等)中的状态码的⼀种,表示本⽹⻚永久性地转移到了另⼀个地址。2)rewrite 重写跳转规则3)http://www.yang1314/$1:跳转到的⽬标地址,后⾯的$1代表链参数也⼀起跳转。4)⽐如访问 www.yh666.com/123 就会跳转到www.yang1314/123 没有的话。就会直接跳转到 www.yang1314.com5)permanent:301 永久跳转
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.yh666.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
rewrite ^/(.*)$
http://www.yang1314.com/$1 permanent; #添加此参数
}
}
(2)302 临时跳转
1)跟 301 永久跳转相⽐,302 就是⼀个参数的差别。2)配置规则按着 301 配置⾛即可找到域名配置⽂件的Server或者location段,适当位置添加下⾯代码:rewrite^/(*) [http://www.1](http://www.yang1314.com/](http://www.leige.com/$1) redirect;
[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.yh666.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
rewrite ^/(.*)$
http://www.yang1314.com/$1 redirect;
}
}
7、平滑升级
(1)原理
1)启动后完成配置加载和端⼝绑定等动作, 分离出指定数量的⼯作⼦进程 ,这些⼦进程会持有监听端⼝的⽂件描述符 (fd),并通过在该描述符上添加监听事件来接受连接。
2)Nginx 主进程在启动完成后会进⼊等待状态,负责响应各类系统消息,如 SIGCHLD、SIGHUPSIGUSR2 等。
3)主进程⽀持的信号a、TERM、INT:⽴刻退出b、QUIT:等待⼯作进程结束后再退出d、HUP:重新加载配置⽂件,使⽤新的配置启动⼯作进程,并逐步关闭旧进程e、USR1:重新⽣成⽇志⽂件;f、USR2:启动新的主进程,实现热升级g、WINCH:逐步关闭⼯作进程及⼯作进程⽀持的信号
(2)过程
1)查看旧版nginx的编译参数;2)编译新版本 Nginx 源码包,安装路径需与旧版⼀致,注意: 不要执⾏ make install;3)备份⼆进制可执⾏⽂件,⽤新版本的替换;4)确保配置⽂件⽆报错;5)发送USR2信号:向主进程(master) 发送USR2信号,Nginx 会启动⼀个新版本的 master 进程和对应⼯作进程,和旧版⼀起处理请求;6)发送WINCH信号:向旧的 Nginx主进程(master) 发送 WINCH 信号,它会逐步关闭⾃⼰的⼯作进程(主进程不退出),这时所有请求都会由新版Nginx处理;7)发送QUIT 信号: 升级完毕,可向旧的 Nginx 主进程(master) 发送 (QUIT、TERM、或者KILL)信号,使旧的主进程退出;8)验证nginx 版本号,并访问测试.
二、负载均衡
1、概述
早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求, 但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复 杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器进行性能的水平扩展及避免单点故障出现。
负载均衡是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响 应足够快,给用户很好的体验,快速增长的访问量和数据流量催生了各式各样的负载均衡的产品,很多专业的的负载均衡硬件提供了很好的功能,但价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中一个,在 linux 下有nginx、 Ivs 、 haproxy 等服务,可以提供复杂均衡服务。
2、负载均衡原理
负载均衡 NAT ( Network Address Translation 网络地址转换)简单地说就是将一个IP 地址转换为另一个 IP 地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP 地址间进行转换。适用于解决 Internet IP 地址紧张、不想让网络外部知道内部网络结构等的场合下。
系统的扩展可以分为纵向扩展和横向扩展。纵向扩展:从单机的角度出发,通过增加系统的硬件处理能力来提升服务器的处理能力;横向扩展:通过添加机器来满足大型网站服务的处理能力。
这里面涉及到两个重要的角色分别是 “ 应用集群 ” 和 “ 负载均衡器应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理。
(
1
)准备软件包并查看旧版软件
3、负载均衡的作用
解决服务器的高并发压力,提高应用程序的处理性能;提供故障转移,实现高可用;通过添加或减少服务器数量,增强网站的可扩展性;在负载均衡器上进行过滤,可以提高系统的安全性;
(1)提高系统性能
负载均衡可以扩展网络设备和服务器的带宽,优化访问请求在服务器组之间的分配,提高系统的反应速度和总体性能。
(2)监控服务器的运行状态
负载均衡能够监控服务器的运行状态,提高整个服务器组的可靠性。
(3)提供服务一致性
负载均衡器具有提供服务一致性的功能,负载均衡器通过读取客户端所发出请求内的信息,进行重写报头程序然后将请求发送至合适的服务器上,该服务器会维护着该客户端信息。在http 通信当中,负载均衡器提供服务一致性的功能就得到了很好的发挥,但提供该服务的途径并不是非常安全。但若将消息加密后,负载均衡器就无法读取隐藏其中的信息了。
(4)摆脱停机时间
服务器托管公司可能会在维护期间将服务器关闭一段时间,这可能发生在业务的高峰期。在基于云服务器中,可以在将流量引导到另一台服务器的资源之后进行维护,前提是它们不在维护中,从而可以消除网站的停机时间。
(5)管理服务器故障
由于它具有根据需要添加或删除实例的功能,因此可以跨云平台拥有多个数据中心。如果其中一台服务器发生故障,则可以快速移动流量,将故障服务器的流量流入到另一台服务器中。
(6)转发功能
按照一定的算法,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
(7)恢复添加
如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
(8)分发流量
分发流量、请求到不同的服务器。使流量平均分配,提高整个集群的响应速度、服务的高可用性。
4、负载均衡常用处理方式
(1)负载均衡分为四层负载均衡和七层负载均衡。1)四层负载均衡是工作在 OSI 七层协议的第四层 —— 传输层,基于IP+PORT的负载均衡,主要工作是转发。2)它在接收到客户端的流量以后通过修改数据包的地址信息(目标地址和端口和源地址)将流量转发到应用服务器。3)实现四层负载均衡的方式:硬件: F5 、 BIG-IP 、 Radware 等 ;软件: LVS 、 Nginx 、 Haproxy 等。
(1)七层负载均衡是工作在七层协议的第七层 - 应用层,基于虚拟的 URL 或主机IP 的负载均衡,主要工作是代理。(2)它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。(3)实现七层负载均衡的方式:软件: Nginx 、 Hayproxy 等。
5、四层和七层负载均衡的区别
(1)四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的效率要高;(2)四层负载均衡不识别域名,而七层负载均衡识别域名。(3)除了四层和七层负载均衡以外其实还有二层、三层负载均衡。二层负载均衡是在数据链路层基于MAC 地址来实现负载均衡,三层是在网络层一般采用虚拟IP 地址的方式实现负载均衡。(4)实际环境采用的方式:四层负载 (LVS) + 七层负载 (Nginx)