目录
Nginx(发音为 "engine x")是一个开源的、高性能的 HTTP 服务器和反向代理服务器。它也可以作为一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由 Igor Sysoev 开发的,最初是为了解决 C10K 问题(即如何处理一万个并发连接的问题)。现在,Nginx 已经成为了一种非常流行的 Web 服务器软件。
Nginx因其简洁、高效和可靠的特点而备受欢迎。相比传统的Apache服务器,Nginx使用更少的系统资源,可以处理更多的并发连接。它采用事件驱动的异步架构,能够有效地处理高并发请求和大量的并行连接。
以下是 Nginx 的一些主要特性:
处理静态文件、索引文件以及自动索引:Nginx 可以非常高效地处理静态文件,并支持索引文件和自动索引。
反向代理与负载均衡:Nginx 可以作为反向代理服务器,将来自客户端的请求转发到后端的服务器,并将后端服务器的响应返回给客户端。此外,Nginx 还支持多种负载均衡算法。
FastCGI、uWSGI、SCGI、memcached 支持:Nginx 可以与这些常见的网络协议进行交互,以处理动态内容。
SSL 和 TLS 支持:Nginx 支持 SSL 和 TLS 协议,可以为网站提供安全的 HTTPS 连接。
模块化设计:Nginx 有许多可选的模块,可以根据需要添加或删除,以满足特定的需求。
配置文件热部署:Nginx 支持在不中断服务的情况下更改配置文件并使其生效。
带宽控制:Nginx 允许限制连接和请求的速度,以防止带宽被过度使用。
在 Linux 中使用 Nginx 部署项目有许多优势,以下是一些主要的:
高性能和高并发:Nginx 是一个高性能的反向代理服务器和邮件代理服务器。它可以处理大量的并发连接,这使得它在处理高流量的网站时表现出色。
稳定性:Nginx 在各种网络环境下都能提供稳定的服务。它的稳定性和可靠性使得许多大型网站选择使用它作为其主要的 Web 服务器。
灵活性:Nginx 提供了丰富的模块和功能,可以满足各种复杂的 Web 应用需求。例如,它可以作为负载均衡器,可以处理静态文件,也可以处理动态内容。
易于配置:Nginx 的配置文件结构清晰,易于理解和修改。这使得管理和维护 Nginx 服务器变得更加简单。
资源占用少:Nginx 在处理大量并发连接时,CPU 和内存的占用相对较少,这使得它在资源有限的环境中也能提供良好的性能。
开源和免费:Nginx 是开源的,这意味着您可以免费使用它,并且可以查看和修改其源代码。这为定制和优化 Nginx 提供了可能。
良好的社区支持:Nginx 有一个活跃的开发和用户社区,您可以从中获取帮助和支持,也可以分享您的经验和知识。
Nginx 的工作原理主要基于事件驱动和异步非阻塞的设计模型。这种设计使得 Nginx 能够在处理大量并发连接时,保持高效和稳定。以下是 Nginx 工作原理的一些关键点:
Master-Worker 架构:Nginx 采用 Master-Worker 的架构模式。Master 进程主要负责读取和验证配置文件,管理 Worker 进程。Worker 进程则负责处理实际的请求。每个 Worker 进程都是独立的,它们之间不共享状态,也不进行直接的通信。
事件驱动:Nginx 的 Worker 进程是事件驱动的。当一个新的连接请求到来时,Worker 进程会接收到一个事件通知。然后,Worker 进程会处理这个请求,生成响应,并将响应发送回客户端。在这个过程中,Worker 进程不会被阻塞,可以同时处理多个请求。
异步非阻塞 I/O:Nginx 使用异步非阻塞的 I/O 操作。这意味着,当一个 Worker 进程在等待 I/O 操作完成时,它可以去处理其他的请求。这样,Worker 进程就不会因为等待 I/O 操作而被阻塞,可以更高效地利用 CPU。
负载均衡:Nginx 可以作为反向代理服务器,将来自客户端的请求分发到后端的服务器。Nginx 支持多种负载均衡算法,如轮询、最少连接、IP 哈希等。
静态内容处理:对于静态内容,Nginx 可以直接从文件系统中读取文件,并将文件内容作为响应发送给客户端。
动态内容处理:对于动态内容,Nginx 通常会与后端的应用服务器(如 PHP-FPM、uWSGI 等)配合使用。Nginx 将请求转发给应用服务器,由应用服务器生成动态内容,然后 Nginx 再将这些内容作为响应发送给客户端。
首先创建一个目录
命令:
mkdir -p /mode/mysql/{conf,data} ?
在root中创建一个存放MySQL的文件夹mysql中有conf存放配置文件,
还在mysql中有data存放数据的。
在将配置文件从主机拖到conf文件中:
为了让我们的容器之间可以相互访问,所以我们创建一个网络,名称为:mode
172.18.0.0为指定IP,其中mode为网络名称。
docker network create --subnet 172.18.0.0/16 --gateway 172.18.1.1 mode
创建一个mysql容器并且为它指定我们的自定义网络(mode)
docker run \ --name m1 \ -v /mode/mysql/conf/my.cnf:/etc/my.cnf \ -v /mode/mysql/data:/var/lib/mysql \ --privileged=true \ -e MYSQL_ROOT_PASSWORD=123456 \ --net mode \ --ip 172.18.0.100 \ -d mysql/mysql-server:5.7
其中的ip需要跟上面创建的自定义网络前缀相同:172.18,在这之后可以修改,不可超过255
进入我们创建的mysql容器进行登录
进入:
docker exec -it m1 bash
m1 是需要进入哪个容器的名称
登入mysql:
mysql -uroot -p
输入我们在创建是设置的密码即可登入,也就是123456
在进行用户的授权并且设置密码:
grant all on *.* to root@'%' identified by '123456';
其中root为用户名称,123456为用户的密码。
在MySQL创建我们所需要存放数据表的数据库
创建数据库:
create database shop;
shop为创建数据库
使用创建号的数据库:
use shop;
在我们创建数据的data目录中存放sql脚本,将使用目录挂载后容器也会有这个脚本,在主机中将脚本拖入即可(/mode/mysql/data):
之后执行命令,将脚本在MySQL中执行,容器与虚拟机对应的目录:
执行命令:
source /var/lib/mysql/book.sql;
?
查看数据表:
show tables;
之后退出:
exit;
退出后需要重启容器:
docker restart m1
我们需要达到Nginx负载均衡,就不只是一个容器,所以可以创建一个镜像来创建tomcat容器
编辑并且创建Dockerfile文件,用于创建镜像的配置
命令:
vim Dockerfile
进行以下编辑:
#1.指定基础镜像,并且必须是第一条指令 FROM openjdk #2.指明该镜像的作者和其电子邮件 MAINTAINER CloudJun "jun737x@163.com" #3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录 WORKDIR /project #4.将文件从Docker主机将jdk及jar包复制到Docker镜像中 COPY spring.jar /project #5.容器启动时,需要执行的命令(执行jar包) CMD java -jar spring.jar --mysql.addr=m1
将名为spring.jar的配置IP配置为m1容器的IP
?
i 进行编辑 ,编辑完成按Esc,并且输入:wq进行保存并且退出。
有相同名称及版本的镜像可以进行删除或者创建不同名称及版本的镜像
删除:
docker rmi spring:v1
我这里是进行删除,之后再创建:
docker build -t spring:v1 .
?
根据我们创建的镜像来创建容器,并且分别配置不同的IP
docker run -itd --name s1 --net mode --ip 172.18.0.101 spring:v1 docker run -itd --name s2 --net mode --ip 172.18.0.102 spring:v1 docker run -itd --name s3 --net mode --ip 172.18.0.103 spring:v1
这里创建了三个容器,分别是s1,s2,s3,IP分别:18.0.101,18.0.102,18.0.103
?
可以通过查看日志看是否启动成功
?查看日志:
docker logs s1
s1 为容器名称,需要查看哪个容器日志就修改为哪个容器即可
可以先进行访问,看是否可以访问到数据,在主机上进行数据访问:
首先创建nginx的配置文件目录并将配置文件放入
mkdir -p /soft/nginx/conf.d
将配置文件放讲其中,通过目录挂载的方式进行到容器中去
default.conf:
#服务器的集群 upstream tomcatList { server 172.18.0.101:8080 weight=1; server 172.18.0.102:8080 weight=1; server 172.18.0.103:8080 weight=1; } server { listen 80; server_name www.zkingedu.com; location / { root /etc/nginx/html/; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~^/api/ { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://tomcatList; proxy_redirect default; } }
其中配置tomcat集群,将tomcat容器的IP集群,并且对应创建过的tomcat容器IP
在将这个项目中的静态文件放入其中
之后根据自定义的网络来创建nginx容器
命令:
docker run -itd \ --name n1 \ -v /soft/nginx/conf.d:/etc/nginx/conf.d \ -v /soft/nginx/html:/etc/nginx/html/ \ -p 80:80 \ --net mode \ --ip 172.18.0.104 \ nginx
n1 为容器名称,mode 为自定义网络
之后在主机只访问虚拟机的IP:
在 Linux 中使用 Docker 安装 Nginx 并部署前后端分离的项目,您可能会有以下几个方面的收获:
掌握 Docker 的基本使用:Docker 是一种流行的容器技术,可以让开发者在一个隔离的环境中运行应用,避免了因为环境问题导致的“在我机器上可以运行”的问题。通过这个过程,您可能已经学会了如何使用 Docker 来创建和管理容器。
理解容器化的优势:与传统的虚拟机相比,容器有许多优势,例如启动快、资源占用少、易于迁移等。通过实际使用 Docker,您可能对这些优势有了更深入的理解。
熟悉 Nginx 的配置和使用:Nginx 是一个强大的 Web 服务器和反向代理服务器,通过在 Docker 中部署 Nginx,您可能已经熟悉了 Nginx 的配置和使用。
了解前后端分离的部署方式:前后端分离是现代 Web 开发的一种常见架构,通过在 Docker 中部署前后端分离的项目,您可能对这种部署方式有了更深入的理解。
提升 Linux 操作技能:在 Linux 中使用 Docker 和 Nginx,无疑会让您对 Linux 的命令行操作更加熟练,这对于任何想要深入了解和使用 Linux 的人来说都是非常有价值的技能。