1. 程式人生 > 其它 >分離 nginx 和 php-fpm 到不同的 Docker 上

分離 nginx 和 php-fpm 到不同的 Docker 上

自己之前在用 Docker 的時候,總是將 PHP 和 Nginx 打包到同一個映象中,然後執行對應的映象。近段時間正好想著提升自己的技術,就想著將執行環境細化拆分,以便於之後自己做其他語言開發時替換中間映象,也提升自己對 PHP 和 Docker 的理解

一、下載 Nginx 和 PHP 的 Docker 映象

通過命令列直接拉取 Docker 遠端映象回到本地

docker pull nginx:1.21.4-alpine-perl
docker pull php:7.2-fpm

這裡不選用最新的 latest 版本,而是指定版本,原因很簡單,只是為了版本控制

二、建立 php-fpm 配置檔案

docker 預設的 php-fpm 配置檔案在 /usr/local/etc/php-fpm.d/www.conf,只要編寫好配置檔案,然後掛載到對應的目錄下即可。這裡直接建立一個新的檔案儲存,我的儲存在 /home/wenhsing/php/www.conf 中,注意根據實際情況進行調整修改。

[www]
user = www-data
group = www-data
;listen = 127.0.0.1:9000
;將 listten 改成對應伺服器的 IP,因為現在的 127.0.0.1 指向的是 Docker 內部
listen = 0.0.0.0:9000
;出於安全原因,建議配置上允許訪問的 IP
;listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

三、執行 PHP Docker

docker run -d --name php_c1 \
    -v /home/wenhsing/php/www.conf:/usr/local/etc/php-fpm.d/www.conf \
    php:7.2-fpm

這裡的 /home/wenhsing/php/www.conf 是前一步建立的檔案的位置,記得替換成你自己檔案所在的位置。

四、建立 Nginx 配置檔案

建立 Nginx 配置檔案,用以替換 Docker 中預設的配置檔案(/etc/nginx/conf.d/default.conf)。我這裡先建立在 /home/wenhsing/php/default.conf, 內容可以參考下面的配置。

server {
    listen       80;
    listen  [::]:80;

    server_name  localhost;

    location ~ \.php$ {
       # 注意這裡是 fpm 所在伺服器上的 *.php 檔案路徑
       root           /var/www/html;
       # 這裡不使用本地迴環,因為指向的是容器內部,請改為 php-fpm 伺服器所在的 IP 和埠
       # fastcgi_pass   127.0.0.1:9000;
       fastcgi_pass   192.168.0.13:9000;
       fastcgi_index  index.php;
       # 注意修改路徑,否則可能會出現訪問 404 問題
       # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include        fastcgi_params;
    }
}

這裡假設我電腦的 IP 是 192.168.0.2,請根據自身實際情況進行修改。

五、執行 Nginx Docker

docker run -d -name nginx_c1 \
    -v /home/wenhsing/php/default.conf:/etc/nginx/conf.d/default.conf \
    nginx:1.21.4-alpine-perl

六、測試

以互動式登入 php-fpm 容器,這裡使用的是第三步中的指定的容器名(php_c1),實際替換成你自己的。

docker exec -it php_c1 /bin/bash

進入容器後預設會在 /var/www/html 目錄下,直接建立一個 index.php 檔案用於測試

echo "<?php phpinfo();" > index.php

使用瀏覽器直接訪問 localhost/index.php,檢視是否執行成功。

七、遇到的問題

  1. Q: Nginx 錯誤日誌中顯示「connect() failed (111: Connection refused) while connecting to upstream...」
    如果你碰到這個問題,說明連線失敗了,問題的原因很大可能出現在配置的 php-fpm 伺服器上,請檢查是否使用了本地迴環,注意區分容器內部和外部,以及是否改為了 php-fpm 所在的伺服器 IP。
  2. Q: Nginx 錯誤日誌中顯示「FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream...」
    如果碰到這個問題,你可以開心一會了,這說明了你已經成功的連線上了 php-fpm 伺服器。但是,php-fpm 的的配置可能出現問題,看一下 php-fpm 的配置檔案 www.conf 設定的監聽(listen)的 IP 和埠號是否正確。
  3. Q:如果你在 Nginx 的訪問日誌中發現了 404, 瀏覽器訪問提示「File not found.」
    只是檔案訪問不到而已,不要慌,檢查一下 Nginx 的 root 配置的路徑,注意路徑要 php-fpm 伺服器上的檔案路徑。