目录
1、什么是Nginx
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,同时也是一个IMAP、POP3、SMTP代理服务器。 它能够作为一个HTTP服务器进行网站的发布处理,并且可以作为反向代理实现负载均衡。
2、为什么使用Nginx
Nginx的特点包括高性能、轻量级、内存占用少、并发能力强等,这些特点使得Nginx在处理高并发请求时表现出色。此外,Nginx还具有高扩展性,支持大量的功能模块,可以满足各种应用场景的需求。由于其稳定性和性能优势,Nginx被广泛应用于各种网站和应用程序中,包括百度、京东、腾讯、淘宝等知名网站都采用了Nginx作为其服务器软件。
3、Nginx的核心功能
Nginx的主要功能包括:
- 反向代理:Nginx可以作为反向代理服务器,将客户端的请求转发到后端服务器,实现负载均衡和故障转移。
- 负载均衡:通过配置多个后端服务器,Nginx可以智能地分配请求到不同的服务器,以提高系统的整体性能和可靠性。
- 动静分离:Nginx可以作为静态内容服务器,处理动态网页中的静态部分,实现动静分离,提高网站访问速度。
- 正向代理:虽然Nginx主要作为反向代理使用,但它也支持正向代理功能,允许用户通过代理服务器访问外部网络资源。
3.1 反向代理
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。如图所示:
Nginx代理服务的配置说明
1、设置404导向页面地址
error_page 404 https://blog.csdn.net; #错误页
proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
2、如果我们的代理只允许接受get,post请求方法的一种
proxy_method get; #支持客户端的请求方法。post/get;
3、设置支持http协议版本
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本
4、如果nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当一台机器web程序iis关闭,也就是说web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢?配张图来说明下问题。
如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求道web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。
下面的配置是解决方案:
proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
5、如果使用upstream指令配置啦一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。
proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。
状态值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
- error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
- timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
- invalid_header:被代理服务器返回的响应头异常。
- off:无法将请求分发给被代理的服务器。
- http_400,....:被代理服务器返回的状态码为400,500,502,等。
6、下面是一个关于代理配置文件的部分 ,仅供参考
server {
listen 82;
server_name localhost;
location /{
# 代理的服务器地址
proxy_pass http://192.168.111.132:8080;
}
}
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
proxy_connect_timeout 1; #nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_read_timeout 1; #nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 1; #nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_http_version 1.0 ; #Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本。
#proxy_method get; #支持客户端的请求方法。post/get;
proxy_ignore_client_abort on; #客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
proxy_headers_hash_max_size 1024; #存放http报文头的哈希表容量上限,默认为512个字符。
proxy_headers_hash_bucket_size 128; #nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
proxy_next_upstream timeout; #反向代理upstream中设置的服务器组,出现故障时,被代理服务器返回的状态值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
#proxy_ssl_session_reuse on; 默认为on,如果我们在错误日志中发现“SSL3_GET_FINSHED:digest check failed”的情况时,可以将该指令设置为off。
3.2 负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,反正就天马行空,只有你想不到的没有他做不到。
首先给大家说下upstream这个配置的,这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有两种写法。
upstream mysvr {
server 192.168.10.121:3333;
server 192.168.10.122:3333;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
现在,假设如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....
轮询
nginx默认就是轮询,其权重都默认为1,服务器处理请求的顺序:ABABABABAB....
代码如下:
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
轮询图解:
加权轮询
加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....
代码如下:
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
加权轮询图解:
lp hash
ip hash:nginx会让相同的客户端ip请求相同的服务器。
代码如下:
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
lp hash图解:Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
关于nginx负载均衡配置的几个状态参数讲解
-
down,表示当前的server暂时不参与负载均衡。
-
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
-
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
-
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
3.3 动静分离
所谓动静分离:
动指的是动态资源[接口] ,
静指的是静态资源 [css js image]。
分离就是把静态资源放入nginx服务器下。
动态资源放入web服务器下。
1、准备好web项目
2、把静态资源放入nginx中。放在安装目录
3、配置nginx
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://项目部署的服务器ip地址:端口号
}
location ~.*\.(js|css)$ {
root /opt/static-resources;
expires 12h;
}
location ~.*\.(html|jpg|jpeg|png|bmp|gif|ico|mp3|mid|wma|mp4|swf|flv|rar|zip|txt|doc|ppt|xls|pdf)$ {
root /opt/static-resources;
expires 7d;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
3.4 nginx的高可用性搭建
3.4.1 原理
如图所示:
3.4.2 搭建
需要两台安装过Nginx的虚拟机
1、安装keepalived
yum install -y keepalived
默认安装在/etc/keepalived下
2、修改keepalived.conf配置文件
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
# ip的地址
smtp_ server 192.168.111.188
smtp_connect_timeout 30
router_id 192.168.111.188
}
# 执行脚本
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 # 每2s执行一次该脚本
weight -20 # keepalive宕机 权重-20 优先级
}
vrrp_instance VI_1 {
state MASTER # 角色
interface ens33 # 网卡名
virtual_router_id 51 # id 保证主从相同
priority 100 # 优先级 主节点大于从节点
advert_int 1
authentication {
auth type PASS
auth pass 1111
}
virtual_ipaddress {
192.168.111.50 # 虚拟ip. 使用逗号隔开
}
track_script {
chk_http_port # 追踪nginx脚本
}
}
3、从节点(第二台的配置)
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
# ip的地址
smtp_ server 192.168.111.189
smtp_connect_timeout 30
router_id 192.168.111.189
}
# 执行脚本
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 # 每2s执行一次该脚本
weight -20 # keepalive宕机 权重-20 优先级
}
vrrp_instance VI_1 {
state BACKUP # 角色
interface ens33 # 网卡名
virtual_router_id 51 # id 保证主从相同
priority 90 # 优先级 主节点大于从节点
advert_int 1
authentication {
auth type PASS
auth pass 1111
}
virtual_ipaddress {
192.168.111.50 # 虚拟ip. 使用逗号隔开
}
track_script {
chk_http_port # 追踪nginx脚本
}
}
4、编写nginx_check.sh 脚本
#!/bin/bash
# 检查是否开启nginx---统计nginx进程的个数
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
pkill -9 keepalived
fi
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx
/app/nginx/sbin/nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
pkill keepalived
fi
fi
5、修改权限
chmod 777 nginx_check.sh
6、启动
nginx
keepalived systemctl start|stop keepalived