1、nginx基本概念
1.1Nginx概述
Nginx ("engine x”) 是一高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等+
1.2 Nginx作为 web 服务器
Nginx可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。“
https://lnmp.org/nginx. html
1.3正向代理
Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。正向代理: 如果把局域网外的 ntermet想象成一个巨大的资源库,则局域网中的客户端要访问 internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
1.4 反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。在这里插入图片描述
1.5负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高 CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
1.6 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2、nginx安装、常用命令和配置文件
2.1进入nginx官网,下载
http://nginx.org/
需要的依赖
pcre-8.37.tar.gz
openssl-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.11.1.tar.gz
2.2nginx安装
第一步,安装 pcre
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
把安装压缩文件放到 linux 系统中 解压压缩文件 进入解压之后目录,执行./configure 使用 make && make
install 安装之后,使用命令,查看版本号 pcre-config.–verison 第二步,安装 openssl 第三步,安装
zlib yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
一健安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
第四步,安装nginx 解压缩 nginx-xx.tar.gz 包。“
进入解压缩目录,执行
./configure
make && make install
安装成功之后,在 usr 多出来一个文件夹 local/nginx,在 nginx有 sbin 有启动脚本
[root@localhost sbin]# cd /
[root@localhost /]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# snginx
[root@localhost sbin]# ./nginx
[root@localhost sbin]# ps -ef | grep nginx
root 10750 1 0 15:42 ? 00:00:00 nginx: master process ./nginx
nobody 10751 10750 0 15:42 ? 00:00:00 nginx: worker process
root 10753 3523 0 15:42 pts/1 00:00:00 grep --color=auto nginx
[root@localhost sbin]# cd ..
[root@localhost nginx]# cd ..
[root@localhostlocal]# ls
bin etc games lib lib14 libexec nginx sbin share src
[root@localhost local]# cd nginx/
rootelocalhost nginx]# ls
client body temp conf fastcgi_temp html Logs_proxy_temp sbin scgi_temp uwsgi_temp
[root@localhost nginx]# cd conf
[root@localhost conf]# ls
fastcgi.conf koi-utf nginx.conf uwsgi_params
fastcgi.conf.default koi-win nginx.conf.default uwsgi_params.default
fastcgi params mime.types scgi_params win-utf
fastcgi_params.default mime.types.default scgi_params.defaultf
[root@localhost conf]# vi nginx.conf
[root@localhost conf]#
linux服务器默认是有防火墙的,无法访问成功 查看开放的端口号 firewall-cmd --list-all 设置开放的端口号
firewall-cmd --add-service=http -permanent sudo firewall-cmd
–add-port=80/tcp --permanent 重启防火墙 firewall-cmd --reload
[root@localhost conf]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources :
services: ssh dhcpv6-client http
ports: 80/tcp
protocols:masquerade: no
forward-ports :
source-ports:
icmp-blocks:
rich rules:
[root@localhost conf]# sudo firewall-cmd --add-port=8001/tcp --permanent
success
[rootelocalhost conf]# firewall-cmd --reload
success
[root@localhost conf]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
httpports: 80/tcp 8001/tcp
protocols:
masquerade:
noforward-ports :
source-ports:
icmp-blocks:rich rules:
2.3 nginx 常用命令
nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop #强制停止Nginx服务
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -?,-h #打开帮助信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,然后退出
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死所有nginx进程
kill -HUP [Nginx主进程号(即ps命令查到的PID)] #平滑重启,在/usr/local/nginx/logs/nginx.pid
防火墙常用命令
service firewalld start #开启
service firewalld restart #重启
service firewalld stop #关闭
firewall-cmd --list-all #查看防火墙规则
firewall-cmd --query-port=8080/tcp #查询端口是否开放
firewall-cmd --permanent --add-port=80/tcp #开放80端口
firewall-cmd --permanent --remove-port=8080/tcp #移除端口
firewall-cmd --reload #重启防火墙(修改配置后要重启防火墙)
2.4 nginx 配置文件
第一部分 全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令
比如 worker_processes1; worker_processes 值越大,可以支持的并发处理量也越多
第二部分 events 块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接
比如 worker_connections 1024: 支持的最大连接数
第三部分 http 块
Nginx 服务器配置中最频繁的部分http 块也可以包括http 全局块server 块
3、nginx配置-反向代理
实例1
1、效果
(1)打开浏览器,在浏览器地址栏输入地址www.123.com,跳转到liunx 系统 tomcat 主页面中
2、准备工作
(1)在 liunx 系统安装 tomcat,使用默认端口 8080
*tomcat 安装文件放到 liunx 系统中,解压
*进入 tomcat 的 bin 目录中,./startup.sh ,启动 tomcat 服务器
(2)对外开放访问的端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd -reload
查看已经开放的端口号
firewall-cmd --list-all
(3)在 windows 系统中通过浏览器访问 tomcat 服务器
3.访问过程分析
4、具体配置
第一步 在 windows 系统的 host 文件进行域名和p对应关系的配置
192.168.17.129 www.123 .com
第二步 在 nginx进行请求转发的配置(向代理配置)
重启 ./nginx 或者reload
5.最终测试
实例2
1 实现效果
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
nginx监听端口为9001
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081
2、准备工作
(1)准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
(2)创建文件夹和测试页面2
3、具体配置
(1)找到 nginx配置文件,进行反向代理配置
(2)开放对外访问的端口号 9001 8080 8081
4.最终测试
注:nginx配置详解可以参考这两篇文章:
4、nginx配置实例-负载均衡
1.效果
(1) 浏览器地址栏输入地址 http://192.168.17.129/edu/a.html负载均衡效果,平均到 8080和 8081端口中
2、准备工作
(1)准备两台 tomcat 服务器,一台 8080,一合8081
(2)在两台 tomcat 里面 webapps.目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试
3、在nginx的配置文件中进行负载均衡的配置
upstream myserver { server 192.168.17.129:8080; server 192.168.17.129:8081; }
location / { proxy_pass http://myserver; root html; index index.html index.htm; }
4、nginx分配服务器策略
第一种 轮询 (默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动别除
第二种 weight
weight 代表权重默认为 1权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:upstream server_pool{ server 192.168.5.21 weight=5 server 192.168.5.22 weight=10 }
第三种ip_hash
每个请求按访问 ip.的 hash结果分配,这样每个访客固定访问一个后端服务器 ,可以解决session问题upstream server_pool{ ip_hash; server 192.168.5.21 weight=5 server 192.168.5.22 weight=10 }
第四种 fair (第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配upstream server_pool{ server 192.168.5.21 weight=5 server 192.168.5.22 weight=10 fair; }
5、nginx配置-动静分离
1.简介
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:“一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;“
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
“通过location 指定不同的后缀名实现不同的请求转发。通过 expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:
是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
2.准备工作;
在linux系统中准备静态资源,用来访问。
3.nginx配置
重启nginx
4.最终测试
6、nginx配置高可用集群
1.什么是高可用
Keepalived加nginx高可用集群(主从模式)
2.准备工作
(1)需要两台服务器 192.168.17.129 和 192.168.17.131C1
(2)在两台服务器安装 nginx
(3)在两台服务器安装 keepalived
3.在两台服务器安装keepalived
[root@localhost usr]# yum install keepalived -y
[root@localhost usr]# rpm -q -a keepalived
keepalived-1.3.5-8.el7_6.5.x86_64
#安装成功后在目录/etc/keepalived/下
4、完成高可用配置
(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 #LVS_DEVEL表示服务器名称,在/etc/hosts配置
}
#脚本配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔,单位秒)
weight 2 #权重
}
#虚拟ip配置
vrrp_instance VI_1 {
state MASTER #备份服务器上将 MASTER 改为 BACKUP
interface ens33 #网卡
virtual_router_id 51 # 主、备机的virtual router id必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔多少时间发送一次心跳,默认1秒
authentication {
auth_type PASS #通过密码认证
auth_pass 1111
}
virtual_ipaddress{
192.168.17.50 //VRRP H虚拟地址,可绑定多个虚拟ip
}
}
router_id LVS_DEVEL #LVS_DEVEL表示服务器名称,在/etc/hosts配置
(2) 在/usr/local/src添加检测脚本nginx_check.sh
#!/bin/bash
A=`~ps -C nginx -no-header wc -1`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ ps -C nginx --no-header wc -1-eq 0 ];then
killall keepalived
fi
fi
(3) 把两台服务器上 nginx和keepalived 启动
5、最终测试
下图表示绑定了虚拟ip192.168.17.50
把主服务器 (192.168.17.129) nginx 和 keepalived 停止,再输入 192.168.17.50
停止主服务器nginx和keepalived
从服务器虚拟ip绑定
7、nginx原理
(1) master & worker
~
~
(2) master是如何工作的
~
~
(3) 一个 master 和多个 woker 有好处
(1)可以使用 nginx -s reload 热部署,利用 nginx 进行热部署操作
(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker
独立的,继续进行争抢,实现请求过程,不会造成服务中断
(4) 设置多少个 worker合适
worker 数和服务器的 cpu 数相等是最为适宜的
(5) 连接数 worker_connection.
第一个: 发送请求,占用了 woker 的几个连接数?
答案: 2或者4个第二个: nginx有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?“
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是 HTTP 作为反向代理来说,最大并发数量应该是worker_connections*worker_processes/4.