这篇文章详细介绍了如何使用 Docker 快速部署 WordPress,包括基础部署、通过 Nginx 实现 HTTPS 反向代理、内网无域名环境下的端口映射修复,以及常见问题的解决方案。文章涵盖从开发环境到生产部署的全流程,并提供实用的配置文件、代码片段和优化技巧,非常适合希望私有部署 WordPress 的开发者或企业团队。
WordPress 是一个开源的内容管理系统(CMS),用于创建和管理网站、博客或应用程序。它最初是一个博客平台,但现在已经发展成功能强大、灵活的建站系统。
它支持私有部署,2分钟安装程序,操作界面友好,非技术用户也能轻松上手。它拥有全球最大的社区,大量的主题和插件。技术栈由PHP,MySQL/MariaDB,Apache/Nginx组成。
通过Docker来部署Wordpress是最容易的。需要说明的是,默认的Wordpress镜像集成的是Apache,如果要使用Nginx作为Web服务器,则需要选择Wordpress FSM的版本。数据库可以使用MySQL或是MariaDB。
下面是最简单的部署方式,没有代理,没有启用HTTPS,没有Certbot自动更新证书,没有Redis。只需要将Wordpress的80端口映射到服务器上的8080端口后,可以通过 http://domain_name:8080
来访问了。
yamlservices:
wordpress:
image: wordpress:latest
ports:
- 8000:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
volumes:
- ./wp-data:/var/www/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wp
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- ./db-data:/var/lib/mysql
访问http://domain_name:8080
首先会让你设置你的网站,之后Wordpress会在数据库内新建一个数据库,并把相关的表建立起来。再之后就可以直接访问Wordpress的网站了。默认通过 http://domain_name:8080/wp-admin
来访问Wordpress的后台。
我在云服务器上是使用Nginx来代理我所有的应用。对于Wordpress也不例外,我只使用Nginx将请求代理给Wordpress,并没有将Nginx作为Wordpress的Web服务器,所以我还是使用默认的Docker镜像。
这里我使用了MariaDB,由Nginx来管理相关的证书并作HTTPS流量的卸载。下面是Wordpress的Docker Compose文件。
我提前规划好了Docker网络,wordpress-net只用于Wordpress和MariaDB的通信,nginx-reverse-proxy网络用于Wordpress和Nginx的通信。
yamlservices:
wordpress:
image: wordpress:latest
container_name: wp_web
depends_on:
- db
volumes:
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- ./html:/var/www/html
expose:
- 80
networks:
- nginx-reverse-proxy
- wordpress-net
restart: always
environment:
- WORDPRESS_DB_HOST=wp_db
- WORDPRESS_DB_USER=wpuser
- WORDPRESS_DB_PASSWORD=wppassword
- WORDPRESS_DB_NAME=wpdb
db:
image: mariadb:latest
command: '--default-authentication-plugin=mysql_native_password'
container_name: wp_db
volumes:
- ./mysql:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=wpdb
- MYSQL_USER=wpuser
- MYSQL_PASSWORD=wppassword
expose:
- 3306
networks:
- wordpress-net
networks:
nginx-reverse-proxy:
external: true
wordpress-net:
external: true
Nginx的配置文件如下。无论是什么域名的HTTP流量都会重定向到HTTPS。在HTTPS的Server Block里添加你的挂载在Nginx里的证书的位置。
bashserver {
listen 80;
server_name _;
# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name DOMAIN_NAME;
# Add this line to increase the limit
client_max_body_size 100M;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
# SSL/TLS Security Settings
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
# Enable HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://wp_web:80;
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;
}
}
此外,Wordpress默认最大上传附件的大小是2M,通过挂载uploads.ini可以改变上传附件大小的限制。此外,在Nginx里,还得设置client_max_body_size,不然Nginx也不放行。下面是uploads.ini的配置,我设置的比较保守。
bashfile_uploads = On upload_max_filesize = 16M post_max_size = 32M
这样就是一个生产环境的部署了,我没有使用Certbot来自动更新证书是因为我使用的泛域名的证书,需要用到DNS的challenge。
由于部署在内网环境之中,没有域名可以使用。所有的应用都在Nginx代理的后面,通过服务器的IP和特殊的端口号来区分应用。正常部署之后发现,重定向之后将端口号给剥离了。经过多次尝试之后,发现要更改多处的配置。正确的配置如下。
Wordpress这部分和 3.1部分的配置基本一样,只是添加了一个参数。
yaml wordpress:
environment:
WORDPRESS_URL: https://SERVER_IP:CUSTOM_PORT
Nginx这部分的配置,除了3.2部分的以外,在location处添加下面的关于CUSTOM_PORT的配置。
bashserver {
listen CUSTOM_PORT ssl;
server_name SERVER_IP;
省略
location / {
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_redirect off;
}
}
在wordpress_data文件夹下的wp-config.php里添加
php/* these 2 clauses are to fix the behavior with custom port behind nginx proxy. */
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
/* Manually add WP URL and Home URL */
define('WP_HOME', 'https://SERVER_IP:CUSTOM_PORT');
define('WP_SITEURL', 'https://SERVER_IP:CUSTOM_PORT');
然后docker compose restart重启整个Wordpress容器。
强制登录,和登录界面客制化都可以通过插件来实现。但是我想把后台的Wordpress图标和相关的超链接给去掉。在wordpress_data文件夹下的wp-content/themes/hybridmag/functions.php里添加下面的代码来移除所有的后台左上角的Wordpress Logo和相应的链接。你用的哪个主题就在哪个主题下更改。
phpfunction remove_wp_logo_from_admin_bar($wp_admin_bar) {
$wp_admin_bar->remove_node('wp-logo'); // Main logo
$wp_admin_bar->remove_node('about'); // About WordPress
$wp_admin_bar->remove_node('wporg'); // WordPress.org
$wp_admin_bar->remove_node('documentation'); // Documentation
$wp_admin_bar->remove_node('support-forums'); // Support
$wp_admin_bar->remove_node('feedback'); // Feedback
}
add_action('admin_bar_menu', 'remove_wp_logo_from_admin_bar', 11);
本文作者:潘晓可
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!