使用腾讯云容器服务来构建简单web service
使用腾讯云容器服务来构建简单 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。
- 漏洞预警 | Ubuntu 16.04版本存在本地提权漏洞(附EXP)
- 通过“震网三代”和Siemens PLC 0day漏洞,实现对工控系统的入侵实验
- 安卓端渗透工具DVHMA:自带漏洞的混合模式APP
- 小萝莉说Crash(二): Unrecognized selector xxx 之 ForwardInvocation
- 5分钟教程:如何通过UART获得root权限
- 源码级剖析PHP 7.2.x GD拒绝服务漏洞
- 美女程序媛发福利,读懂ANR的trace文件So easy
- Openshift高阶探索实验
- 卡卡卡!小萝莉告诉你开发iOS应用如何避免卡顿
- Bugly即将支持的ANR,精神哥告诉你是个什么鬼?
- Go语言Goroutine与Channel内存模型
- 手把手教 | 深度学习库PyTorch(附代码)
- 如何定位Obj-C野指针随机Crash(一):先提高野指针Crash率
- 如何定位Obj-C野指针随机Crash(二):让非必现Crash变成必现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 模拟入栈操作
- 古董键盘
- 标准字符设备驱动模板
- 这就是你日日夜夜想要的docker!!!---------三分钟带你玩转docker命令
- PLL/DLL/DCM/MMCM
- 常见编程模式之就地反转链表
- 这就是你日日夜夜想要的docker!!!---------Docker常规操作--端口映射、数据卷管理 以及容器互联
- redis学习(十八)
- Elasticsearch基础知识补齐
- 踩坑记 | 多aar下修改常量的一个小坑
- 学习mockjs
- CentOS7增加Swap分区大小
- vue可视化图表 基于Echarts封装好的v-charts简介
- Speak开坑记录
- JavaScript获取cookie的方法