使用腾讯云容器服务来构建简单 web service

本文将介绍使用nginx和php来构建简单web service,核心在于如何配置nginx的upstream,使得nginx能够与后端服务通信。我们的web service包含两个服务,分别是nginx和php-fpm,nginx服务收到用户请求后,根据配置,如果用户请求的是php文件,则将请求转给后端的php-fpm服务来处理。

为了方便,nginx容器和php-fpm容器使用同一个镜像,这个镜像右下面的仓库build而来。其中,app目录是我们的核心目录,用于存放php代码文件。etc目录用来存放配置,它包含了nginx服务的配置,以及php-fpm服务的配置。

一、配置说明

|-- Dockerfile
|-- app
|   |-- index.php
|   `-- info.php
`-- etc
    |-- nginx
    |   |-- nginx.conf
    |   `-- sites-enabled
    |       `-- myapp
    `-- php-fpm
        |-- php-fpm.conf
        `-- pool.d
            `-- www.conf

我们来看下nginx的核心配置文件 myapp:

server {
        root /app;

        location / {
                try_files $uri /index.php$is_args$args;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass php-fpm:9000;
                fastcgi_index index.php;
                include fastcgi_params;
    }
}

nginx通过root指定了代码的访问路径,我们项目的php文件都位于app目录下。

root /app

并且定义了如果用户请求的是php文件,则将请求转发给后端的php-fpm服务,该服务监听了9000端口(php-fpm目录的www.conf文件中定义)。

fastcgi_pass php-fpm:9000;

通过以上的配置可以看出nginx需要将php文件转发给后端的php-fpm服务,而nginx服务访问php-fpm服务的方式是通过服务名来访问。在我们的容器集群中,服务之间访问不需要知道服务的ip或者实例的ip,只需要指定服务名,集群会自动根据服务名做dns解析,如果一个服务有多个实例,dns解析的结果是等概率随机的,由于是等概率的,通过服务名来访问可以实现负载均衡。

二、实验

下面开始我们的实验。在项目目录执行以下命令,将项目build成docker镜像,并上传到镜像仓库中(请把镜像仓库空间tencentyun请换成自己的空间)

docker build -t ccr.ccs.tencentyun.com/tencentyun/nginx-php .
docker tag ccr.ccs.tencentyun.com/tencentyun/nginx-php ccr.ccs.tencentyun.com/tencentyun/nginx-php
docker push ccr.ccs.tencentyun.com/tencentyun/nginx-php

镜像上传完毕后,我们可以使用这个镜像分别创建两个服务,nginx和php-fpm,由于两个服务使用的是同一个镜像,在创建服务时注意:

  1. 服务名分别为 nginx和php-fpm,其中nginx服务名您可以改成其他名称比如frontend,但是php-fpm这个服务名不能改成其它名称,因为我们的nginx配置指定了访问php-fpm服务,如果没有这个服务,nginx转发php时会解析php-fpm服务出错
  2. nginx服务指定运行命令为nginx。
  3. php-fpm服务指定运行命令为php5-fpm。
  4. nginx服务的访问方式为提供公网访问,绑定容器和服务的端口均为80。
  5. php-fpm服务的访问方式为仅在集群内访问,绑定容器和服务的端口为9000。

nginx和php-fpm服务创建成功后,我们可以根据nginx服务的外网ip来访问我们的项目的index和info.php。

本文实验的项目源码下载

#nginx-php.zip#

文章来源于腾讯云开发者社区,点击查看原文