分離 nginx 和 php-fpm 到不同的 Docker 上
阿新 • • 發佈:2021-12-07
自己之前在用 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,檢視是否執行成功。
七、遇到的問題
- Q: Nginx 錯誤日誌中顯示「connect() failed (111: Connection refused) while connecting to upstream...」
如果你碰到這個問題,說明連線失敗了,問題的原因很大可能出現在配置的 php-fpm 伺服器上,請檢查是否使用了本地迴環,注意區分容器內部和外部,以及是否改為了 php-fpm 所在的伺服器 IP。 - 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 和埠號是否正確。 - Q:如果你在 Nginx 的訪問日誌中發現了 404, 瀏覽器訪問提示「File not found.」
只是檔案訪問不到而已,不要慌,檢查一下 Nginx 的 root 配置的路徑,注意路徑要 php-fpm 伺服器上的檔案路徑。