项目部署 Nginx+Docker

文章目录

  • Nginx
    • Nginx简介
      • 基本操作
      • 配置解析
      • 进阶实践:root和alias区别
      • 反向代理
        • 配置介绍
    • 负载均衡
      • 后端状态
      • 调度算法
      • nginx 日志
    • Doker
      • 基本知识
      • Docker安装
      • 镜像管理
        • 操作命令
        • 重命名、删除
      • 容器管理
        • 基本命令
        • 基于容器创建镜像
        • 容器运行日志和详细信息
      • 数据管理
      • 网络管理

Nginx

Nginx简介

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

apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev
apt-get install nginx -y

② 检查效果

netstat -tnulp | grep nginx

③ 服务器相关命令

# 启动、停止、重启
systemctl start|stop|reload| ... nginx

# 软件信息查看
nginx -V
nginx -v

# 配置文件检查
nginx -t
  • 角色:Web服务器/反向代理服务器/缓存服务器/邮件代理服务器
  • 特点:高并发、简单稳定、模块化、低成本

配置解析

工作目录:/etc/nginx
执行文件:/user/sbin/nginx
日志文件:/var/log/nginx
web目录:/var/www/html/ 首页文件是index.nginx-debian.html
        /usr/share/nginx/html/ 首页文件是index.html

配置文件结构:
项目部署 Nginx+Docker_第1张图片
访问原理:
项目部署 Nginx+Docker_第2张图片
server 配置段
配置样式:

server {
    listen :;
    server_name <主机域名>;
    ...
}

① listen 属性
作用:指定server监听的ip和port,当ip和port匹配的时候才进行下一步匹配
项目部署 Nginx+Docker_第3张图片
② server_name 属性
作用:指定server的虚拟域名,当域名匹配时才进行下一步操作
在这里插入图片描述
③ root属性

作用:指定客户端请求的html文件所在目录路径

默认:root /var/www/html;

④ index属性

作用:指定客户端请求时默认返回的文件

默认:index index.html index.htm index.nginx-debian.html;
5. location 配置段
作用:location 主要是根据server匹配到的请求路径去处理和响应

location optional_modifier location_match {
    # 执行操作...
}

① 匹配规则
项目部署 Nginx+Docker_第4张图片

② 匹配优先级


样例配置:
进入/etc/nginx/conf.d目录下,并创建server.conf配置文件

# vi server.conf
server {
     
    listen 80;
    server_name www.a.com;

    root /var/www/html/a/;
    index index.html;

    location / {
     
        try_files $uri $uri/ =404;
    }   
}

server {
     
    listen 80;
    server_name *.b.com;

    root /var/www/html/b/;
    index index.html;

    location / {
     
        try_files $uri $uri/ =404;
    }   
}

server {
     
    listen 80;
    server_name www.c.*;

    root /var/www/html/c/;
    index index.html;

    location / {
     
        try_files $uri $uri/ =404;
    }   
}

进阶实践:root和alias区别

root和alias所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别:

root:表示location匹配内容的相对路径
alias:表示一个绝对路径,而且必须以"/"结尾
```bash

示例:

```bash
效果一:                                         效果二:
location /txt/ {
                                    location /txt/ {
     
    alias /var/www/txt/;                            root /var/www/txt/;
}                                              }

结果:

效果一:访问http://localhost/txt/1.txt,nginx找/var/www/txt/1.txt文件
效果二:访问http://localhost/txt/1.txt,nginx找/var/www/txt/txt/1.txt文件

反向代理

代理:设定一个中间人,客户端发起的请求,交给中间人去处理
项目部署 Nginx+Docker_第5张图片
区别:

① 从用途上来讲

正向代理:为局域网客户端向外访问Internet服务,可以使用缓冲特性减少网络使用率。
反向代理:为局域网服务器向外提供Internet服务,可以使用负载平衡提高客户访问量,还可以基于高级URL策略和管理技术对服务进行高质量管控。
② 从用途上来讲

正向代理:必须采取安全措施确保内网客户端通过它访问外部网站,隐藏客户端的身份。
反向代理:对外提供服务是透明的,客户端并不知道自己访问的是一个代理,隐藏服务端的身份。

配置介绍

① 配置示例

location / {
     
  # 设定请求转发的目的地址,可以使用hostname:port或ip:port形式
  proxy_pass        http://localhost:8000;
}

② 属性详解
proxy_pass指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式

③ uwsgi模块

nginx善于做静态文件相关的代理,而不擅长动态相关的代理,所以nginx的uwsgi模块就出现了,它主要做动态相关的代理工作

location / {
     
  include uwsgi_params;
  # uwsgi_pass ip:port 或 uwsgi_pass hostname:port
  uwsgi_pass ip:port;
}

负载均衡

负载均衡是什么?

我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?

解决方法就是:负载均衡

负载均衡简单说来人多力量大,打群架。

