Nginx:
是一个高性能的HTTP和反向代理服务器。占用内存少,并发能力强。
1 反向代理
正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问(访问www.google.com)
反向代理: (请求转发)
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到
反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目
标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
2 负载均衡(请求转发+按照某种规则,转发请求到相应的服务器上,通常采用: 轮询策略)
对于客户端高并发请求,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中
到单个服务器上的请况,改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
3 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
4 集群(高可用)
安装Nginx:
Nginx安装成功后,会有此 usr/local/nginx/sbin 文件夹,在sbin目录下有nginx启动脚本。
配置文件在usr/local/nginx/conf目录下,nginx.conf
使用nginx操作命令前提条件:必须进入nginx的目录(usr/local/nginx/sbin)
./nginx 启动nginx
./nginx -v 查看当前nginx版本号
./nginx -s stop 关闭nginx
./nginx -s reload 重新加载配置(不是重启nginx)
nginx配置文件:nginx.conf由三部分组成:
1 全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,
主要包括配置运行nginx服务器的用户(组),允许生成worker process数,进程PID存放路径,日志
存放路径和类型以及配置文件的引入等。
例如:
worker_processes 1; #这是nginx服务器并发处理服务的关键配置,worker-processes值越大,可以
支持的并发处理量也越多,但是会收到硬件,软件等设备的制约。
2 events块
events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process
下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work
可以同时支持的最大连接数等。
worker_connections 1024; #表示每个worker process支持的最大连接数为1024.
3 http块
Nginx服务器配置中最频繁的部分,代理,缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是: http块包括:http全局块,server块。
3.1 http全局块
配置的指令包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求数上限等。
3.2 server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个http块可以包含多个server块,而每个server块就相当于一个虚拟主机。
而每个server块也分为全局server块,以及可以同时包含多个location块。
3.2.1 全局server块
最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置
3.2.2 location块
一个server块可以配置多个location块。
这块的主要作用是基于nginx服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机名称(也可以是IP别名)
之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向,数据缓存和应答控制等功能,还有许多
第三方模块的配置也在这里进行。
反向代理实例:
server{
listen 80;
server_name 192.168.17.129;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
/ 匹配任何请求路径,转发到此服务器
反向代理实例:根据不同路径,转发请求到不同的程序应用端口
server{
listen 9001;
server_name 192.168.17.129;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~/vod/ {
proxy_pass http://127.0.0.1:8081;
}
-
}
-
用于表示uri包含正则表达式,并且区分大小写。 (常用)
~* 用于表示uri包含正则表达式,并且不区分大小写。
负载均衡配置实例:
http{
#配置负载均衡列表,自定义负载均衡名称myserver,默认轮询策略。如果某个服务器宕机,自动剔除宕机服务器。
#weight 权重策略,weight代表权,默认为1,权重越高,被分配的客户端越多。
# upstream myserver {
# server 192.168.0.103:8080 weight=1;
# server 192.168.0.103:8081 weight=2;
# }
#ip_hash策略:当nginx服务器的upstream轮询策略配置为ip_hash的时候,nginx路由用户请求采用的是通过终端用户(请求客户端的IP地址)的IP地址路由(hash算法)到指定的后端服务器
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,文件生成不一致问题。例如
#upstream myserver {
# ip_hash;
# server 192.168.0.103:8080;
# server 192.168.0.103:8081;
#}
#fair策略,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#upstream myserver {
# fair;
# server 192.168.0.103:8080;
# server 192.168.0.103:8081;
#}
upstream myserver {
server 192.168.0.103:8080;
server 192.168.0.103:8081;
}
server {
listen 9002;
server_name www.123.com;
location / {
proxy_pass http://myserver;
}
}
}
动静分离配置实例:
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以
理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种:
1 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
2 把动态和静态文件混合在一起发布,通过nginx来分开。
通过location指定不同的后缀名实现不同的请求转发。
expires 参数:给一个自由设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可。
例如: 设置3d ,表示在这个3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,
返回状态码304,从浏览器缓存中返回资源文件。如果有修改,则直接从服务器重新下载,并更新浏览器中缓存资源,返回状态码200。
server {
listen 9003;
server_name www.123.com;
location /www/ {
#配置静态资源访问路径
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
#列出访问文件夹中的所有文件
autoindex on;
}
}
Linux静态资源存储位置(绝对路径):
/data/image/timg.jpg
/data/www/a.html
请求URL:
http://www.123.com:9003/image/timg.jpg
http://www.123.com:9003/www/a.html
Nginx配置高可用集群实例(主从模式):
keepalived Nginx服务实例存活监控机制,对外提供访问虚拟IP地址
一般情况下,请求从nginx,Master的服务实例将请求进行转发。
当Master服务实例宕机后,由backup(备份服务实例)进行请求转发操作。
在两台服务器上分别安装:
1 安装nginx
2 安装keepalived
yum install keepalived -y #安装后,默认安装路径 /etc/keepalived
// 启动
service keepalived start
// 停止
service keepalived stop
3 配置keepalived.conf文件,进行主从nginx配置。
keepalived.conf配置文件
! 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.0.103 #当前nginx服务实例,所在服务器IP
smtp_connect_timeout 30
router_id LVS_DEVEL #keepalived服务器名
}
vrrp_script chk_http_port {
script “/usr/loal/src/nginx_check.sh”
interval 2 #检测脚本执行的间隔
weight 2
}
vrrp_instance VI_1 {
state MASTER #备份服务器上将MASTER改为BACKUP
interface ens33 #网卡,ifconfig可获取
virtual_router_id 51 #主,备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 #VRRP H虚拟地址,配置起来虚拟IP,可以配置多个,必须与本服务器同网段。可以通过 ip a命令查看是否建立成功。
}
}
4 在/usr/local/src/添加检测脚本
nginx_check.sh配置文件,作用: 主服务器宕机,由从服务器替代。
#!/bin/bash
A=ps -C nginx ¨Cno-header |wc -l
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx #nginx启动执行文件nginx.sh所在位置
sleep 2
if [ ps -C nginx --no-header |wc -l
-eq 0 ];then
killall keepalived
fi
fi
5 分别启动两台服务器上的nginx,keepalived
启动nginx
./nginx
启动keepalived
systemctl start keepalived.service
Nginx原理:
客户请求进来->Master进程->发送信号提醒->多个Worker进程->Worker通过争抢机制,获取处理请求机会。
默认配置:Nginx一个Master进程,一个Worker进程。
Master : Worker 1:n
Worker数量与CPU数量(核数)相等最合适。
每个Worker进程独立。
每一个请求,占用worker_connection连接数:2(访问静态资源) 或者 4(访问动态资源)
每个Worker最大并发数: 最大连接数/2 或者 最大连接数/4