内容介绍
课程名称:尚硅谷Nginx教程(nginx快速上手)
课程连接:https://www.bilibili.com/video/BV1zJ411w7SV
1.nginx基本概念
1.nginx是什么,做什么事情
2.反向代理
3.负载均衡
4.动静分离
2.nginx安装、常用命令和配置文件
1.在linux系统中安装nginx
2.nginx常用命令
3.nginx配置文件
3.nginx配置实例1-反向代理
4.nginx配置实例2-负载均衡
5.nginx配置实例3-动静分离
6.nginx配置高可用集群
7.nginx原理
第一章 nginx简介
1.什么是nginx
高性能的http和反向代理web服务器
特点是占有内存少,并发能力强
事实上nginx的并发能力在同类型的网页服务器中表现较好
nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等,但不支持java。java程序只能通过与tomcat配合完成。
nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告显示其能支持高达50,000个并发连接数
2.反向代理
1.正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
2.反向代理
反向代理中,客户端对代理是无感知的,因为刻画段不需要任何配置就可以访问
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端。
此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
正向代理是客户端的代理,反向代理是服务端的代理
3.负载均衡
普通模式:客户端发送多个请求到服务器,服务器处理请求,有些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种普通模式对早期的系统相对单一、并发请求相对较少的情况下是比较适合的,成本也低。
但随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器响应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器的直接崩溃。
单个服务器解决不了(普通模式),我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同服务器,也就是我们所说的负载均衡。
4.动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
静态资源比如:html、css、js
动态资源比如:jsp,servlet
第二章 nginx的安装与配置
1.安装
1.安装依赖
1.安装gcc
yum -y install gcc
2.安装pcre、pcre-devel
yum install -y pcre pcre-devel
3.安装zlib
yum install -y zlib zlib-devel
4.安装openssl
yum install -y openssl openssl-devel
2.获取nginx压缩包
wget http://nginx.org/download/nginx-1.9.9.tar.gz
解压
tar -zxvf nginx-1.9.9.tar.gz
3.进入到nginx-1.9.9目录中
使用以下三个命令
./configure
make && make install
2.nginx常用命令
前提条件:进入nginx的目录,我安装的目录是:/usr/local/nginx/sbin
1.查看nginx的版本号
./nginx -v
2.启动nginx
./nginx
3.关闭nginx
./nginx -s stop
4.重新加载nginx
配置文件更改之后,需要重新加载
./nginx -s reload
3.nginx的配置文件
我安装的位置:/usr/local/nginx/conf/nginx.conf
组成:由三部分组成:全局块、events块、http块
第一部分:全局块
从头开始,到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令。
主要包括:
1.配置运行nginx服务器的用户
2.允许生成的worker process数
3.进程PID存放路径
4.日志存放路径和类型
5.配置文件的引入
比如:worker_processes 1;
worker_processes值越大,可以支持的并发处理量也越多
第二部分:events块
events块涉及的指令主要影响nginx服务器与用户的网络连接
比如:worker_connections 1024;
支持的最大连接数
第三部分:http块
这是nginx服务器配置最频繁的部分
代理、缓存和日志定义等绝大部分功能和第三方模块的配置都在这里
http块中包括http全局块、server块
http全局块
此块配置的指令包括:
文件引入
MIME-TYPE定义
日志自定义
连接超过时间
单链接请求数上限等
server块
此块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机完全一样,该技术的产生是为了节省互联网服务器硬件成本。
每个http块可以包含多个server块,而每个server块就对应于一个虚拟主机。
server块又可分为全局server块,location块
server块中可以同时包含多个location块
全局server块
最常见的配置是对应虚拟主机的监听配置和对应虚拟主机的名称或IP配置
location块
一个server块中可以有多个location块
第三章 nginx配置实例1-反向代理
1.反向代理实例1:
1.实现效果
打开浏览器,在浏览器地址栏输入地址,跳转linux系统tomcat主页面
2.准备工作
1.nginx安装
2.安装tomcat,默认端口8080
1.去官网下载压缩包,以tar.gz结尾
2.上传到云服务器上
3.tar -zxvf 解压
4.进入到解压后的文件夹中,再进入bin目录下
5.使用./startup.sh启动tomcat
6.使用如下命令查看日志
tail -f catalina.out
3.对外开放8080端口(云服务器需要进入云服务器控制台,添加安全组,开放8080端口)
firewall-cmd --add-port=8080/tcp --permanent
然后重启防火墙:firewall-cmd --reload
查看已经开放的端口号
firewall-cmd --list-all
4.在windows系统中通过浏览器访问tomcat服务器
3.访问过程分析
![avatar](img_nginx/4.1.png)
4.具体配置
1.在windows系统的hosts文件中,进行域名和ip对应的关系的配置
hosts文件路径:C:/Windows/System32/drivers/etc/hosts
在文件末尾添加如下格式内容
ip地址 域名 # ip地址和域名之间有空格
2.在nginx进行请求转发的配置(反向代理)
1.将server块中的server_name更改成服务器的ip地址
2.在server块的location块添加proxy_pass代码
比如:proxy_pass http://127.0.0.1:8080;
意思即:将发给该location的请求转发给http://127.0.0.1:8080
2.反向代理实例2(云服务器上实验失败,虚拟机上实验成功)
1.实现效果
使用nginx反向代理,根据访问的路径跳转到不同的端口服务中
2.准备工作
1.准备两个tomcat服务器,一个8080端口,一个8081端口
准备两个文件夹,文件夹里面的内容就是tomcat的内容
进入配置文件中,更改占用的端口为8081
配置文件名为:tomcat/conf/server.xml
将connector port改为8081,其他端口改成未被占用的端口号即可
2.准备测试页面
3.具体配置
1.找到nginx配置文件,进行反向代理配置
2.开放端口
3.反向代理过程分析
比如nginx.conf有如下配置
server {
listen 80;
server_name 192.168.6.11;
location / {
root html;
index index.html index.htm;
}
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
127.0.0.1:8080 和 127.0.0.1:8081上面各自运行着一个tomcat
8080上的tomcat的webapps中有文件edu/a.html
8081上的tomcat的webapps中有文件vod/b.html
现在如果访问192.168.6.11/edu/a.html,nginx处理过程如下
1.80端口受到请求/edu/a.html
2.将请求/edu/a.html转发给http://127.0.0.1:8080
3.实际上访问的是http://127.0.0.1:8080/edu/a.html
现在如果访问192.168.6.11/vod/b.html,nginx处理过程如下
1.80端口受到请求/vod/b.html
2.将请求/vod/b.html转发给http://127.0.0.1:8081
3.实际上访问的是http://127.0.0.1:8081/vod/b.html
4.location指令说明
如有需要,自行查找百度
详解Nginx location 匹配规则
第四章 nginx配置实例2-负载均衡
1.实现效果
在浏览器地址栏中输入http://192.168.6.11/edu/a.html,实现既访问8080端口又访问8081端口
2.准备工作
1.准备两台tomcat服务器,一台8080,一台8081
2.在两台tomcat的webapps目录中,创建名称为edu的文件夹,在文件夹中创建页面a.html
但是8080中的a.html的内容是8080
8081中的a.html的内容是8081
3.在nginx的配置文件中进行负载均衡的配置
1.在http块中添加
upstream myserver{
server 192.168.6.11:8080;
server 192.168.6.11:8081;
}
2.将location中的proxy_pass改为:http://myserver;
3.nginx提供的负载均衡的分配方式
1.轮询(默认)
每个请求按时间顺序注意分配到不同的后端服务器
如果后端服务器down掉,能自动剔除
2.weight
weight代表权重,默认为1,权重越高被分配的客户端越多
3.ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
直接在upstream块中加上 ip_hash;
4.fair(第三方)
按后端服务器的响应事件来分配请求,响应事件短的优先分配
直接在upstream块中加上 fair;
第五章 nginx配置实例3-动静分离
1.动静分离的概念
nginx的动静分离简单来说就是把动态请求和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。
严格意义上说应该是动态请求和静态请求分离,可以理解成使用nginx处理静态页面,tomcat处理动态页面
动静分离从目前的实现角度来讲大致分成两种
1.纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
2.动态文件和静态文件混合在一起发布,通过nginx来分来
下图就是第一种方案
2.准备工作
1.准备静态资源(nginx本身作为静态资源服务器,通过nginx转发动态请求实现动静分离)
2.具体配置
除了用户目录之外的其他目录,只有root用户才有权限的,进行修改的时候需要用root用户的身份
root可以访问其他用户的home目录,并且进行修改
3.具体配置实例
location /www/ {
root /root/src/data/;
index index.html index.htm;
}
location /image/ {
root /root/src/data/;
autoindex on;
}
第六章 nginx配置高可用集群(这里没有动手做实验,参考意义不大)
1.什么是nginx高可用?
当nginx服务器宕机了,请求无法实现
将nginx配置成高可用,可以防止nginx宕机
主服务器:MASTER
从服务器:BACKUP
有一台主nginx、一台备份nginx,当主服务器挂掉的时候,就会自动地切换到备份服务器
让备份服务器作为主服务器进行访问,这样就可以保证高可用效果。
需要使用到keepalived软件
还需要虚拟ip
2.配置高可用的准备工作
1.需要两台服务器(两台虚拟主机)
2.在两台服务器安装nginx
3.在两台服务器上安装keepalived
使用yum命令安装
yum install keepalived -y
做主从的nginx配置需要修改
/etc/keepalived/keepalived.conf
4.完成高可用的配置(主从配置)
主要是修改keepalived.conf,不用修改nginx.conf
1.主服务器配置
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 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将MASTER 改为BACKUP
interface ens33 //网卡名称
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.17.50 // VRRP H虛拟ip地址
}
}
2.在/usr/local/src中添加检测脚本nginx_check.sh
该脚本的作用是:检测nginx是否还活着
检测脚本的内容如下:
#! /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
4.启动keepalived
systemctl start keepalived.service
keepalived的停止命令
systemctl stop keepalived.service
2.从服务器配置
1.与主服务器的keepalived.conf基本类似
要更改的地方是:vrrp _instance VI_1中的一些属性改成如下
state BACKUP
priority 90
2.在/usr/local/src中添加检测脚本nginx_check.sh
与主服务器的nginx_check.sh脚本一样
5.最终测试
1.先使用虚拟ip访问主服务器
2.将主服务器的nginx和keepalived关闭
3.使用虚拟ip访问从服务器
第七章 nginx原理
1.master和worker
2、worker如何进行工作的
采用争抢式的方式进行工作
3.一个master和多个worker的好处
1.可以使用nginx -s reload热部署。
2.对于每一个worker都是独立的进程,不需要加锁
有worker挂掉了,nginx依然可以正常进行
降低服务器的风险
4.设置多少个woker合适
nginx和redis都是采用io多路复用机制,每一个worker都是一个独立的进程
但是每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不在华夏
每个worker的线程可以把一个cpu的性能发挥到极致
所以:【worker数和服务器的CPU数相等最为适宜】
设少了会浪费CPU,设多了会造成CPU频繁切换上下文带来的损耗
设置worker数的方法(不清楚,需要用的时候查百度)
# 设置worker数量
worker.processes 4
# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000
# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000
5.连接数worker_ connection
1.问题一:发送请求,占用了worker的几个连接数?
答案:2或4个
访问静态资源需要两个连接数
当需要tomcat访问动态资源的时候,需要4个连接数
2.问题二:已知:nginx有一个master,有4个worker,每个worker支持最大连接数1024,问:支持的最大并发数是多少?
普通的静态访问最大并发数是: worker connections * worker processes /2,
而如果是HTTP作为反向代理来说,最大并发数量应该是worker connections * worker processes/4