用nginx + docker配置多個WordPress站的基本設定

前幾天和幾位朋友聊到WordPress測試環境的配置。有時候為了測試更貼近實際使用狀況,單靠ChassisVVV的開發環境還遠遠不夠,還需要實際將功能上到有公開網域的WordPress站上才行。這時我比較常用的方法是直接靠nginx做reverse proxy將某個子網域對應到一個WordPress Docker容器,這樣既不用擔心測試中污染環境,從配置到銷毀都快速又乾淨。例如https://jptest.southp.dev/就是我拿來測試Jetpack用的(空空的,沒啥好看的啦)。

因為我只是自己測試用的,所以一直以來我都只用一些很基本的手法來做這件事,沒想聊一聊發現好幾個人都跟我一樣,不需要用到這麼多複雜的套件,只想要非常簡單的方法就好,所以寫這篇文章簡述一下。

第一步:docker-compose

首先先把我們要放容器設定的目錄建立好,比方說wp-test

再來,docker的文件中的『Quickstart: Compose and WordPress』中已經幫我們把docker-compose.yml寫好了。但直接用起來,因為它用的是PHP的預設設定,很快就會碰到上傳上限的問題,因此我們先在wp-test下新增一個uploads.ini如下:

file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600

然後在wp-test目錄下把上述Quickstart中的docker-compose.yml複製進去,修改如下:

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     volumes:  # 照過來喔, 新增的段落在這邊
       - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

我個人會習慣把密碼換掉,但只是自己測試用的話,不換其實也沒什麼大礙,換掉只是我個人的資安潔癖會癢癢的。

完成後,就可以在wp-test下跑docker-compose up -d,就可以把容器跑起來了。以上例,成功與否可以先去8000 port看看,有看到WordPress安裝畫面就沒問題了。如果沒成功,可以先docker-compose down把整個service拿掉,再docker-compose up跑在前景看看有沒有什麼錯誤。

第二步:nginx reverse proxy

這邊的關鍵是reverse proxy的設定,其它都跟標準的server設定沒什麼差別。我個人會把這段抽出命名為wp-reverse-proxy.conf放到snippets裡:

add_header X-Frame-Options SAMEORIGIN;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_hide_header X-Frame-Options;

會需要特別去動X-Frame-Options是因為WordPress大部分的頁面都是設成Deny,在這種reverse proxy的環境下會讓UX Builder或外掛和主題更新中的iFrame失效。

有了這段snippet後,整個設定就長這樣:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    include snippets/ssl-params.conf;

    server_name wptest.your-awesome-domain.com;   # domain當然要用自己的,subdomain請隨自己喜好

    location / {
        include snippets/wp-reverse-proxy.conf;
        proxy_pass http://localhost:8000; # 注意這邊跟上面docker-compose設定的port相同
    }
}

snippets/ssl-params.conf只是一些基本的SSL設定請不要在意,我自己是從cipherli.st摳來的。

第三步:子網域SSL憑證

再來就是要為新增的子網域設定SSL憑證了。雖然Let’s Encrypt現在已經支援簽發wildcard憑證了,但我自己是就用最基本的certbot自動設定把當下有的subdomain設定好就好,反正不是一天到晚在加子網域。詳細請看certbot官方指南,總結來說就是:

  1. 安裝certbot套件。
  2. sudo certbot --nginx
  3. 無腦地跟隨指示,結束

自動化萬歲!

結束!

就這樣,我們就可以在指定的子網域存取到新建的dockerized WordPress了,如果要跑多個,就依此類推,把子網域和連接埠改一下即可,也可以寫個script來自動化以上步驟。如此一來,要跑幾個測試網站,要怎麼摧殘它們,都可以來去不留痕跡。

環境,好像又乾淨了一點點。

發表留言

Please log in using one of these methods to post your comment:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.