1、什么是Nginx?
Nginx(Engine X)是一个高性能的HTTP和反向代理服务器,特点是战友内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
2、Nginx的基础功能
- 处理静态文件,索引文件以及自动索引;
- 反向代理加速(无缓存),简单的负载均衡和容错;
- FastCGI,简单的负载均衡和容错;
- 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
- SSL 和 TLS SNI 支持;
3、Nginx安装
-
安装
pcre
sudo yum install pcre
或者下载安装包进行安装:
## 以pcre-8.44.tar.gz为例 ## 下载完后,将安装文件上传到服务器,然后解压 tar -xvf pcre-8.44.tar.gz ## 进入解压路径 cd pcre-8.44 ## 安装centos编译依赖 yum -y update yum install gcc gcc-c++ kernel-devel make ## 执行./configure ./configure ## 编译并安装 make && make install
-
安装其他依赖
sudo yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
-
安装nginx
## 下载nginx安装包nginx-1.18.0.tar.gz,并上传到服务器 ## 解压缩 tar -xvf nginx-1.18.0.tar.gz ## 进入解压缩目录 cd nginx-1.18.0 ## 执行configure ./configure ## 编译并安装 make && make install
安装成功后,会在
/usr/local/
目录底下生成nginx
文件夹进入
/usr/local/nginx/sbin/
目录,运行nginx
运行成功后,即可通过网页访问。
注:
若是从别的客户端上访问,则需要先开放nginx服务器的端口,否则其他主机将无法访问。
## 1、查看开放的端口号
sudo firewall-cmd --list-all
## 2、设置开放的端口
# sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=80/tcp --permanent
## 重启防火墙
sudo firewall-cmd --reload
现在,就可以在其他主机上通过ip地址访问了。
4、nginx常用命令
## 1、若要使用nginx命令,则需进入nginx的文件夹下才能进行操作
cd /usr/local/nginx/sbin
## 2、查看nginx版本
./nginx -v
## 3、启动nginx
sudo ./nginx
## 4、关闭nginx
sudo nginx -s stop
## 5、重新加载nginx配置文件
sudo ./nginx -s reload
5、nginx配置文件
-
nginx配置文件的路径
/usr/local/nginx/conf/nginx.conf
-
nginx配置文件的组成
主要分为三个部分:全局块、events块和http块。
-
全局块
从配置文件开始到events块之间的内容,主要配置一些影响nginx服务器运行的配置指令。其中:
work_proccesses 1; ## nginx并发处理服务的关键配置,该值越大,可支持的并发处理量月多(受硬件、软件设备等约束)
-
events块
该部分涉及的指令主要影响nginx服务器与用户的网络连接。其中:
worker_connecctions 1024; ## 每个work_processes支持的最大连接数,该配置对nginx性能影响较大,在实际中需灵活配置
-
http块
该部分为nginx服务器中配置最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。该部分分为:http全局块和server块。
-
http全局块
指令包括文件引入、MIME-TYPE定义、日志定义、连接超时时间、单链接请求数上限等;
-
server块
与主机密切相关,又细分为:server全局块和location块。
server全局块主要主要配置虚拟主机的监听配置和虚拟主机的命令或IP配置;一个server块可以配置多个location块,location块的作用是监听nginx服务器接收到的请求,对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。
-
-
6、反向代理
定义
-
正向代理
当用户需要访问谷歌网站(www.google.com)时,直接访问是访问不了的,若要能够访问,则需要在浏览器中设置代理服务器,通过代理服务器去访问谷歌网站,这种方式就叫做正向代理。
-
反向代理
反向代理服务器和目标服务器对外是一个服务器,暴露的是代理服务器的地址和端口,隐藏了真实服务器的地址和端口。用户只需要将请求发送到代理服务器,代理服务器会将请求分发给目标服务器,目标服务器返回数据后,数据通过代理服务器返回给客户端,这种方式就叫做反向代理。
案例1
-
目的:当用户访问
http://www.123.com
时,直接跳转到127.0.0.1:8080
; -
步骤:
-
安装
tomcat
## 下载tomcat并将文件上传到服务器:apache-tomcat-9.0.41.tar.gz ## 解压安装文件 tar -xvf apache-tomcat-9.0.41.tar.gz cd apache-tomcat-9.0.41 ## 运行tomcat cd bin/ ./startup.sh ## 开放8080端口 sudo firewall-cmd --add-port=8080/tcp --premanent sudo firewall-cmd --reload
测试,在网页上访问
8080
端口 -
配置域名
www.123.com
与ip192.168.106.128
的映射(Windows系统),将映射关系添加到C:\Windows\System32\drivers\etc\hosts
文件中;配置完成之后,即可通过域名访问服务器:
-
修改nginx配置文件
/usr/local/nginx/conf/nginx.conf
:修改完成后,保存并退出,然后nginx重新加载配置文件:
cd /usr/local/nginx/sbin/ sudo ./nginx -s reload
重新加载完成后,即可在浏览器中访问
80
端口:
-
案例2
-
目的:访问
http:192.168.106.128:9001/edu/
时跳转到127.0.0.1:8080
; 访问
http:192.168.106.128:9001/vod/
时跳转到127.0.0.1:8081
-
步骤:
-
准备两个
tomcat
,操作与案例1一致,一个是8080端口,一个是8081端口 -
准备可识别的html页面
## 进行8080端口的tomcat目录下的webapps目录 cd /usr/src/tomcat8080/apache-tomcat-9.0.41/webapps/ ## 创建edu目录 sudo mkdir edu && cd edu ## 创建a.html,并添加标签<h1>8080!!</h1> sudo vim a.html
配置完成后,可在浏览器中访问:
## 进行8081端口的tomcat目录下的webapps目录 cd /usr/src/tomcat8081/apache-tomcat-9.0.41/webapps/ ## 创建vod目录 sudo mkdir vod && cd vod ## 创建a.html,并添加标签<h1>8081!!</h1> sudo vim a.html
配置完成后,可在浏览器中访问:
-
配置nginx配置文件
/usr/local/nginx/conf/nginx.conf
其中,location中的标签代表:
~
:表示url包含正则表达式,则区分大小写;~*
:表示url包含正则表达式,则不区分大小写;=
:用于不含正则表打死的uri前,要求请求字符串与uri严格匹配;^~
:用于不含正则表打死的uri前,要求nginx服务器找到标识uri 与请求字符串匹配度最高的location后,立即使用该location。
修改完成后,重新加载nginx配置文件
cd /usr/local/nginx/sbin sudo ./nginx -s reload
开放端口号:
9001
、8080
、8081
sudo firewall-cmd --add-port=9001/tcp --premanent sudo firewall-cmd --reload
重新加载后,可在浏览器中测试:
-
7、负载均衡
定义
单台服务器解决不了,我们就增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上。将负载分发到不同的服务器上的方式也就是负载均衡。
负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。
案例
-
目的:访问
http:192.168.106.128:9001/edu/a.html
时随机跳转到127.0.0.1:8080
或者127.0.0.1:8081
; -
步骤:
-
准备两个tomcat,一个指向8080,一个指向8081(参考反向代理案例2),在
tomcat8081/webapps/
目录下新增edu/a.html
路径和文件,a.html
文件内容如下:<h1> 8081!! Hello world </h1>
-
配置完成后分配启动两个tomcat服务器:
cd /usr/src/tomcat8080/apache-tomcat-9.0.41/bin ./startup.sh
-
配置nginx配置文件:
upstrem myserver { server 192.168.106.128:8080; server 192.168.106.128:8081; } ## 也可以配置上权限,配置上权重后,服务器会按权重将请求分配到对应的目标服务器 upstrem myserver { server 192.168.106.128:8080 weight=1; server 192.168.106.128:8081 weight=1; }
-
重新加载nginx配置文件
cd /usr/local/nginx/sbin sudo ./nginx -s reload
-
重新加载后,可在浏览器中测试:
第一次访问:
第二次访问:
-
负载均衡分配方式(策略)
-
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除;
-
权重(weight)
weight代表权重,默认是1,权重越高分配的请求越多;
upstrem myserver { server 192.168.106.128:8080 weight=10; server 192.168.106.128:8081 weight=5; }
-
ip_hash
每个请求按访问ip的hash分配结果,这样每个访客固定访问一个后端服务器,可以解决session的问题;
upstrem myserver { ip_hash; server 192.168.106.128:8080; server 192.168.106.128:8081; }
-
fair(第三方)
根据后台服务器的响应时间来分配请求,响应时间短的优先分配;
upstrem myserver { server 192.168.106.128:8080; server 192.168.106.128:8081; fair; }
7、动静分离
定义
为了加快网站的解析速度,可以将动态页面和静态页面分别部署到两台服务器上,有不用的服务器来解析,加快解析速度,降低单服务器的压力,这种方式就是动静分离。
Nginx动静分离简单来说就是将动态请求和静态请求分开,不仅仅是单纯的将动态页面和静态页面分开。
案例
-
目的:访问
http://192.168.106.128/www/a.html
访问的是服务器/data/www/a.html
;当访问动态资源是,访问tomcat,即跳转http://192.168.106.128:8080
; -
步骤:
-
创建路径
/data/www/
,在该路径下创建文件a.html
:cd / && sudo mkdir data cd data && sudo mkdir www cd www && sudo vim a.html
<h1> test html!! </h1>
-
修改nginx配置文件
-
重新加载nginx配置文件
cd /usr/local/nginx/sbin sudo ./nginx -s reload
-
重新加载后,可在浏览器中测试:
-
说明
location /image/ {
root /data/;
autoindex on; ## 当配置该项时,访问文件后会显示文件夹的内容
}
8、高可用
定义
一般情况下,客户端访问的是主代理服务器,有主代理服务器将请求分发到目标服务器上;当主代理服务器出现异常而导致无法访问时,客户端会去访问备份代理服务器,有备份代理服务器将请求分发到目标服务器上,这种方式就是高可用。
在这个模式下,代理服务器会对外暴露一个虚拟ip,同时每个代理服务器均需配置KeepAlived,由KeepAlived控制虚拟ip实际访问的是哪台代理服务器;而客户端访问的是代理服务器暴露的虚拟ip。
案例
-
目的:当停掉主代理服务器后,网站仍可以正常访问;
-
环境:
- 两台服务器:
192.168.106.128
和192.168.106.129
- 均安装nginx
- 均安装keepalived
- 两台服务器:
-
步骤:
-
安装keepalived
sudo yum install -y keepalived
安装完成后,即可在
/etc/keepalived/
路径下找到keepalived.conf
文件; -
配置主服务器
192.168.106.128
的keepalived
配置文件,进入/etc/keepalived/
目录,修改keepalived.conf
配置文件:! Configuration File for keepalived # 全局配置 global_defs { # 邮件通知信息 notification_email { # 收件人 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } # 发件人 notification_email_from Alexandre.Cassen@firewall.loc # SMTP服务器地址 smtp_server 192.168.200.1 # SMTP 超时时间 smtp_connect_timeout 30 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名 router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } # 一个vrrp_instance就是定义一个虚拟路由器的实例名称 vrrp_instance VI_1 { #定义类型,MASTER(主服务器)或BACKUP(备份服务器) state MASTER # 接口,网卡名 interface ens33 # 虚拟路由ID,取值范围为0-255 virtual_router_id 51 # 优先级,值越高优先程度越高,主服务器需比备份服务器要高 priority 190 # 频率,单位为秒 advert_int 1 # 通信认证机制 authentication { # 认证方式,可以是PASS或AH auth_type PASS # 认证密码,最大8位数 auth_pass 1111 } # 虚拟IP地址 virtual_ipaddress { 192.168.106.16 } }
虚拟IP最好与服务器IP处于同一个网段,如在本例中,虚拟IP的地址最好为:
192.168.106.xxx
,一开始验证时,设置的是192.168.200.16
,导致keepalived
启动后无法访问虚拟IP。 -
保存并退出配置文件,然后启动
keepalived
:sudo systemctl start keepalived.service
-
启动
nginx
:cd /usr/local/nginx/sbin sudo ./nginx
启动后,主服务器就配置完成了,这时通过浏览器可以进行访问:
-
配置从服务器
192.168.106.129
的keepalived
配置文件,进入/etc/keepalived/
目录,修改keepalived.conf
配置文件,修改一下内容:具体配置文件内容如下:
! Configuration File for keepalived # 全局配置 global_defs { # 邮件通知信息 notification_email { # 收件人 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } # 发件人 notification_email_from Alexandre.Cassen@firewall.loc # SMTP服务器地址 smtp_server 192.168.200.1 # SMTP 超时时间 smtp_connect_timeout 30 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名 router_id LVS_DEVEL vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } # 一个vrrp_instance就是定义一个虚拟路由器的实例名称 vrrp_instance VI_1 { #定义类型,MASTER(主服务器)或BACKUP(备份服务器) state BACKUP # 接口,网卡名 interface ens33 # 虚拟路由ID,取值范围为0-255 virtual_router_id 51 # 优先级,值越高优先程度越高,主服务器需比备份服务器要高 priority 90 # 频率,单位为秒 advert_int 1 # 通信认证机制 authentication { # 认证方式,可以是PASS或AH auth_type PASS # 认证密码,最大8位数 auth_pass 1111 } # 虚拟IP地址 virtual_ipaddress { 192.168.106.16 } }
-
保存并退出配置文件,然后启动
keepalived
:sudo systemctl start keepalived.service
-
启动
nginx
:cd /usr/local/nginx/sbin sudo ./nginx
启动后,从服务器也配置完成了,这时通过浏览器进行验证了:
-
-
测试:
- 第一次访问虚拟IP
192.168.106.16
:
-
将主服务器
192.168.106.128
上的keepalived
和nginx
停掉:# 停掉keepalived sudo systemctl stop keepalived.service # 停掉nginx cd /usr/local/nginx/sbin sudo ./nginx -s stop
-
第二次访问虚拟IP
192.168.106.16
,依旧可以访问:
- 第一次访问虚拟IP
9、nginx原理
- 简介
- 默认采用多进程工作方式;
- Nginx启动后,会运行一个master进程和多个worker进程;
- master进程:
- 用户与worker之间的交互的接口;
- 管理worker进程,实现服务重启、平滑升级、更换日志文件,更新配置文件等功能;
- worker进程:
- 处理基本的网络事件;
- worker之间是平等的;
- 以竞争的方式来争抢来自客户端的请求;
- 整体模型
-
一个master多个worker的好处:
- 可以使用
nginx -s reload
进行热部署,利用nginx进行热部署操作; - 每个worker都是独立的进程,如果其中一个worker出现问题,也不会影响其他的worker,其他会进行对请求进行争抢,实现请求过程,不会造成服务中断;
- 可以使用
-
需要设置多少个worker:
- 每个worker的线程都可以将一个cpu的性能发挥到极致,因此worker数和服务器的cpu数一致是最适宜的。
-
连接数worker_connection:
-
发送请求,占用了2个或者4个连接数;
-
支持的最大并发数:
-
普通的静态访问最大并发数是:
worker_connections * worker_processes / 2
; -
HTTP作为反向代理的最大并发数是:
work_connections * worker_processes / 4
; -
以上,如果nginx有一个master,4个worker,每个worker支持的最大连接数是1024,那么支持的最大连接数是:
1024 * 4 / 2 = 2048; # 静态 1024 * 4 / 4 = 1024; # HTTP
-
-