Nginx

docker wordpress 的 Nginx 配置:php8.0-fpm-alpine

  • May 5, 2021

我的目標是在主機 Nginx 配置中創建一個伺服器塊,作為 wordpress php docker 容器的 fastcgi 前端。

也就是說nginx伺服器不在容器中,我也不希望它在容器中。我也不在乎 wordpress 站點的靜態文件是否以某種方式直接由 Nginx 提供——如果讓容器為它們提供服務更容易,那麼這就是我想做的。

我有一個使用 wordpress:php8.0-fpm-alpine 圖像執行的 docker 容器。到目前為止,我只嘗試了 Nginx 提供的伺服器塊:

upstream php {
       server unix:/tmp/php-cgi.socket;
       server 127.0.0.1:9000;
}
server {
       ## Your website name goes here.
       server_name domain.tld;
       ## Your only path reference.
       root /var/www/wordpress;
       ## This should be in your http block and if it is, it's not needed here.
       index index.php;

       location = /favicon.ico {
               log_not_found off;
               access_log off;
       }

       location = /robots.txt {
               allow all;
               log_not_found off;
               access_log off;
       }

       location / {
               # This is cool because no php is touched for static content.
               # include the "?$args" part so non-default permalinks doesn't break when using query string
               try_files $uri $uri/ /index.php?$args;
       }

       location ~ \.php$ {
               #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
               include fastcgi_params;
               fastcgi_intercept_errors on;
               fastcgi_pass php;
               #The following parameter can be also included in fastcgi_params file
               fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
       }

       location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
               expires max;
               log_not_found off;
       }
}

以及連結的建議範例:https ://gist.github.com/md5/d9206eacb5a0ff5d6be0#file-wordpress-fpm-conf

server { 
 listen 80; 
 server_name localhost; 
 root /var/www/html; 

 index index.php; 

 location / {
   try_files $uri $uri/ /index.php?$args;
 }

 rewrite /wp-admin$ $scheme://$host$uri/ permanent;

 location ~ [^/]\.php(/|$) { 
   fastcgi_split_path_info ^(.+?\.php)(/.*)$;
   if (!-f $document_root$fastcgi_script_name) {
     return 404;
   }

   include fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param PATH_INFO       $fastcgi_path_info;
   fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

   fastcgi_pass   fpm:9000;
   fastcgi_index  index.php; 
 } 
}

在這兩個範例中,我都根據需要替換了我的域和 php 伺服器主機名/套接字。但是,兩者都清楚地使用對 wordpress 靜態文件的直接訪問。我也將如何轉發這些請求?這能解決問題嗎?我實際上不知道 fpm-alpine 圖像提供其靜態內容,但我認為它確實如此。

PHP-FPM 僅提供 PHP 內容。大多數範例給出一個-v標誌來將主機上的路徑/卷映射到 docker 容器內的路徑

第一個問題是“docker 容器是否響應非 CGI 請求”,這又回到“我也不關心 wordpress 站點的靜態文件是否以某種方式直接由 Nginx 提供”

docker容器是在nginx主機還是遠端主機上執行?如果它是本地的,那麼改變servernameroot在第二個例子中是要走的路。如果內容在遠端伺服器上,那麼您需要使用 NFS 之類的東西與 Nginx 伺服器共享內容。還有其他方法,但它們是最簡單的

編輯 1

我更改了伺服器名和根目錄,並且能夠訪問這些文件。如果我做得對,我有點擔心。

那是對的

有沒有辦法確保使用更新版本的 docker 鏡像總是覆蓋卷?

Docker 將使用相關主機上的映像。你沒有在那裡提供任何細節,但通常你需要做docker stop <name>&& docker pull <new image>&&docker run <new image> 注意圖像可能是latest或其他一些滾動標籤。

EDIT2(來自評論回复:卷是否會被覆蓋)

這涉及到你的跑步方式。該選項未涵蓋的所有內容都-v將失去。IIRC wordpress 有一個wp-content,可能是一個wp-includes文件夾和 sql 配置。因此,我希望有 2 個-v選項可以將本地文件夾以及一堆 -e或一個--env-file.

這些捲和環境未涵蓋的所有內容都將替換為新容器

引用自:https://serverfault.com/questions/1061778