Nginx的使用
nignx的内容介绍
Nginx基本概念
- 什么是Nginx?做什么事情?
- 反向代理
- 负责均衡
- 动静分离
Nginx的安装、常用命令、配置文件
- 在Linux中安装Nginx
- Nginx的常用命令
- Nginx配置文件
Nginx配置实例
- 反向代理
- 负责均衡
- 动静分离
- 高可用集群
Nginx原理
nginx的基本概念
基本概念:Nginx (engine x) 是一个高性能的HTTP、丰富的功能集、示例配置文件和低系统资源的消耗而闻名,Nginx是一款轻量级的 Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
特点:是占有内存少,并发能力强.Nginx专门为性能优化而开发。有报告表明能同时支持50000并发连接数。
反向代理
了解代理之前,先了解什么是代理服务器?
所谓代理服务器
就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,正向代理
可以隐藏客户端,反向代理
可以隐藏原始服务器。
代理服务器的作用:最基本的功能是连接,此外还包括安全性、缓存、内容过滤、访问控制管理等功能
- 访问无法访问的资源
- 缓存,提高访问速度
- 对进入内部网络的Internet信息实施监控和过滤
- 对客户端访问授权,上网进行认证
正向代理:
概念:如果把局域网外的Internet想象成巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器进行访问,这种代理服务器称为正向代理。
反向代理:
概念:反向代理其实是客户端对代理是无感知的,因为客户端不需要任何配置就能访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器读取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真是服务器IP地址
。
进一步理解:
反向代理的作用:
- 做内容服务器的替身,保护内容服务器的安全
- 作为内容服务器的负责均衡器
负责均衡
概念:负载均衡
,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡
、分摊
到多个操作单元上进行运行。通俗的讲就是:当大量数据访问时,一台服务区无法承受所有的数据量,需要多台服务器同时分摊请求数据量。
负责均衡架构图:
动静分离
概念:为了加快网站解析速度,可以把动态页面和静态页面有不同的服务器来解析,加快解析速度,降低原来单点服务器的压力。
nginx的安装
在Linux中安装Nginx之前需要安装依赖:
1.安装pcre依赖
(1)把安装包放在Linux中,自己选择一个目录usr/src/安装
(2)解压压缩文件
(3)进入解压目录后,执行./configure
(4)使用make && make install
(5)安装完成后查看版本号:pcre-config --version
2.安装其他依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
3.安装Nginx
(1)把安装包放在Linux中,自己选择一个目录安装
(2)解压压缩文件(官网找安装包)
(3)进入解压目录后,执行./configure
(4)使用make && make install
注意:如果安装失败,就直接在nginx的文件目录中nignx/objs/Makefile中将前几行中有一个-Werror直接删除
安装成功后,在usr中多出来一个文件夹usr/local/nginx
查看开放的端口号:
firewall-cmd --list-all
设置开放的端口号:
firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙:
firewall-cmd --reload
nginx的实现原理
nginx的底层实现结构是mater 和 worker的一种关系。如下图:
master进程接收到处理请求后,会将请求分配给worker进程进行处理,worker进程进行处理并与服务端进行连接。
worker是如何进行工作的呢?
如图所示,worker的实现方式是一种争抢的实现方式,master会根据配置文件生成一个监听相应端口的socket,然后再faster出多个worker进程,这样每个worker就可以接受从socket过来的消息(其实这个时候应该是每一个worker都有一个socket,只是这些socket监听的地址是一样的)。当一个连接过来的时候,每一个worker都能接收到通知,但是只有一个worker能和这个连接建立关系,其他的worker都会连接失败,这就是所谓的惊群现在,为了解决这个问题,nginx提供一个共享锁accept_mutex,有了这个共享锁后,就会只有一个worker去接收这个连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。本段内容来源
一个 master 和多个 woker 有好处 :
(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断
注意:worker的数量不是越多越好,因为每个worker都是一个独立的进程,所以worker 数和服务器的 CPU 数相等是最为适宜的。这样可以充分利用CPU的资源。
问:发送请求,占用了 woker 的几个连接数? 答案:2 或者 4 个,和请求之间一来一回,和服务端之间一来一回。
nginx为什么性能高?
答:内部事件处理模型为NIO模型。
- 对于每个worker进程来说都是一个独立的进程,相互之间不会产生影响,同时不需要进行加锁操作,节省了CPU的开销。单个worker出现故障不会影响其他的worker正常工作,降低了风险。
- nginx的多进程事件处理模型为
异步非阻塞
的方式处理请求。nginx是可以同时处理成千上万个请求的。一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。本段内容来源
nginx的常用命令
上面安装完nginx后,之后就是使用nginx了。
1.启动nginx:
在/usr/local/nginx/sbin目录下执行 ./nginx
提示:我们安装nginx是在src目录下,local目录中的nginx是自己生成的文件。
启动后,页面是没有反应的,如何知道nginx启动成功了呢?
1.启动./nginx
查看进程信息是否启动:如下,nginx已经启动。
2.查看配置文件,nginx的默认的访问访问端口:
// 退出sbin目录
cd ..
// 进入到conf目录
cd conf
// 进入配置文件中
vim nginx.conf
可以看到默认访问端口是80端口。可以通过防火墙查看80端口是否打开。
firewall-cmd --list-all
如果没有打开就通过防火墙开启该端口!
2.打开浏览器访问本机服务器
输入本机地址,显示如下网页,表示nginx成功安装并开启。
注意:上面在http下可以直接访问成功,但是https下就会出现连接失败的问题。
3.关闭命令
- 在/usr/local/nginx/sbin目录下执行
./nginx -s stop
4.重新加载命令(更改文件的情况下)
- 在/usr/local/nginx/sbin目录下执行
./nginx -s reload
5.查看nginx的版本号
- 在/usr/local/nginx/sbin目录下执行
.nginx -v
nginx的配置文件
位置:usr/local/nginx/conf
文件名称:nginx.conf
配置文件的组成
nignx.conf配置文件主要可以分为三个部分:
第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
如:worker_processes 1
; 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约
第二部分:events块
比如上面的配置: events {
worker_connections 1024 };
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化
,是否允许同时接收多个网络连接
,选取哪种事件驱动模型来处理连接请求
,每个 word process 可以同时支持的最大连接数等
。
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http 块
这算是 Nginx 服务器配置中最频繁的部分,负载均衡、代理、缓存和日志定义
等功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http全局块、server 块。
1、http 全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
2、server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。 - location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制
等功能,还有许多第三方模块的配置也在这里进行。
第三部分结构图就是:
nignx的配置实例
通过一些反向代理的实例,进一步了解nginx的使用
反向代理实例(一)
实例效果:使用nginx反向代理,实现访问自定义域名www.test1.com 直接跳转到Tomcat主页面
通常情况下,要访问Tomcat必须通过主机地址+8080端口才可以访问,但是这里通过直接访问自定义域名+80端口直接实现跳转。
实例步骤
Tomcat的安装:
1.在usr/src目录下安装一个Tomcat,默认端口8080
2.直接将Tomcat安装包放在usr/src目录下,tar -zxvf xxxx解压安装
3.启动Tomcat:进入到Tomcat的bin目录下,./startup.sh启动Tomcat服务器
4.8080端口设置:
-
对外开放访问的端口 firewall-cmd --add-port=8080/tcp --permanent firewall-cmd –reload
-
查看已经开放的端口号 firewall-cmd --list-all
5.在Windows系统中通过浏览器访问Tomcat服务器确认安装成功
具体配置:
1.在Windows系统的host文件中进行域名和IP对应关系的配置
打开文件直接在最后一行添加域名映射关系:115.29.xxx.xxx www.test1.com
2.在nginx配置文件nignx.conf中进行请求转发的配置(反向代理的配置)
server {
listen 80;
server_name 115.29.xxx.xxx; // 这里将localhost改为自己服务器ip
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://127.0.0.1:8080; // 添加请求转发的地址
index index.html index.htm;
}
3.进行测试
直接在浏览器输入www.test1.com
问题:8080端口被占用
解决步骤:
1.启动Tomcat后,进入logs目录下执行cat catalina.out
,就可以知道Tomcat是否启动成功。
2.通过查看日志,我的日志中是出现错误:
可以看到是8080端口被占用。可以通过修改Tomcat端口解决。但是本人就是不让步!!!!
3.查看是哪个进程占用了8080端口,命令:netstat -anp | grep 8080
查看所有端口占用的情况:netstat -tln
有LISTED表示被占用,9894表示占用进程的PID,Java表示占用进程的名称。
果然总有刁民想害朕!!!查看端口属于哪个程序?端口被哪个进程占用 lsof -i :8083
4.杀死该进程:kill 9894
5.直接重启Tomcat,并在浏览器访问
反向代理实例(二)
实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 9001,
-
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
-
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082
实现步骤:
1.安装两个不同访问端口的Tomcat
- 首先在src下创建两个文件分别存放两个相同的Tomcat安装包
- 分别进行解压安装,此时两个Tomcat都是一样的
- 分别对两个Tomcat进行端口的配置:配置文件在Tomcat–conf—server.xml,修改配置文件中关闭端口(随便改一个就行)和访问端口(改成8081和8082)。
- 保存修改后的配置文件,启动两个Tomcat
注意:两个端口必须开放!!!
2.在Tomcat的webapps中创建两个用于访问的页面。
3.修改 nginx 的配置文件
在 http 块中添加 server{} 或是在下面的注释掉的server中找一个使用
如上图进行配置。
location指令说明:用于匹配URL
语法:
location [= | ~ | ~* | ^~] uri { }
1、=
:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向 下搜索并立即处理该请求。
2、~
:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*
:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~
:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配
负载均衡实例
什么是负责均衡?
答:就是将大量的请求(负载)分摊到多个操作单元(服务器)上进行执行,作用就是防止大量请求都压在同一个服务器上导致崩溃。
实现的效果:在浏览器中输入相同的访问地址,分别依次访问不同的服务器。
操作步骤:
1.安装两个Tomcat服务器,分别响应不同的端口,例如:8081,8082;
2.分别在两个Tomcat的webapps目录中创建相同的目录和访问页面。例如:/test/a.html
4.在nginx.conf中进行负责均衡的配置:
- 在server上面添加如下内容:
upstream myserver{ // 进行负载均衡的配置
server 115.29.xxx.xxx:8081; // 负责映射的两个访问路径
server 115.29.xxx.xxx:8082;
}
server {
listen 80;
server_name 115.29.xxx.xxx; // 进行访问的IP
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://myserver; // 上面定义的服务的名称
index index.html index.htm;
}
负责均衡的策略:
1.轮询策略(默认):
- 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2.权重(weight)策略:
- weight 代表权,重默认为 1,权重越高被分配的客户端越多; 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver{ // 进行负载均衡的配置
server 115.29.xxx.xxx:8081 weight=1; // 负责映射的两个访问路径
server 115.29.xxx.xxx:8082 weight=1;
}
3.ip_hash策略:
- 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
upstream myserver{ // 进行负载均衡的配置
ip_hash;
server 115.29.xxx.xxx:8081; // 负责映射的两个访问路径
server 115.29.xxx.xxx:8082;
}
4.fair(第三方):
- 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{ // 进行负载均衡的配置
server 115.29.xxx.xxx:8081; // 负责映射的两个访问路径
server 115.29.xxx.xxx:8082;
fair;
}
动静分离实例
概念:Nginx 动静分离简单来说就是把动态请求
跟静态请求
分开,不能理解成只是单纯的把动态页面
和 静态页面
物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
-
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
-
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。 -
具体
Expires
定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
实现步骤:
1.准备单独的静态文件夹用于对静态资源的访问:
- 在根目录下创建一个statics文件夹
- 在statics文件夹下分别创建两个文件夹image,www,在两个文件夹中分别存放图片和静态页面
2.进行nginx.conf的配置:
server {
listen 80;
server_name 115.29.xxx.xxx; // 进行访问的IP
location /www/ {
root /data/;
index index.html index.htm;
}
location /image/ {
root /data/;
autoindex on; // 将image中的内容进行罗列
}
3.启动nginx进行测试:http://115.29.xxx.xxx/www/a.html, http://115.29.xxx.xxx/image/b.jpg,
高可用实例(主从模式)
高可用的原理:
如图,高可用就是当请求发送到服务端时,正常情况下就是nginx1处理请求然后将请求分发到各个服务器。当nginx1因为故障停止工作后,为了不影响正常的工作。nginx2代替nginx1进行请求的处理工作。从而实现了高可用的状态。
实现方式:keepalived
软件进行监听nginx工作状态,如果nginx挂掉,就自动转换nginx服务器。
实现具体过程:
1.需要装备两台服务器分别安装nginx和keepalived
- 通过yum的安装方式进行keepalived的安装:
yum -y install keepalived
安装成功后,会自动在etc目录中生成一个keepalived的目录,配置集群需要进行keepalived.conf
的配置
2.修改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 eth0 # 网卡,通过命令ifconfig查看
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 虚拟地址
}
}
3.在/usr/local/src 添加检测名称为nginx_check.sh
的脚本:
#!/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
4.把两台服务器上 nginx 和 keepalived 启动:
-
启动 nginx:
./nginx
-
启动 keepalived:
systemctl start keepalived.service
停止keepalived:systemctl stop keepalived.service
还有一种模式是双主模式,就是每个nginx服务器既是主节点也是从节点,还是只要在 keepalived配置文件中进行配置即可。