Nginx(发音同engine x)是一款基于异步框架的轻量级/高性能的Web服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。
特点
优点:
① 高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应
② 内存消耗少:善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源
③ 简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定
④ 模块化程度高:功能模块插件化设计,可以自由配置相应的功能
⑤ 低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低
缺点:
① 动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺
项目定位:静态文件展示、动静分离
基本操作
① 安装Nginx
② 检查效果
③ 服务器相关命令
- 角色:Web服务器/反向代理服务器/缓存服务器/邮件代理服务器
- 特点:高并发、简单稳定、模块化、低成本
配置解析
作用:指定客户端请求的html文件所在目录路径
默认:root /var/www/html;
④ index属性
作用:指定客户端请求时默认返回的文件
默认:index index.html index.htm index.nginx-debian.html;
5. location 配置段
作用:location 主要是根据server匹配到的请求路径去处理和响应
② 匹配优先级
优
样例配置:
进入/etc/nginx/conf.d目录下,并创建server.conf配置文件
进阶实践:root和alias区别
root和alias所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别:
结果:
反向代理
① 从用途上来讲
正向代理:为局域网客户端向外访问Internet服务,可以使用缓冲特性减少网络使用率。
反向代理:为局域网服务器向外提供Internet服务,可以使用负载平衡提高客户访问量,还可以基于高级URL策略和管理技术对服务进行高质量管控。
② 从用途上来讲
正向代理:必须采取安全措施确保内网客户端通过它访问外部网站,隐藏客户端的身份。
反向代理:对外提供服务是透明的,客户端并不知道自己访问的是一个代理,隐藏服务端的身份。
配置介绍
① 配置示例
② 属性详解
proxy_pass指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式
③ uwsgi模块
nginx善于做静态文件相关的代理,而不擅长动态相关的代理,所以nginx的uwsgi模块就出现了,它主要做动态相关的代理工作
负载均衡是什么?
我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?
解决方法就是:负载均衡
负载均衡简单说来人多力量大,打群架。
在nginx中的负载均衡主要有两种:四层负载(ip:port)、七层负载(http://xxx)
① 配置示例
② 属性详解
upstream:主要是定义一个后端服务地址的集合列表,每个后端服务使用一个server命令表示
upstream {} 和 server {} 两部分内容属于平级关系。
uwsgi.ini 配置文件
进入uwsgi.ini 启动服务
基本配置:
后端状态
在upstream模块中,可以使用server命令指定后端服务器的地址,同时还可以设置后端服务器在负载均衡调度中的状态,常用的状态有以下几种:
down:表示当前server主机暂时不参与负载均衡。
backup:后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器。
max_fails:允许请求的最大失败数,默认为1,配合fail_timeout一起使用
fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为10s。
调度算法
官方资料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example
Nginx提供的负载均衡策略有两大类:
内置策略:nginx自带的算法
雨露均沾型:轮训、加权轮训、哈希
定向服务型:ip_hash、least_conn、cookie、route、lean
商业类型:ntlm、least_time、queue、stick
扩展策略:各种结合业务场景自定义的算法或者第三方算法
自定义算法
第三方算法:fair、url_hash
常用算法简介:
轮询(默认):请求按顺序逐一分配到不同的后端服务器。
weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
ip_hash:按访问IP的哈希结果分配请求,分配后客户端访问固定后端服务器,有效的解决动态网页会话共享问题。
fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问URL的哈希结果分配请求,使同一URL定向到同一台后端服务器,可提高后端缓存服务器的效率。
nginx 日志
① 日志简介
nginx默认提供了两个日志文件:access.log和error.log。
access.log:可以得到用户请求的相关信息
error.log:可以获得某个web服务故障或其性能瓶颈等信息
② 基本配置
日志配置格式:
默认日志格式:
基本知识
Docker是一个开源的容器引擎,它基于LXC容器技术,使用Go语言开发。源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
简单来说:Docker就是一种快速解决业务稳定环境的一种技术手段,可以快速构建项目运行所依赖的环境。
Docker官网:http://www.docker.com
Github Docker源码:https://github.com/docker/docker
角色组成:
Docker镜像(image):它是一个只读的文件,就类似于我们安装操作系统时候需要的那个iso光盘镜像,通过运行这个镜像来完成各种应用的部署。这里的镜像就是一个能被docker运行起来的一个程序。
Docker容器(container):容器就类似于我们运行起来的一个操作系统,而且这个操作系统启动了某些服务。这里的容器指的是运行起来的一个Docker镜像。
Docker仓库(repository):仓库就类似于我们在网上搜索操作系统光盘的一个镜像站。这里的仓库指的是Docker镜像存储的地方。
Docker安装
2.1 安装过程
① 使用阿里云的安装源
② 安装依赖软件
③ 安装docker软件
apt-get install docker-ce= -y
④ 查看docker服务状态
systemctl status docker
注:ubuntu安装完毕后,默认就开启服务了
⑤ 网卡区别
安装前:只有ens33和lo网卡
安装后:docker启动后,多出来了docker0网卡,网卡地址172.17.0.1
⑥ docker服务命令
systemctl [参数] docker
参数详解:
start 开启服务
stop 关闭
restart 重启
status 状态
镜像管理
操作命令
1)搜索镜像
2) 获取镜像
3)查看本地镜像
镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息。
4)查看镜像历史
重命名、删除
1)镜像重命名
2)删除镜像
3)导出、导入
1)导出镜像
将已经下载好的镜像,导出到本地,以备后用
2)导入镜像
容器管理
基本命令
1)查看容器
2)创建容器
启动命令参数详解:
- –name:给容器指定一个名称
- -i:让容器的标准输入保持打开
- -t:让docker分配一个伪终端,并绑定到容器的标准输入上
- /bin/bash:容器其中时执行一个命令
3)停止、启动容器
4)进入正在运行的容器
5)删除容器
基于容器创建镜像
容器运行日志和详细信息
1)容器运行过程中产生的日志
2)查看容器信息
数据管理
在容器运行过程中,可能会产生一些数据,当容器被停止,重启或者删除时,容器中的这些数据就会丢失,若想要将这些数据持久化保存,就需要用到数据卷和数据卷容器
- 数据卷
将宿主机的某个文件或目录,映射到容器中,作为数存储的目录或者文件,那么我们就可以在宿主机进行数据的存储
-v:参数的作用是将宿主机的一个目录或文件(绝对路径)作为容器的数据卷挂载到docker容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,docker也会自动创建。
命令格式:
创建两个容器 vc-test1 和 vc-test,同时挂载vc-test 数据卷容器
网络管理
默认情况下,容器和宿主机之间的网络是隔离的,为了让容器使用网络,我们可以采用两种方式:端口映射和网络模式
- 端口映射
可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。可以通过ip:port
② 端口映射种类
随机映射
指定映射
注意:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,不管哪种映射都会影响性能,因为涉及到映射。
③ 端口映射命令
随机映射:
指定映射: