Nginx
什么是 Nginx?
性能很突出的服务器软件
Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 ngnix 的并发能力确实在同类型的网页服务器中表现较好。
Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50000 个并发连接数。
正向代理
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
反向代理
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
正向代理和反向代理的区别
虽然正向代理服务器和反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。
1、正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理 则是服务器的代理,帮助服务器做负载均衡,安全防护等。
2、正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
3、正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
4、正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。
负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
nginx 的安装
在官网下载 安装包
nginxhttp://nginx.org/en/index.html
下载 nginx 之前需要下载以下相关依赖:
pcre-8.37.tar.gz
openssk-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.11.1.tar.gz
查看 pcre 的版本号 pcre-config --version
解压压缩包: tar -xvf 压缩包名称
安装 nginx
-
使用命令解压
-
./configure
-
make && make install
进入目录 /usr/local/nginx/sbin/nginx 启动服务
查看端口号占用情况:netstat -ntlp
查看防火墙开放端口号:firewall-cmd --list-all
设置开放的端口号:
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=8080/tcp --permanent
重启防火墙:firewall-cmd --reload
nginx 的常用命令
使用 nginx 操作命令前提条件:必须进入 nginx 的目录 /usr/local/nginx/sbin
-
查看 nginx 的版本号
./nginx -v
-
启动 nginx
./nginx
-
关闭 nginx
./nginx -s stop
-
重新加载 nginx
./nginx -s reload
nginx 配置文件
配置文件所在地址:/usr/local/nginx/conf/nginx
.conf
nginx 配置文件的组成
包含三部分内容
(1)全局块:
-
配置服务器整体运行的配置指令 比如 worker_processes 1; worker_processes 值越大,可以支持的并发处理量也越多
-
处理并发数的配置
(2)events 块:
-
影响 Nginx 服务器与用户的网络连接 比如 worker_connections 1024;
-
支持的最大连接数为 1024
3)http 块 还包含两部分 (nginx中配置最频繁):
-
http 全局块
-
server 块(端口号、ip地址等待)
nginx 配置实例-反向代理(1)
1、实现效果
-
打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转 linux 系统 tomcat 主页面中
2、访问过程分析
浏览器输入 url 地址的执行流程:先到本地的 host 文件找域名配置,如果没有的话,将url地址交给 DNS 域名解析器处理
3、具体实现
第一步:在windows 系统的 host 文件进行域名和 ip 对应关系的配置。
192.168.1.100 www.123.com
第二步:在 nginx 进行请求转发的配置(反向代理配置)
4、最终测试
在 windows 中输入 www.123.com 弹出 tomcat网址
nginx 配置实例-反向代理(2)
1、实现效果
使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中, nginx 监听端口为 9001
访问 http://192.168.1.100:9001/edu/ 直接跳转到 127.0.0.1.8080
访问 http://191.168.1.100:9001/vod/ 直接跳转到 127.0.0.1.8081
2、准备工作
-
准备两个 tomcat 服务器:端口号分别为 8080、8081
-
创建文件夹和测试页面
-
3、具体实现
-
找到 nginx 配置文件,进行反向代理配置
使用正则的形式
-
开放对外访问的端口号
4、最终测试
nginx 指令说明
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~ 标识。
nginx 配置实例-负载均衡
1、实现效果
浏览器地址栏输入地址 http://192.168.1.100/edu/a.html,负载均衡效果,平均 8080 和 8081 端口中。
2、准备工作
-
准备两台 tomcat 服务器,一台 8080,一台 8081
-
在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html用于测试
nginx 分配服务器策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、weight
weight 代表权重默认为 1,权重越高被分配的客户端越多
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。例如:
upstream server_pool{ server 192.168.1.100 weight=10; server 192.168.1.100 weight=5; }
3、ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访问固定访问一个后端服务器
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
nginx 配置实例-动静分离
相关概念
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面 物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 静态服务器 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种, 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案; 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
实现方式
纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
实现目的:为了提高访问效率
准备工作
-
在 Linux 系统中准备静态资源,用于进行访问
具体实现
配置完成之后,重启 nginx
autoindex on:列出当前文件的目录
nginx 配置高可用集群
-
什么是 nginx 的高可用
-
(1)需要两台 nginx 服务器
(2)需要 keepalived
(3)需要虚拟 ip
-
准备工作
(1)需要两台服务器 192.168.1.100 和 192.168.1.101
(2)在两台服务器安装 nginx
(3)在两台服务器安装 keepalived
-
在两台服务器安装 keepalived
使用 yum 命令进行安装
yum install keepalived -y
安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf
-
完成高可用配置(主从配置)
(1)修改 /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
(2)在 /usr/local/src 添加检测脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
(3)把两台服务器上 nginx 和 keepalived 启动
启动 nginx:./nginx
启动 keepalived:systemctl start keepalived.service
nginx 的原理
-
一个 master 和多个 worker 的好处
(1)可以使用 nginx -s reload 热部署,利用 nginx 进行热部署操作。
(2)每个 worker 是独立的过程,如果有其中的一个 worker 出现问题,其他 worker 是独立的,继续进行争抢,实现请求过程,不会造成服务中断。
-
设置多少个 worker 比较合适
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是千万个请求也不在话下。每一个 worker 的线程可以把一个 cpu 的性能发挥到极值。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗
-
连接数 worker_connection
第一个:发送请求,占用了 worker 的几个连接数?
答案:2或者4
第二个:nginx 有一个 master,有四个 worker ,每个 worker 支持最大的连接数据 1024,支持的最大并发数是多少?
(1)普通的静态访问最大并发数是:worker_connections * worker_processes / 2
(2)而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4