Nginx
一、了解Nginx
1.1、什么是Nginx
- Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,是来自战斗民族的信息科技产物。
- Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
- 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
- 中国使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
- 优点:
- 服务器优势:
- 正反向代理
- 负载均衡
- 动静分离
1.2、代理机制
- 正向代理
- 如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
- 需要在客户端配置代理服务器进行指定网站访问
- 反向代理
- 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器。相当于通过第三方访问服务器。
- 暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
1.3、负载均衡
- 在访问请求到达一定数量时,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,已到达降低服务器压力的效果,也就是我们所说的负载均衡。
1.4、动静分离
- 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二、Nginx安装及使用
2.1、Linux中安装Nginx
- 自我推荐Docker安装,方便快捷,小巧,灵便。
- 安装命令
- 安装:docker pull nginx
- 重启Docker:systemctl restart docker
- 启动服务:docker run -d —name ngnix-dev -p 81:80 nginx
- 进入容器:docker exec -it ngnix-test /bin/bash
- 关闭容器:docker spot nginx-dev
2.2、Nginx常用命令
Docker中Nginx的命令
#开机启动nginx服务
systemctl enable nginx.service #查询服务是否开机启动
systemctl is-enabled servicename.service #
systemctl enable nginx.service #服务开机自启动
systemctl disable nginx.service #取消开机运行
systemctl start nginx.service #启动服务
systemctl stop nginx.service #停止服务
systemctl restart nginx.service #重新加载服务配置文件
systemctl reload nginx.service #重新加载服务配置文件
systemctl status nginx.service #查询服务运行状态
systemctl --failed #显示启动失败的服务
- 目录查看情况
#进入容器
docker exec -it ngnix-test /bin/bash
#查看路径
root@519faf7d8747:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
#查看文件
root@519faf7d8747:/# cd /etc/nginx
root@519faf7d8747:/etc/nginx# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
2.3、Nginx配置文件
- nginx.conf配置文件包含三部分内容
- 全局块
- 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx服务器整体运行的配置指令,主要包括配置运行 Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以 及配置文件的引入等。
- 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx服务器整体运行的配置指令,主要包括配置运行 Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以 及配置文件的引入等。
- events块
- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
- events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
- http块
- 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http 全局块、server 块。
- http 全局块
- server 块
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。 每个http块可以包括多个server块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局 server 块
- 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
- ocation 块,一个 server 块可以配置多个 location 块。
- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http 全局块、server 块。
三、Nginx的使用
3.1、代理实例配置
1、实现单机反向代理
- 实现效果:使用 nginx 反向代理,访问 www.123.com 直接跳转到 127.0.0.1:8080
- 案例分析
- 在浏览器上面直接输入域名进行访问,请求先访问Nginx的代理服务,再通过Nginx代理指向tomcatIP地址
操作步骤:
- 配置windows本地hosts服务
- 进入Nginx.conf进行配置nginx.conf
[root@hg14150 ~]# cd /www/server/nginx/nginx-1.18.0/conf
#进入.conf文件
[root@hg14150 conf]# vim nginx.conf
```- 配置windows本地hosts服务
- 进入Nginx.conf进行配置nginx.conf.defalut
server {
#设置监听端口
listen 80;
#设置服务域名
server_name www.123.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
#设置代理IP
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
再Nginx中进行请求转发的配置,即反向代理
server {
#设置监听端口
listen 80;
#设置服务域名
server_name www.123.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
#设置代理IP
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
2、实现多集群代理
- 实现效果:
- 使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,减轻服务器的负载压力
- 准备工作
- 开启多个Tomcat服务器,并配置好端口号
- 访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
- 访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082
- 实现步骤
进入tomcat-01容器配置页面显示内容
docker exec -it tomcat-01 /bin/bash root@f26669cbeaa7:/usr/local/tomcat# cd webapps
创建目录
root@f26669cbeaa7:/usr/local/tomcat/webapps# mkdir edu
定义页面
root@f26669cbeaa7:/usr/local/tomcat/webapps/edu# touch web.xml
进入tomcat-02容器配置页面显示内容
docker exec -it tomcat-02 /bin/bash root@f26669cbeaa7:/usr/local/tomcat# cd webapps
创建目录
root@f26669cbeaa7:/usr/local/tomcat/webapps# mkdir doc
定义页面
root@f26669cbeaa7:/usr/local/tomcat/webapps/edu# touch a.html
- 第二步,修改 nginx 的配置文件
```shell
server {
listen 80;
server_name www.h1234.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~/edu/ {
root html;
proxy_pass http://127.0.0.1:8001;
index index.html index.htm;
}
location ~/doc/ {
root html;
proxy_pass http://127.0.0.1:8002;
index index.html index.htm;
}
}
3.2、负载均衡实例配置
- 负载均衡主要实现多服务器资源分配的问题,从而减轻访问对服务器负载的压力
- 部署准备
- docker创建两个tomcat容器
- 容器配置虚拟目录edu/web.xml
- 主页显示tomcat-01有内容,tomcat-02无内容
- 配置步骤
tomcat-02
root@f26669cbeaa7:/usr/local/tomcat/webapps# cd edu root@f26669cbeaa7:/usr/local/tomcat/webapps/edu# touch web.xml
- 配置nginx.conf
```shell
#配置服务IP、端口及权重
upstream tomcatserver{
least_conn;
ip_hash;
server 39.101.188.99:8001 weight=1;
server 39.101.188.99:8002 weight=1;
fair;
}
server {
listen 80;
server_name www.h1234.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log off;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
#指定代理IP
proxy_pass http://tomcatserver;
index index.html index.htm;
}
- 分析
ip_hash;
#每个请求都根据访问ip的hash结果分配,每个访客固定访问一个后端服务(ip_hash可以和weight配合使用)
least_conn;
#将请求分配到连接数最少的服务上,并发量大时,最能体现负载均衡实际作用
fair;
#按后端服务器的响应时间来分配请求,响应时间短的优先分配,提高服务器性能
3.3、动静分离实例配置
- 页面的显示情况
- 静态资源: 当用户多次访问这个资源,资源的源代码永远不会改变的资源。
- 动态资源:当用户多次访问这个资源,资源的源代码可能会发送改变。
- 动静分离
- 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
- 动静分离简单的概括是:动态文件与静态文件的分离。
- 伪静态:网站如果想被搜索引擎搜素到,动态页面静态技术freemarker等模版引擎技术
- 为什么要动静分离
- 请求的资源不同,部分静态或动态资源可能会被多次请求访问,动静分离提高服务器的性能。
- 动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。
- 动态资源转发到tomcat服务器使用反向代理。
- 动静分离动态资源与静态资源分离,不会部署在同一台服务器上。
- 架构分析
- 配置
###静态资源访问
server {
listen 80;
server_name static.haoworld.com;
#imgs访问目录
location /imgs/ {
#imgs在linux中的位置
root /data/;
index index.html index.htm;
}
}
###动态资源访问
server {
listen 80;
server_name www.haoworld.com;
#动态资源访问
location / {
root /data/Test01;
index index.html index.htm;
}
}
3.4、nginx 搭建高可用集群
1、Keepalived+Nginx 高可用集群(主从模式)
- 简单理解就时主从复制的原理,当服务器集群中,主服务器宕机时,从机快速补上
- 好处就是能够实时保证项目的所有服务能正常运行
- nginx的主从复制依赖于keepalive,通过keepalive进行实时备份
- 集群架构图
- 前期准备
- 准备两台服务器
- 两天服务器上都安装nginx
- 两台服务器都按照keepalive
- 集群准备说明
- 执行步骤
- 安装nginx
yum install nginx -y
#查看版本
nginx -vserion
- 安装nginx
- 安装keepalived
yum install keepalived -y
#查看版本信息
rpm -q -a keepalived
- 修改配置文件
- 进入keepalived.conf
#进入配置文件,路径一般都是统一的
cd /etc/keppalived
vim keepalived.conf
- 进入keepalived.conf
- 所有结点上都解析配置
#关闭防火墙
systemctl stop firewalld
#关闭 selinux,重启生效
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
#关闭 selinux,临时生效
setenforce 0
#时间同步
ntpdate 0.centos.pool.ntp.org
- 分析配置信息(两台服务器,一台配置主服务器,另一台配置从服务器)
#全局定义
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#虚拟IP的匹配
vrrp_instance VI_1 {
state MASTER #主服务器 从机为BACKUP
interface eth0 #网卡
virtual_router_id 51
priority 100 #服务器优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虚拟IP地址
192.168.200.16
192.168.200.17
192.168.200.18
}
}
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
#自定义检测脚本,对应路径为/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
- 启动nginx于keepaliaved
cd /usr/local/nginx/sbin
./nginx
systemctl start keepalived.service
- 启动测试并随机停掉一台服务器<br />![](https://gitee.com/hg14150/blogiamges/raw/master/img/image-20210523135609683.png#crop=0&crop=0&crop=1&crop=1&id=mvYLF&originHeight=629&originWidth=1532&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
8.2 Keepalived+Nginx 高可用集群(双主模式)
- 将keepalived做成双主模式,就是再配置一段新的vrrp_instance(实例)规则,主上面加配置一个从的实例规则,从上面加配置一个主体的实例规则。
- 类似负载均衡的原理,两台服务器互相切换,从而到达避免宕机导致数据崩塌及减轻服务器压力的效果
- 与主从模式的主要区别就是配置文件中的vrrp_instance规则
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.110/24 dev ens33 label ens33:1
}
}
#主从模式不同部分
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.1.210/24 dev ens33 label ens33:2
}
- 其他配置及测试相同
四、解析Nginx底层原理
4.1、nginx原理
- master-workers 的机制的好处
- 对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,在编程以及问题查找时,也会方便很多
- 采用独立的进程,可以让互相之间不会 影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程
- 异常退出时,会导致当 前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
4.2、参数配置
- worker配置
- Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话 下。
- 每个 worker 的线程可以把一个 cpu 的性能发挥到极致,所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
- worker设置数量
worker_processes 4
#work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000 #work 绑定 cpu (4 work 绑定 8cpu 中的 4 个)
worker_cpu_affinity 0000001 00000010 00000100 0000100 - 连接数 worker_connection
- 这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接 数,应该是 worker_connections * worker_processes。
- 这里说的是最大连接数,对于 HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes
- 如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访 问最大并发数是: workerconnections workerprocesses /2,而如果是 HTTP 作 为反向代 理来说,最大并发数量应该是 worker_connections worker_processes/4。
- 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服 务的连接,会占用两个连接