Nginx基本概念
什么是Nginx?
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
什么是反向代理?
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址
什么是负载均衡?
当只有一台服务器,由于性能而导致无法响应所有请求时,可以增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
什么是动静分离?
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。
Nginx安装
1、安装依赖包
//一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2.下载并解压安装包
#创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
#下载tar包
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
3.安装nginx
#进入nginx目录
cd /usr/local/nginx
#进入目录
cd nginx-1.13.7
#执行命令
./configure
#执行make命令
make
#执行make install命令
make install
4.配置nginx.conf
vim /etc/nginx/nginx.conf
5.启动nginx
通过下面命令可以启动Nginx,不过启动之前记得需要在防火墙中开启80口,如果是云服务器需要更改安全组
/usr/sbin/nginx -c /etc/nginx/nginx.conf#挂载配置文件
6.nginx常用命令
nginx #启动
nginx -s stop #关闭
nginx -s reload #重新加载
7、查看Nginx安装位置\运行状态
#如果忘记了nginx安装位置,可以使用该命令查看名字包含nginx的文件夹\文件
rpm -qal |grep nginx
#查看Nginx运行状态
ps -ef |grep nginx
Nginx配置文件
Nginx配置文件包含三个部分:全局块、Events块、http块
全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
- worker_processes:这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约
- user:运行 Nginx 服务器的用户(组)
- error_log:错误日志存放路径
- include:引入其他位置的配置文件
Events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置
Http块
包含代理、缓存和日志定义等绝大多数功能和第三方模块的配置。其中又分为Http全局块和Server块
Http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
Server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局 server 块 : 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
- location 块 : 一个 server 块可以配置多个 location 块。 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
Nginx配置反向代理
配置简单反向代理
1、安装并启动Tomcat
过程略,可以使用docker安装,记得打开端口
2、在Nginx中进行请求转发的配置(反向代理)
在location块中添加proxy_pass http://127.0.0.0:8080;
(Tomcat服务器对应的端口)就能将请求转发到Tomcat服务器,之后请求服务器的80就会被转发到8080端口
配置根据路径转发不同端口
1、准备两个Tomcat服务器
准备两个Tomcat服务器,一个8080,一个8081(可以使用docker运行两个实例)
之前已经启动了一个8080端口的,这里需要在启动一个8081端口的tomcat
#!!!注意这里端口要写8081:8080,不能写8081:8081否则无法访问。8080代表docker映射的本地端口号
docker run -p 8081:8080 --name tomcat8081 -d tomcat
然后准备一个edu文件夹,里面放一个名为index.html的网页,然后将该文件分别拷贝到容器内部的webapps文件夹下面。当然两个容器里对应的index.html文件内容最好不一样。
docker cp edu tomcat8080:/usr/local/tomcat/webapps/
docker cp edu tomcat8081:/usr/local/tomcat/webapps/
之后需要重启两个容器
docker restart 容器id
2、修改Server的location
location后面的~ /edu/
说明使用正则表达式匹配/edu/路径并转发到proxy_pass配置的路径
配置负载均衡
实现的效果:相同路径分配到不同端口的Tomcat服务器中
1、准备两个Tomcat服务器
参考上面的过程
2、配置Nginx
在 nginx.conf 中如下进行配置 。注意:
- upstream 定义在Http全局块种,后面更的名字可以自己定义,不过后面要使用
- Nginx负载均衡均衡有以下几种方式:
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
- weight用于指定权重,重默认为 1,权重越高被分配的客户端越多 。
- ip_hash :每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
- fair(第三方) :按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- proxy_pass后面的地址就是上面定义的名字myserver
配置动静分离
含义:Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,:
-
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
-
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
实现:
- 通过 location 指定不同的后缀名实现不同的请求转发
- 通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
1.项目资源准备
准备在data文件夹下准备www和image静态文件,和tomcat服务器
2.进行 nginx 配置
找到 nginx 的/conf/nginx.conf 配置文件
配置高可用服务器
1、什么是 nginx 高可用
为了防止nginx宕机,使用多台nginx提供服务,并使用keepalived对多台nginx进行监控。
要求:
- 需要两台 nginx 服务器
- 需要 keepalived
- 需要虚拟 ip
2、配置高可用的准备工作
(1)需要两台服务器 192.168.17.129 和 192.168.17.131
(2)在两台服务器安装 nginx
参考nginx 安装部分
(3)在两台服务器安装 keepalived
yum install keepalived –y
安装完成后,keepalived配置文件在/etc/keepalived/keepalived.conf
3、完成高可用配置(主从配置)
(1)修改/etc/keepalived/keepalivec.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基本原理与优化参数配置
1、mater 和 worker
2、master-workers 的机制的好处
- 对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。
- 采用独立的进程,可以让互相之间不会 影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程
- 实现了
nginx -s reload
热加载
3、需要设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的
4、连接数 worker_connection
一个 nginx 能建立的最大连接 数,应该是 worker_connections * worker_processes
,而每个请求需要占用2个(请求静态资源,一来一回)或者4个(请求动态资源,还需要多出两个请求tomcat)连接。
所以普通的静态访 问最大并发数是:worker_connections * worker_processes /2
,而如果是 HTTP 作 为反向代 理来说,最大并发数量应该是worker_connections * worker_processes/4
。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服 务的连接,会占用两个连接。