在nginx中的负载均衡主要有两种:四层负载(ip:port)、七层负载(http://xxx)

① 配置示例

upstream backends  {
     
  server [域名|ip]:port;
  server [域名|ip]:port;
  server [域名|ip]:port;
  ...
}

server {
     
  location / {
     
    proxy_pass  http://backends;
  }
}

② 属性详解

upstream:主要是定义一个后端服务地址的集合列表,每个后端服务使用一个server命令表示

upstream {} 和 server {} 两部分内容属于平级关系。
uwsgi.ini 配置文件

# vi meiduo_mall_02/uwsgi.ini
[uwsgi]
# 使用Nginx连接时使用,Django程序所在服务器地址
socket=0.0.0.0:8002
# 项目目录
# chdir=项目路径/meiduo/meiduo_mall_02
chdir=/data/meiduo/meiduo_mall_02
# 项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=meiduo_mall/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件
daemonize=uwsgi.log
# 指定依赖的虚拟环境
virtualenv=/root/.virtualenvs/meiduo

进入uwsgi.ini 启动服务

cd meiduo_mall_02/
uwsgi --ini uwsgi.ini

基本配置:

# vim /etc/nginx/conf.d/upstream.conf
upstream backends {
     
  server 192.168.19.130:10086;
  server 192.168.19.130:10087;
  server 192.168.19.130:10088;
}
server {
     
  listen 8080;

  location / {
     
    proxy_pass http://backends;
  }
}

后端状态

在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服务故障或其性能瓶颈等信息

② 基本配置

# cat /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

日志配置格式:

属性名称:access_log
存储位置:/var/log/nginx/access.log
日志格式:位置为空表示使用默认的combined日志格式,日志格式是通过log_format设置的

默认日志格式:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

Doker

基本知识

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 安装过程
① 使用阿里云的安装源

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update

② 安装依赖软件

apt-get install apt-transport-https ca-certificates curl software-properties-common -y

③ 安装docker软件

# 安装docker
apt-get install docker-ce -y
# 查看支持的docker版本
apt-cache madison docker-ce
# 注:可以指定版本安装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)搜索镜像

docker search [image_name]

2) 获取镜像

docker pull [iamge_name]

3)查看本地镜像

docker images

镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息。
4)查看镜像历史

docker history [image_name]

重命名、删除

1)镜像重命名

docker tag [old_image]:[old_version] [new_imge]:[new_version]
docker tag ubuntu:latest tyrone-ubuntu:v1.0

2)删除镜像

docker rmi [image_id]
docker rmi [image_name:image_version]

3)导出、导入
1)导出镜像
将已经下载好的镜像,导出到本地,以备后用

docker save -o [包文件] [镜像]
docker save -o ubuntu.tar ubuntu:latest

2)导入镜像

docker load < [image.tar_name]
docker load < ubuntu.tar

容器管理

基本命令

1)查看容器

docker ps  # 显示正在运行的容器
docker ps -a  # 显示所有容器

2)创建容器

docker run <参数,可选> [docker_image] [执行的命令]
# 创建并进入容器
docker run -it --name=myubuntu ubuntu:latest /bin/bash

启动命令参数详解:

  • –name:给容器指定一个名称
  • -i:让容器的标准输入保持打开
  • -t:让docker分配一个伪终端,并绑定到容器的标准输入上
  • /bin/bash:容器其中时执行一个命令
    3)停止、启动容器
# 启动容器
docker start [container_id]
docer start [container_name]

# 关闭容器
docker stop [container_id]
docker stop [container_name]

4)进入正在运行的容器

docker exec -it [container_name] /bin/bash
docker exec -it [container_id] /bin/bash

docker exec -it myubuntu /bin/bash

5)删除容器

# 删除已经关闭的容器
docker rm [container_id]
docker rm [container_name]
# 删除正在运行的容器
docker rm -f [container_id]
docker rm -f [container_name]

基于容器创建镜像

docker commit -m '说明信息' -a '作者信息' [container_id] [new_image:tag]
docker commit -m [container_name] [new_image:tag]

docker commit -m 'redis' -a 'tyrone' redis myredis:v1.0

容器运行日志和详细信息

1)容器运行过程中产生的日志

docker logs [container_id]
或
docker logs [container_name]
docker logs redis | more

2)查看容器信息

docker inspect [container_id]
或
docker inspect [container_name]

数据管理

在容器运行过程中,可能会产生一些数据,当容器被停止,重启或者删除时,容器中的这些数据就会丢失,若想要将这些数据持久化保存,就需要用到数据卷和数据卷容器

  • 数据卷
    将宿主机的某个文件或目录,映射到容器中,作为数存储的目录或者文件,那么我们就可以在宿主机进行数据的存储
    -v:参数的作用是将宿主机的一个目录或文件(绝对路径)作为容器的数据卷挂载到docker容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,docker也会自动创建。
    命令格式:
docker run -itd --name <容器名> -v <宿主机目录>:<容器目录> <镜像名称> <命令(可选)>
docker run -itd --name test1 -v /tmp:/test1 nginx
  • 数据卷容器
    项目部署 Nginx+Docker_第6张图片
# 创建数据卷容器
docker create -v <宿主机目录|文件>:<容器目录|文件> --name <容器名> <镜像名称> <命令(可选)>
# 挂载数据卷容器
docker run --volumes-from <数据卷容器id/name> -itd --name <容器名字> <镜像名称> <命令(可选)>

步骤:
创建一个 vc-test 数据卷容器

docker create -v /tmp:/data --name nginx

创建两个容器 vc-test1 和 vc-test,同时挂载vc-test 数据卷容器

#  创建 vc-test1 容器
docker run --volumes-from vc_test -itd --name vc-test1 nginx

网络管理

默认情况下,容器和宿主机之间的网络是隔离的,为了让容器使用网络,我们可以采用两种方式:端口映射和网络模式

  • 端口映射
    可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。可以通过ip:port
    ② 端口映射种类

随机映射
指定映射
注意:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突,不管哪种映射都会影响性能,因为涉及到映射。

③ 端口映射命令

-P:随机端口映射
-p <宿主机ip>:<宿主机port>:<容器port>:指定端口映射

随机映射:

docker run -d --name nginx-1 nginx

指定映射:

docker run -d -p <宿主机ip>:<宿主机端口>:<容器端口> --name <容器名字> <镜像名称>
# 利用 nginx 镜像创建 nginx-2 容器,并将宿主机的 1199 端口映射给容器中的 80 端口
docker run -d -p 1199:80 --name nginx-2 nginx

多端口映射:

你可能感兴趣的:(python_web项目,docker,nginx,linux)