使用騰訊雲容器服務來構建簡單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服務的配置。

Advertisements

一、配置說明

|-- 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目錄下。

Advertisements

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,由於兩個服務使用的是同一個鏡像,在創建服務時注意:

  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。

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

Advertisements

你可能會喜歡