Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址
当只有一台服务器,由于性能而导致无法响应所有请求时,可以增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。
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配置文件包含三个部分:全局块、Events块、http块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置
包含代理、缓存和日志定义等绝大多数功能和第三方模块的配置。其中又分为Http全局块和Server块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
过程略,可以使用docker安装,记得打开端口
在location块中添加proxy_pass http://127.0.0.0:8080;
(Tomcat服务器对应的端口)就能将请求转发到Tomcat服务器,之后请求服务器的80就会被转发到8080端口
参考
准备两个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
location后面的~ /edu/
说明使用正则表达式匹配/edu/路径并转发到proxy_pass配置的路径
实现的效果:相同路径分配到不同端口的Tomcat服务器中
参考上面的过程
在 nginx.conf 中如下进行配置 。注意:
含义:Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,:
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
实现:
准备在data文件夹下准备www和image静态文件,和tomcat服务器
找到 nginx 的/conf/nginx.conf 配置文件
为了防止nginx宕机,使用多台nginx提供服务,并使用keepalived对多台nginx进行监控。
要求:
(1)需要两台服务器 192.168.17.129 和 192.168.17.131
(2)在两台服务器安装 nginx
参考nginx 安装部分
(3)在两台服务器安装 keepalived
yum install keepalived –y
安装完成后,keepalived配置文件在/etc/keepalived/keepalived.conf
(1)修改/etc/keepalived/keepalivec.conf 配置文件
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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
systemctl start keepalived.service
nginx -s reload
热加载Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的
一个 nginx 能建立的最大连接 数,应该是 worker_connections * worker_processes
,而每个请求需要占用2个(请求静态资源,一来一回)或者4个(请求动态资源,还需要多出两个请求tomcat)连接。
所以普通的静态访 问最大并发数是:worker_connections * worker_processes /2
,而如果是 HTTP 作 为反向代 理来说,最大并发数量应该是worker_connections * worker_processes/4
。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服 务的连接,会占用两个连接。