空城-最好的安排
docker搭建nginx服务器集群
docker搭建nginx服务器集群

环境要求:安装了docker的主机 (本文示例环境为centos7.4)

准备镜像

首先把所有需要用到的镜像拉取下来

1
2
3
4
5
6
7
8
# nginx
$ docker pull nginx

# php & php-fpm
$ docker pull php:7.1.0-fpm

# redis
$ docker pull redis

docker-compose容器编排

Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。

安装Compose

直接从github下载即可,前提要先安装Docker,版本要1.9.1以上

1
2
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

安装后确认:

1
$ docker-compose --version

https://cdn.wm07.cn/docker-compose-version.png

使用Compose启动多个Nginx容器

创建编排脚本

在 /docker/nginx 目录下创建 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '2'
services:
web1:
image: nginx
links:
- web2
- web3
- web4
ports:
- "8080:8080"
volumes:
- "/docker/nginx/web1/conf.d:/etc/nginx/conf.d"

web2:
image: nginx
volumes:
- "/docker/slb/www2:/www"
- "/docker/nginx/web2/conf.d:/etc/nginx/conf.d"

web3:
image: nginx
volumes:
- "/docker/slb/www3:/www"
- "/docker/nginx/web3/conf.d:/etc/nginx/conf.d"

web4:
image: nginx
volumes:
- "/docker/slb/www4:/www"
- "/docker/nginx/web4/conf.d:/etc/nginx/conf.d"

启动容器

1
2
3
4
5
# up:创建并启动 -d:后台运行
$ docker-compose up -d

# 查看容器
$ docker-compose ps

https://cdn.wm07.cn/docker-compose-ps.png

配置Nginx

反向代理Nginx配置

添加upstream节点,默认使用轮询方式进行负载
编辑并保存 /docker/nginx/web1/conf.d/slb.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
upstream slb {
server web2;
server web3;
server web4;
}

server {
listen 8080;
server_name 127.0.0.1;

gzip on;
location /{
root /www;
index index.html index.php;

# 反向代理的主机头
proxy_pass http://slb;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

web应用Nginx配置

编辑并保存 /docker/nginx/web2/conf.d/demo.conf (其余的web3与web4同理)

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name localhost;
gzip on;
location / {
root /www;
index index.html index.htm;
autoindex off;
}
}

标记Nginx目录

为了确定Nginx集群是否搭建成功,分别在 web2 web3 web4 的主目录放置不同的html文档
编辑并保存 /docker/nginx/slb/web2/index.html (其余的web3与web4同理)

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<!-- 不同目录写上不同的标记 -->
web2
</body>
</html>

浏览器访问 127.0.0.1:8080 并刷新
https://cdn.wm07.cn/slb-web2.png
https://cdn.wm07.cn/slb-web3.png
https://cdn.wm07.cn/slb-web4.png

至此,Nginx集群已搭建完成!

PHP环境安装

在准备镜像的时候拉了一个php:7.1.0-fpm的镜像,但为了实现session共享,解决集群之间session问题,需要在此镜像改动一下,安装redis拓展,修改php的session储存方式为redis
在 /docker/php/ 目录下创建Dockerfile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM php:7.1.0-fpm

MAINTAINER xiaowei "694623056@qq.com"

# Install php extension--redis

RUN cd /usr/local/ \
&& mkdir redis_phpext \
&& curl -o redis_phpext/redis-3.1.3.tgz http://101.96.10.64/pecl.php.net/get/redis-3.1.3.tgz \
&& cd redis_phpext \
&& tar zxvf redis-3.1.3.tgz \
&& cd redis-3.1.3 \
&& phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& rm -rf /usr/local/redis_phpext

创建自定义镜像

1
2
3
4
# 切换目录
$ cd /docker/php
# build: 创建,切记勿忽略后面的 . 意为当前目录
$ docker build -t php:add_redis .

创建完成后 docker images 查看是否成功

1
$ docker images

https://cdn.wm07.cn/add-redis-images.png

容器依赖

修改docker-compose.yml文件,添加php与redis的编排,这里已经不需要测试集群,可以把Nginx应用网站根目录统一挂载到 /docker/www

最终编排脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
version: '2'
services:
web1:
image: nginx
links:
- web2
- web3
- web4
ports:
- "8080:8080"
volumes:
- "/docker/nginx/web1/conf.d:/etc/nginx/conf.d"

web2:
image: nginx
links:
- php
volumes:
- "/docker/www:/www"
- "/docker/nginx/web2/conf.d:/etc/nginx/conf.d"

web3:
image: nginx
links:
- php
volumes:
- "/docker/www:/www"
- "/docker/nginx/web3/conf.d:/etc/nginx/conf.d"

web4:
image: nginx
links:
- php
volumes:
- "/docker/www:/www"
- "/docker/nginx/web4/conf.d:/etc/nginx/conf.d"
php:
build: /docker/php/
links:
- redis
volumes:
- "/docker/www:/www"
- "/docker/php/conf.d:/usr/local/etc/php/conf.d"

redis:
image: redis
volumes:
- "/docker/redis/data:/data"
ports:
- "6379:6379"
command : redis-server --appendonly yes

添加php配置文件

在 /docker/php/conf.d/ 目录下创建文件redis.ini

1
2
3
4
5
6
;添加redis拓展
extension = redis.so

;设置session储存方式为redis
session.save_handler = redis
session.save_path = redis:6379

修改web应用Nginx配置

将php类型文件转发给php-fpm处理,修改 web2 web3 web4 Nginx配置文件
/docker/nginx/web[2-3]/demo.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 80;
server_name localhost;
gzip on;
location / {
root /www;
index index.php index.html index.htm;
autoindex off;
}
location ~ \.php {
root /www;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}

重新编排容器

将一开始编排的集群容器停止并删除,重新创建并启动容器

1
2
3
4
5
6
# 停止
$ docker-compose stop
# 删除 需要确认 y
$ docker-compose rm
# 创建容器启动并后台运行
$ docker-compose up -d

https://cdn.wm07.cn/docker-compose-stop-rm.png

测试环境!

phpinfo

在 /docker/www 目录创建 index.php文件

1
2
<?php
echo phpinfo();

浏览器访问 127.0.0.1:8080/index.php
https://cdn.wm07.cn/docker-slb-phpinfo.png

session共享

在 /docker/www 目录创建 session.php文件

1
2
3
<?php
session_start();
echo 'SESSION_ID:'.session_id();

浏览器访问 127.0.0.1:8080/session.php 每次的session_id相同则表明已实现session共享
https://cdn.wm07.cn/docker-slb-session1.png
https://cdn.wm07.cn/docker-slb-session2.png
https://cdn.wm07.cn/docker-slb-session3.png

本文出自个人博客 最好的安排 转载请注明出处!

发表评论

textsms
account_circle
email

空城-最好的安排

docker搭建nginx服务器集群
环境要求:安装了docker的主机 (本文示例环境为centos7.4) 准备镜像 首先把所有需要用到的镜像拉取下来 12345678 # nginx$ docker pull nginx# php & php-fpm$ docker pull php:7…
扫描二维码继续阅读
2018-07-05