资讯专栏INFORMATION COLUMN

web应用集群入门-利用docker在单机搭建web应用集群实现session共享

jcc / 2766人阅读

摘要:环境要求安装了的主机本文示例环境为准备镜像首先把所有需要用到的镜像拉取下来容器编排是容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。

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

准备镜像

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

# 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以上

$ 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

安装后确认:

$ docker-compose --version

使用Compose启动多个Nginx容器 创建编排脚本

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

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"

启动容器

# up:创建并启动 -d:后台运行
$ docker-compose up -d

# 查看容器
$ docker-compose ps

配置Nginx 反向代理Nginx配置

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

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同理)

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同理)




  
  Document



  web2

浏览器访问 127.0.0.1:8080 并刷新


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

PHP环境安装

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

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
创建自定义镜像
# 切换目录
$ cd /docker/php
# build: 创建,切记勿忽略后面的 . 意为当前目录
$ docker build -t php:add_redis .

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

$ docker images

容器依赖

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

最终编排脚本
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

;添加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

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;
  }
}
重新编排容器

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

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

测试环境! phpinfo

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


浏览器访问 127.0.0.1:8080/index.php

session共享

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


浏览器访问 127.0.0.1:8080/session.php 每次的session_id相同则表明已实现session共享


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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27152.html

相关文章

  • web应用集群入门-利用docker单机搭建web应用集群实现session共享

    摘要:环境要求安装了的主机本文示例环境为准备镜像首先把所有需要用到的镜像拉取下来容器编排是容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。 环境要求:安装了docker的主机 (本文示例环境为centos7.4) 准备镜像 首先把所有需要用到的镜像拉取下来 # nginx $ docker pull nginx # php & php-fpm $ docker pul...

    ls0609 评论0 收藏0
  • 墙裂推荐:搜云库技术团队,面试必备的技术干货

    摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...

    SegmentFault 评论0 收藏0
  • 墙裂推荐:搜云库技术团队,面试必备的技术干货

    摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...

    Neilyo 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

jcc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<