部署nginx项目集群

架构

创建两个项目服务器

如架构图所示,我们需要两台运行项目的容器

首先我们需要创建一个可以用来运行我们项目的容器,从图上可以看出这个容器需要连接数据库主服务器和从服务器的负载均衡,所以在创建容器时需要使用 –link 连接到两个容器。
因为要运行 PHP 的代码所以我们需要使用 php:7.2-fpm-alpine 这个镜像来创建容器:

1
docker run --name xxxx1 -d --link mysql13306:mysqlwrite --link haproxy:mysqlread php:7.2-fpm-alpine

安装PHP扩展

PHP 官方默认的镜像中必要运行 PHP 项目必须要的扩展:如 GD 、pdo_mysql 等,所以我们在创建了容器之后需要进入容器中去,为 PHP 添加扩展。

1、进入刚创建的容器中

1
docker exec -it xxxx1 /bin/sh

2、设置国内仓库
为了安装的更快,首先先执行以下三个命令来设置使用国内的包管理源:

1
2
3
echo http://mirrors.ustc.edu.cn/alpine/v3.8/main > /etc/apk/repositories
echo http://mirrors.ustc.edu.cn/alpine/v3.8/community >> /etc/apk/repositories
apk update && apk upgrade

3、安装 gd 扩展

通过查看 PHP 的镜像文档,我们找到安装扩展可以使用 docker-php-ext-install 这个命令,有了这个命令可以大大简化我们安装扩展的步骤。

安装 gd 扩展时首先要安装 libpng 这个包,否则会安装失败。

1
2
apk add libpng-dev          # 安装 libpng-dev 这个包
docker-php-ext-install gd # 安装 gd 扩展

4、安装 pdo_mysql 扩展

接下来再安装 pdo_mysql 这个扩展,否则 pdo 无法操作 mysql 数据库:

1
docker-php-ext-install pdo_mysql

到此安装扩展完成。

复制代码到容器

安装好了扩展之后,运行我们 API 项目的基本环境就准备好了,接下来我们需要把 API 项目的代码复制到这个容器中。

主机上 执行下面命令复制项目代码到容器:

1
docker cp 主机项目目录    xxxx:/var/www/html

复制完代码之后,我们还需要设置项目中 storage 目录的权限,因为 Laravel 框架的项目要求 storage 目录必须要有写权限才能运行,而在 Linux 系统下默认是没有写权限的,所以复制完项目到容器之后,为项目分配写权限。

进入容器,然后执行

1
chmod -R 777 /var/www/html

修改配置文件

项目代码复制到容器中之后,我们还需要修改项目的配置文件,主要修改数据库的配置(如果用到了 Redis 也需要修改 Redis 的配置,因为这里没有考虑 Redis ,所以先不考虑)。

使用 vi 编辑器修改 config/database.php 修改数据库的主机为创建容器时 –link 进来的别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
'mysql' => [                                                           
'read' => [
'host'=> 'mysqlread', # MySQL 主服务器的别名
],
'write' => [
'host'=> 'mysqlwrite', # MySQL 从服务器负载均衡的别名
],
'driver' => 'mysql',
// 'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => '123123',
// 'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
],

到此项目的容器就制作好了,容器中的项目已经可以正常运行起来了。

制作项目镜像

经过前面的几个操作我们就已经制作了一个可以运行PHP项目的容器,接下来,我们可以把我们制作好的容器保存成为一个镜像,这样当我们需要再创建更多相同的容器时,就可以直接使用镜像创建就可以了。

制作镜像常用两种方法:docker commit 指令 和 Dockerfile 文件。这里我们使用 docker commit 这个指令来制作镜像。docker exec 可以把一个现有的容器制作成为一个镜像,语法:

1
docker commit 容器名称 镜像名:标签名

所以,把我们这个 API 容器制作成镜像的指令是:

1
docker commit xxxx1 xxxx:1.0

制作完之后,执行 docker images 就可以查看到制作的镜像了。

再创建一个项目容器

根据我们最前面设计架构图,我们需要有两个 API 服务器,所以我们需要再创建一个 API 项目的容器,因为我们刚刚已经制作好了镜像,所以我们直接使用这个镜像就可以创建一个相同的 API 容器了:

1
docker run --name xxxx2 -d --link mysql13306:mysqlwrite --link haproxy:mysqlread xxxx:1.0

nginx 负载均衡

有了 API 项目的容器之后,最后我们还需要创建一个 Nginx 容器,这个容器有两个用途:

1、做为 WEB 服务器让用户来访问

2、做为负载均衡服务器转发请求到后端 API 服务器

创建容器

首先,我们需要先创建一个 nginx 容器

1
docker run --name xxxx_nginx -d -p 49999:80 --link xxxx1:xxxx_gate1 --link xxxx2:xxxxgate2 nginx:1.15.6-alpine

配置 nginx

创建了容器之后,我们需要配置 nginx 服务器。

1、进入 nginx 容器

1
docker exec -it xxxx+nginx /bin/sh

2、修改 nginx 配置文件

/etc/nginx/conf.d/default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 定义 后端服务器, api 是这一组的名字
upstream api {
# max_fails=3:允许失败3 次,第4次再失败就不再向这台服务器转发(健康检查)
# fail_timeout:设置连接超时时间
# weight=1:设置转发的权重
server xxxx_gate1:9000 max_fails=3 fail_timeout=3s weight=1;
server xxxx_gate2:9000 max_fails=3 fail_timeout=3s weight=1;
}

server {
...
location / {
try_files $uri $uri/ /index.php?$query_string; # Laravel 框架需要添加这一项进行 url 重写,否则无法运行
}
...
location ~ \.php$ {
fastcgi_pass api; # 要转发的后端服务器组
fastcgi_index index.php;
# 指定 API 服务器上项目所在目录,注意要指定到 public 目录下(laravel框架public是根目录)
fastcgi_param SCRIPT_FILENAME /var/www/html/项目目录名称/public$fastcgi_script_name;
include fastcgi_params;
}
...
}

3、重启服务器

修改了配置文件之后,退出容器,重新启动相关的几个容器,然后在浏览器中访问

1
http://localhost:49999

即可访问网站了。
至此我们就把项目部署成集群的架构了。

[mark] (参考自我的上课讲义) 未完待续!


 评论


本站使用 Material X 作为主题 , 总访问量为 次 。
隐藏