您的位置:首頁>正文

使用騰訊雲容器服務來構建簡單web service

更多騰訊海量技術文章, 請關注雲+社區:https://cloud.tencent.com/developer

作者:騰訊雲容器服務團隊

本文將介紹使用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-phpdocker 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。

歡迎前往原文查看本文實驗的項目源碼下載!

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示