目录
01.Nginx基本概念
1.1.Nginx是什么
- Nginx (engine x) 是一个高性能的HTTP和反向代理
web服务器
,同时也提供了IMAP/POP3/SMTP服务。 - 特点是占用内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
- 更多关于Nginx的介绍参考:
https://lnmp.org/nginx.html
1.2.反向代理
1.2.1.正向代理
在谈论反向代理之前先讨论一下什么是正向代理:
- Nginx不仅可以做反向代理,实现负载均衡,还能用作正向代理来进行上网等功能。
- 正向代理:如果把局域网外的Internet想像成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,例如下图。
- 注意:
正向代理中浏览器要配置代理服务器
。
1.2.2.反向代理
反向代理:
- 客户端对反向代理是无感知的,因为客户端不需要任何配置就可以访问。
- 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端。
- 此时反向代理服务器和目标服务器对外就相当于一个服务器,只不过暴露的是代理服务器地址,隐藏了真实服务器的IP地址。
1.3.负载均衡
负载均衡的引出:
- 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,在将结果返回给客户端,
这种结构当并发量特别大的时候,服务器很可能会宕机
。
负载均衡:
- 单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,就是所谓的负载均衡。
1.4.动静分离
动静分离:
- 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析的速度,降低原来单个服务器的压力。
02.Nginx安装,常用命令和配置文件
2.1.在Linux系统中安装Nginx
Nginx一般都是安装在Linux系统中(当然Windows系统中也可以装)
安装之前先下载:http://nginx.org/en/download.html
我下载的是:
依赖环境:
pcre-8.37.tar.gz
openssl-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.12.2.tar.gz
安装步骤:
- 第一步:使用远程工具连接Linux系统:
- 第二步:安装依赖环境,安装在
/usr/src
目录:
依赖环境:
pcre-8.37.tar.gz
openssl-1.0.1t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.12.2.tar.gz
方法一:我们可以先下载,然后在解压安装:
通过远程连接工具将下载文件上传到/usr/src目录,然后解压安装在这个文件夹下。
方法二:我们还可以在远程连接工具中直接使用命令下载并安装,直接安装在/src文件夹下:
注意:执行命令时要将目录切换到/usr/src。
注意:通过Xftp向Linux系统中拖拽文件时,需要修改Linux系统中文件夹的权限
往哪个文件夹中上传文件,就要修改那个文件夹的权限
此处修改src文件夹的权限
修改权限需要使用管理员权限:su root
修改权限,在usr目录下执行命令:chmod 777 src/
方法二:我还可以可以在远程连接工具中直接使用命令下载并安装:
先转到/usr/src目录下,然后使用yum命令下载:
分开下载:
yum install -y make zlib zlib-devel
yum install -y make gcc-c++ libtool
yum install -y openssl openssl-devel
合在一起下载:
yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
make的作用是下载后直接编译
方法一:我门可以先下载,然后在解压安装:
把pcre-8.37.tar.gz文件上传到/usr/src目录下
执行命令进行解压:tar -xvf pcre-8.37.tar.gz
进入解压后的文件:cd pcre-8.37/
执行命令生成配置文件:./configure
然后执行命令进行编译和安装:make&&make install
查看安装版本命令:pcre-config --version
如法炮制,安装nginx-1.12.2.tar.gz文件
装完ngnix之后,会自动在/usr/local文件夹中创建一个ngnix
在/usr/local/ngnix文件夹下,有一个sbin启动脚本
启动ngnix服务器,进入这个脚本文件夹/usr/local/ngnix/sbin,执行命令:./ngnix
可以通过这个命令查看服务是否启动:ps -ef|grep ngnix
通过这个命令可以杀死进程(关闭Nginx服务器):kill -9 进程ID
访问ngnix服务器:
在/usr/local/ngnix/conf/问价夹下有一个ngnix.conf文件,这个文件就是ngnix的配置文件
在这个文件里面设置ngnix监听的端口号:默认80端口
访问通过:IP+端口号
直接访问可能访问不到,因为Linux中有防火墙,下面对防火墙进行设置:
查看开放的端口号:firewall-cmd --list-all
看到port选项中为空,也就是未开放任何端口号
设置开放端口号:sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙:firewall-cmd --reload
现在外部就可以访问80端口了
- 访问成功页面:
- Linux系统中全局安装文件都是安装在/usr/src目录下,在这个目录下安装完文件后,可执行文件会放在
/usr/local/安装文件名/sbin
,这个文件夹下,启动安装的文件直接使用命令运行可执行文件即可,可执行文件类似于Windows系统下的.exe
文件。
2.2.Nginx常用命令
注意:使用Nginix的命令的时候要先进入带Ngnix可执行文件的目录中去(和windows是一样的,不配置环境变量就要到bin目录下去执行命令),如果按照我们上面的安装位置来说,这个目录就在:/usr/local/ngnix/sbin
- 查看Ngnix版本号
命令:./nginx -v
- 启动Nginx
命令:./nginx
- 关闭Nginx
命令:./nginx -s stop
- 重新加载Nginx:修改配置文件之后,不重启直接重新加载时使用
命令:./nginx -s reload
2.3.Nginx配置文件
如果你把Nginx安装在/usr/src
目录下,配置文件的位置就在/usr/local/nginx/conf/
文件夹下,名字为nginx.conf
,这个文件就是nginx的配置文件
配置文件组成:
第一部分:全局块
位置:从配置文件开始到events块之间的内容
第二部分:events块
位置:events{ }
第三部分:http块
位置:http{ }
2.3.1.全局块
- 主要包括配置运行Nginx服务器的用户组,允许生成的worker process数,进程PID存放路径,日志存放路径以及配置文件的引入等
#user nobody;
worker_processes 1; //配置Ngnix处理并发的数量,越大,处理并发数量越多
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
2.3.2.events块
- 主要影响Nginx服务器与用户网络连接
- 比如:
worker connections 1024;
,支持最大连接数为1024 - 这部分在使用中应该灵活配置
events {
worker_connections 1024;
}
2.3.3.http块
这部分是Nginx服务器中配置最频繁的部分
,代理,缓存,日志定义,绝大多的数功能和第三方模块的配置都在这里。
- 注意:http块也可以包括:
http全局块
,server块
http全局块
:配置的指令有,文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求数上限等。server块
:和虚拟主机有密切关系,虚拟主机从用户角度看和一台独立的计算机是一样的,该技术就是为了节约互联网服务器硬件成本。- 每个http块可包含多个server块,每个server块就相当于一个虚拟主机
- server块也可分为:
全局server块
,以及同时包含多个location块
全局server块
:最常见的配置是虚拟主机的监听配置和本虚拟主机的名称或IP配置location块
:一个server块中可以配置多个location块
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
03.Nginx配置实例:反向代理
3.1.准备工作
在Linux中安装一个tomcat:
- 在tomcat官网下载一个tomcat:
https://tomcat.apache.org/download-70.cgi
- 将下载好的tomcat放到
/usr/src
目录下 - 解压:
tar -xvf 压缩包名
- tomcat解压即可,无需安装
tomcat 的启动需要JDK的环境,我们可以使用命令:java -version
查看是否安装了JDK,没有的话就安装一个JDK环境即可。
- 因为无需安装我们直接进入到加压文件的bin目录中使用命令启动:
./startup.sh
在Linux中打开8080端口
,使用IP+端口号
,就可以使用浏览器可以进行测试。
3.2.反向代理一
实现效果:
- 打开浏览器访问地址
www.123.com
跳转到Linux系统中的tomcat主页
- 为什么要修改host文件?
当我们使用浏览器访问一个链接的时候,会首先到我们本地的host文件中去查找对应
解析的IP地址,如果找不到,就会去网上的DNS服务器上去找,因为我们没有申请域名,
所以只能修改本地host文件。
host文件位置:C:\Windows\System32\drivers\etc
配置反向代理(修改Ngnix配置文件):
- 注意:配置完要重启Nginx服务器或者重新加载一下配置文件
3.3.反向代理二
实现效果:
- 使用Nginx做反向代理,根据访问的路径跳转到不同端口的服务器中
- Ngnix监听的端口为9001;
- 访问
http://192.168.17.129:9001/edu/
直接跳转到127.0.0.1:8081
- 访问
http://192.168.17.129:9001/vod/
直接跳转到127.0.0.1:8082
前提准备:两个tomcat服务器,修改端口号一个为8081,一个为8082,准备测试页面
- 在/usr/src/目录下新建两个文件夹:
tomcat8081和tomcat8082
,并放入tomcat服务器压缩包。
mkdir tomcat8081
mkdir tomcat8082
- 解压tomcat压缩包,然后修改配置文件里面的端口号(
要修改三处端口号
)
配置文件位置:解压的tomcat/conf/server.xml
注意:三处端口号不能重复,重复可能会导致一个tomcat启动不起来
- 在tomcat服务器中添加一个简单页面
在tomcat8081中的webapps文件夹下创建一个edu文件夹,并在里面放入一个a.html文件
在tomcat8082中的webapps文件夹下创建一个vod文件夹,并在里面放入一个b.html文件
- a.html
<h1>你好我是tomcat服务器8081<h1>
- b.html
<h1>你好我是tomcat服务器8082<h1>
- 把两个服务器跑起来进行测试
注意:要在Linux中先开启这个端口号
浏览器输入:IP:8081/edu/a.html
浏览器输入:IP:8082/vod/b.html
配置Nginx(修改Ngnix的配置文件):
- 测试:
注意:要在Linux中先开启这个端口号
访问http://192.168.17.129:9001/edu/a.html直接跳转到`127.0.0.1:8081`
访问http://192.168.17.129:9001/vod/b.html直接跳转到`127.0.0.1:8082`
3.4.location指令说明
该指令用来匹配URL
语法如下:
location [ = | ~ | ~ * | ^~ ] URI{
}
- 1,
=
:用于不含正则表达式的URI前,要求请求字符串与URI严格匹配,如果匹配成功,就停止继续向下搜索,并立即处理该请求。 - 2,
~
:用于表示URI包含正则表达式,并且区分大小写。 - 3,
~*
:用于表示URI包含正则表达式,并且不区分大小写。 - 4,
^~
:用于不含正则表达式的URI前,要求Nginx服务器找到标识URI和请求字符串匹配高度最高location后,立即使用此location处理请求,而不再使用location块儿中的正则URI和请求字符串做匹配。
04.Nginx配置实例:负载均衡
实现效果:
- 浏览器访问
http://192.168.17.129/edu/a.html
,负载均衡平均分配到8081和8082端口
准备工作:准备两台tomcat服务器(前面已经弄过一边了)
- 在两台tomcat的webapps目录中,创建名称为edu的文件夹,然后在edu文件夹下创建一个a.html文件,用于测试。
配置Nginx(修改Ngnix的配置文件):
4.1.Ngnix负载均衡的分配策略(六种)
轮询 | 默认方式 |
---|---|
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 最少连接方式 |
fair(第三方) | 响应时间方式 |
url_hash(第三方) | 依据URL分配方式 |
05.Nginx配置实例:动静分离
5.1.Nginx介绍
Nginx动静分离:
-
简单来说就是把动态请求跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。
-
也可以可以理解为使用Nginx处理静态页面,Tomcat处理动态页面。
-
动静分离从目前实现角度来讲大致分为两种:
- 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
- 另一种方法就是动态文件跟静态文件混和在一起发布,通过Ngnix来分开。
-
通过location指定不同的后缀名实现不同的请求转发,通过expirse参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
-
具体expirse定义:
- 是给一个资源设定一个过期时间,也就是无需服务端验证,直接通过浏览器自身去确认是否过期即可,
- 所以不会产生额外的流量,此种方法非常适合不经常变动的资源,如果经常更新的文件不建议使用expirse来缓存,我这里设置3d,表示3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
5.2.动静分离
通过Ngnix配置静态资源,不使用Tomcat,直接通过Ngnix访问静态资源
,动态资源放在Tomcat下部署。
配置Nginx(修改Ngnix的配置文件):
- 注意:data文件夹要创建在根目录下,Linux中的根目录为:
/
06.Nginx配置高可用集群
6.1.什么是高可用集群
普通配置:
高可用集群:
高可用原理:以上图为例
- 我们有两个Linux节点,一个主节点,一个从节点,每个节点上都装一个Nginx服务器和Tomcat服务器,里面部署一样的内容。
- 当主节点宕机的时候通过keepalived检测到,自动切换到从服务器。
- 两个服务器对外绑定同一个虚拟IP
高可用集群条件:
- 多个Linux节点,每个Linux节点上都装上Ngnix服务器。
- 每个节点需要安装keepalived软件
- 需要虚拟IP
6.2.准备工作
两台服务器:在弄一个Linux环境。
服务器安装Ngnix:前面已经装过一次了,照着装就可以了。
安装 openssl,zlib,gcc,依赖命令:
yum install -y make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
服务器安装keepalived:
安装keepalived的方式有多种:
可以使用yum命令安装
可以先下载,然后再解压安装
yum命令安装:yum install -y keepalived
安装位置:/usr目录下
安装后在/etc目录下会有一个:keepalived文件,在这个文件中有一个配置文件
keepalived.conf
6.3.高可用配置
其实就是配置keepalived.conf这个文件
- 主服务器中的keepalived.conf配置:192.168.17.129
使用命令打开配置文件: vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
# hostname可以在/etc/host中查看
router_id aismall01# 标识本节点的字条串,通常为 hostname
}
# 检测脚本
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 检测 nginx 状态的脚本路径
interval 2 # 检测时间间隔
weight -20 # 如果条件成立,权重-20
}
# 定义虚拟路由, VI_1 为虚拟路由的标示符,名称可以自定义
vrrp_instance VI_1 {
state MASTER # 主节点为 MASTER, 对应的备份节点为 BACKUP
interface ens33 # 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同
virtual_router_id 33 # 虚拟路由的 ID 号, 两个节点设置必须一样
mcast_src_ip 192.168. 17.129 # 本机 IP 地址
priority 100 # 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样, 默认 1s
#设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111 # 真实生产,按需求对应该过来
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx # 执行 Nginx 监控的服务
}
# 虚拟IP两个节点设置必须一样
virtual_ipaddress {
192.168.17.50 # 虚拟 ip可以定义多个
}
}
- 从服务器中的keepalived.conf配置:192.168.17.129
使用命令打开配置文件: vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id aismall02
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 33
mcast_src_ip 192.168.17.131
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.17.50
}
}
检测脚本:
- 编写 Nginx 状态检测脚本 ,
/etc/keepalived/nginx_check.sh
(已在 keepalived.conf 中配置),要把这个脚本拷贝到服务器的这个位置/etc/keepalived
,两个服务器都要有,一定不要忘记。 - 脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。 内容如下:
# vi /etc/keepalived/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
6.4.软件的启动
启动Nginx和keepalived在同一个目录/usr/local/ngnix/sbin
:
- 启动Nginx,在这个目录下执行命令:
./nginx
- 启动keepalived,在这个目录下执行命令:
systemctl start keepalived.service
6.5.测试
测试其实很简单,你访问虚拟IP的时候,把主服务器停掉,看看能不能正常访问就可以了。