使用腾讯云容器服务来构建简单 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,由于两个服务使用的是同一个镜像,在创建服务时注意:
- 服务名分别为 nginx和php-fpm,其中nginx服务名您可以改成其他名称比如frontend,但是php-fpm这个服务名不能改成其它名称,因为我们的nginx配置指定了访问php-fpm服务,如果没有这个服务,nginx转发php时会解析php-fpm服务出错。
- nginx服务指定运行命令为nginx。
- php-fpm服务指定运行命令为php5-fpm。
- nginx服务的访问方式为提供公网访问,绑定容器和服务的端口均为80。
- php-fpm服务的访问方式为仅在集群内访问,绑定容器和服务的端口为9000。
nginx和php-fpm服务创建成功后,我们可以根据nginx服务的外网ip来访问我们的项目的index和info.php。