本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)php
本文做者: 蘇洋html
建立時間: 2019年04月07日 統計字數: 6261字 閱讀時間: 13分鐘閱讀 本文連接: soulteary.com/2019/04/07/…前端
前一篇 內容介紹瞭如何使用官方鏡像快速搭建 WordPress,可是官方默認是「胖容器」應用,接下來將聊聊一樣基於容器搭建的其餘選擇:Nginx。演示如何改造應用爲「瘦」容器應用。mysql
本文將花費十分鐘左右,介紹如何在 Docker 容器中搭配 Traefik 使用 WordPress 和 Nginx 。nginx
NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. NGINX is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption.sql
除了官方對於 Nginx 免費、開源、輕量、高性能的定位以外,當前不論在企業中,仍是我的學習使用,Nginx 的資源的豐富程度遠勝 Apache (前文 WordPress 容器鏡像默認工具)。docker
另外,Nginx 的兩個著名的派生應用,也在企業中普遍開花:Tengine、OpenResty,本文中的內容一樣適用於這兩個版本的「Nginx」。數據庫
本文將使用下面幾個官方鏡像做爲演示,上面有提過,你可使用 Nginx 的「同類」們將它進行替換。編程
1.15.10-alpine
5.1.1-php7.1-fpm-alpine
10.3.14
Traefik 的具體使用,能夠參考以往的文章,好比:使用服務發現改善開發體驗、更完善的 Docker + Traefik 使用方案 等,更多內容,能夠翻看歷史內容的標籤,這裏不過多贅述。瀏覽器
本文只須要關注編排文件中的 labels
和 networks
字段配置就足夠啦。
對不一樣容器服務的 networks
字段,聲明包含相同的內容,則可讓不一樣應用所處於的網絡一致。
networks:
- traefik
複製代碼
好比上面的聲明,會讓容器服務都處於名爲 traefik
的網絡環境中。
下面的配置在上一篇文章中提到過,爲了不篇幅過長,我作了適當精簡。
version: '3'
services:
wp:
image: ${WP_IMAGE}
restart: always
networks:
- traefik
environment:
WORDPRESS_DB_HOST: ${DB_HOST}
WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
WORDPRESS_DB_NAME: ${DB_NAME}
WORDPRESS_DB_USER: ${DB_USER}
WORDPRESS_DB_PASSWORD: ${DB_PASS}
volumes:
# 若是你有定製上傳文件尺寸的需求
# - ./config/php.conf.uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- ./wp-app:/var/www/html
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:${WP_DOMAINS}"
- "traefik.frontend.entryPoints=https,http"
mariadb:
image: ${DB_IMAGE}
restart: always
container_name: ${DB_HOST}
networks:
- traefik
environment:
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
volumes:
- ./data:/var/lib/mysql
networks:
traefik:
external: true
複製代碼
若是咱們使用 Nginx
做爲 「Web 前端」,那麼這裏須要進行適當的調整。
由於使用 Nginx 取代了 WordPress 做爲流量入口,因此 WordPress 服務能夠再也不綁定 Traefik ,註冊請求域名,labels
字段能夠悉數刪除。
另外,由於 WordPress 須要被 Nginx 遠程調用,因此須要給 WordPress 這個服務添加一個固定的 container_name
,以便於調用。如同上面配置中,WordPress 調用 Mariadb 同樣。
services:
wp:
image: ${WP_IMAGE}
restart: always
container_name: ${WP_HOST}
networks:
- traefik
environment:
WORDPRESS_DB_HOST: ${DB_HOST}
WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
WORDPRESS_DB_NAME: ${DB_NAME}
WORDPRESS_DB_USER: ${DB_USER}
WORDPRESS_DB_PASSWORD: ${DB_PASS}
volumes:
- ./wordpress:/var/www/html
複製代碼
上面就是改造好的配置啦,數據庫沒有任何變化,咱們略過它,開始配置 Nginx 。
services:
nginx:
image: ${NGX_IMAGE}
restart: always
networks:
- traefik
expose:
- 80
volumes:
- ./conf:/etc/nginx/conf.d
- ./logs:/var/log/nginx
- ./wordpress:/var/www/html
depends_on:
- wp
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:${NGX_DOMAINS}"
- "traefik.frontend.entryPoints=https,http"
複製代碼
由於 Nginx 接管了入口流量,因此在 Traefik 上註冊服務發現的任務就非它莫屬了,這裏使用 labels
字段,添加一些 Traefik 支持的指令,進行服務註冊。
另外,這裏須要將 WordPress 掛載到文件系統中的文件也掛載到 Nginx 中,就像這樣。
- ./wordpress:/var/www/html
複製代碼
最後,簡單聲明一個 Nginx 配置,用來描述如何調用 WordPress 便可。
將下面的內容保存爲 wp.conf
便可。
server {
listen 80;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wp:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
複製代碼
和前文同樣,爲了可維護性,咱們將環境配置信息和應用編排文件進行了分離。
WP_IMAGE=wordpress:5.1.1-php7.1-fpm-alpine
WP_DB_PREFIX=wp
WP_HOST=wp
NGX_IMAGE=nginx:1.15.10-alpine
NGX_DOMAINS=wp.lab.com,wp.lab.io
DB_IMAGE=mariadb:10.3.14
DB_HOST=wp-db
DB_NAME=wordpress
DB_USER=wordpress
DB_PASS=wordpress
DB_ROOT_PASS=soulteary
複製代碼
將上面的文件保存爲 .env
後,咱們能夠開始啓動應用了。
在啓動應用以前,咱們將剛剛修改的編排文件進行彙總。
version: '3'
services:
wp:
image: ${WP_IMAGE}
restart: always
container_name: ${WP_HOST}
networks:
- traefik
environment:
WORDPRESS_DB_HOST: ${DB_HOST}
WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
WORDPRESS_DB_NAME: ${DB_NAME}
WORDPRESS_DB_USER: ${DB_USER}
WORDPRESS_DB_PASSWORD: ${DB_PASS}
volumes:
- ./wordpress:/var/www/html
mariadb:
image: ${DB_IMAGE}
restart: always
container_name: ${DB_HOST}
networks:
- traefik
environment:
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
volumes:
- ./data:/var/lib/mysql
nginx:
image: ${NGX_IMAGE}
restart: always
networks:
- traefik
expose:
- 80
volumes:
- ./conf:/etc/nginx/conf.d
- ./logs:/var/log/nginx
- ./wordpress:/var/www/html
depends_on:
- wp
labels:
- "traefik.enable=true"
- "traefik.frontend.rule=Host:${NGX_DOMAINS}"
- "traefik.frontend.entryPoints=https,http"
networks:
traefik:
external: true
複製代碼
將文件保存爲 docker-compose.yml
後,咱們使用 docker-compose up
啓動應用,驗證應用是否正常。
當你看到下面的日誌時,你的應用就能夠進行訪問啦。
wp-db | 2019-04-07 3:42:58 0 [Note] Server socket created on IP: '::'.
wp-db | 2019-04-07 3:42:58 0 [Warning] 'proxies_priv' entry '@% root@2ed5be12f731' ignored in --skip-name-resolve mode.
wp-db | 2019-04-07 3:42:58 0 [Note] Reading of all Master_info entries succeded
wp-db | 2019-04-07 3:42:58 0 [Note] Added new Master_info '' to hash table
wp-db | 2019-04-07 3:42:58 0 [Note] mysqld: ready for connections.
wp-db | Version: '10.3.14-MariaDB-1:10.3.14+maria~bionic' socket: '/var/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
wp | [07-Apr-2019 03:42:59] NOTICE: fpm is running, pid 1
wp | [07-Apr-2019 03:42:59] NOTICE: ready to handle connections
複製代碼
依舊是使用瀏覽器訪問剛剛 .env
中配置的域名,依舊是熟悉的操做,填寫信息,進行著名的「三分鐘」安裝,以後,即是一個新的站點誕生啦。
咱們使用 Compose
進行應用啓動的時候,若是是第一次調試,建議執行:
docker-compose up
複製代碼
由於能夠在終端中直接看到應用的實際運行日誌,若是出錯,能夠按下 CTRL+C
組合鍵,中斷執行,返回調試。
當你的應用徹底就緒以後,咱們須要長期穩定的運行這個服務的時候,再使用 Compose
的時候,則能夠添加一個 -d
參數,讓應用以 daemon 模式執行。
docker-compose up -d
複製代碼
這時,應用會乖乖的靜默在後臺執行,不會向終端輸出任何有價值的信息,若是應用異常,咱們須要調試,想看到應用日誌該怎麼處理呢?執行下面的命令就能夠了。
docker-compose logs -f
複製代碼
若是發現應用執行出錯,使用 docker-compose down
結束應用運行後,調整編排配置文件,從新使用不帶參數的的 docker-compose up
啓動應用,待應用徹底就緒後,再添加 daemon
參數就能夠了。
感謝各位持續關注、鼓勵我寫做的同窗。是大家的關注讓我能夠在寫做過程當中沒必要重複贅述一堆內容,成文變的高效起來。
常見的 WordPress 多見於部署於線上,須要依賴 MySQL
、Mariadb
運行,不適合「隨身攜帶」、或者低配置機器運行。
下一篇內容將聊聊 「如何打造隨身攜帶的 WordPress」。
我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。
在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)