编辑
2025-08-05
容器
00

目录

1. WordPress 简介:开源建站系统首选
2. 快速部署 WordPress:Docker 初体验
3. 云服务器部署 WordPress:HTTPS + Nginx 实践
3.1 WordPress 与数据库容器配置
3.2 Nginx 配置:反向代理与 HTTPS 支持
3.3 附加设置:上传限制与性能优化
4. 内网环境部署 WordPress:无域名自适应配置
4.1 内网部署挑战与问题排查
4.2 容器配置调整:适配内网端口
4.3 Nginx 配置增强:支持自定义端口
4.4 修改 wp-config.php:URL 与端口兼容性修复
5. 实用技巧与界面客制化建议

wordpress1.jpg

这篇文章详细介绍了如何使用 Docker 快速部署 WordPress,包括基础部署、通过 Nginx 实现 HTTPS 反向代理、内网无域名环境下的端口映射修复,以及常见问题的解决方案。文章涵盖从开发环境到生产部署的全流程,并提供实用的配置文件、代码片段和优化技巧,非常适合希望私有部署 WordPress 的开发者或企业团队。

1. WordPress 简介:开源建站系统首选

WordPress 是一个开源的内容管理系统(CMS),用于创建和管理网站、博客或应用程序。它最初是一个博客平台,但现在已经发展成功能强大、灵活的建站系统。

它支持私有部署,2分钟安装程序,操作界面友好,非技术用户也能轻松上手。它拥有全球最大的社区,大量的主题和插件。技术栈由PHP,MySQL/MariaDB,Apache/Nginx组成。

2. 快速部署 WordPress:Docker 初体验

通过Docker来部署Wordpress是最容易的。需要说明的是,默认的Wordpress镜像集成的是Apache,如果要使用Nginx作为Web服务器,则需要选择Wordpress FSM的版本。数据库可以使用MySQL或是MariaDB。

下面是最简单的部署方式,没有代理,没有启用HTTPS,没有Certbot自动更新证书,没有Redis。只需要将Wordpress的80端口映射到服务器上的8080端口后,可以通过 http://domain_name:8080 来访问了。

yaml
services: 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的后台。

3. 云服务器部署 WordPress:HTTPS + Nginx 实践

我在云服务器上是使用Nginx来代理我所有的应用。对于Wordpress也不例外,我只使用Nginx将请求代理给Wordpress,并没有将Nginx作为Wordpress的Web服务器,所以我还是使用默认的Docker镜像。

3.1 WordPress 与数据库容器配置

这里我使用了MariaDB,由Nginx来管理相关的证书并作HTTPS流量的卸载。下面是Wordpress的Docker Compose文件。

我提前规划好了Docker网络,wordpress-net只用于Wordpress和MariaDB的通信,nginx-reverse-proxy网络用于Wordpress和Nginx的通信。

yaml
services: 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

3.2 Nginx 配置:反向代理与 HTTPS 支持

Nginx的配置文件如下。无论是什么域名的HTTP流量都会重定向到HTTPS。在HTTPS的Server Block里添加你的挂载在Nginx里的证书的位置。

bash
server { 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; } }

3.3 附加设置:上传限制与性能优化

此外,Wordpress默认最大上传附件的大小是2M,通过挂载uploads.ini可以改变上传附件大小的限制。此外,在Nginx里,还得设置client_max_body_size,不然Nginx也不放行。下面是uploads.ini的配置,我设置的比较保守。

bash
file_uploads = On upload_max_filesize = 16M post_max_size = 32M

这样就是一个生产环境的部署了,我没有使用Certbot来自动更新证书是因为我使用的泛域名的证书,需要用到DNS的challenge。

4. 内网环境部署 WordPress:无域名自适应配置

wordpress_1.jpg

4.1 内网部署挑战与问题排查

由于部署在内网环境之中,没有域名可以使用。所有的应用都在Nginx代理的后面,通过服务器的IP和特殊的端口号来区分应用。正常部署之后发现,重定向之后将端口号给剥离了。经过多次尝试之后,发现要更改多处的配置。正确的配置如下。

4.2 容器配置调整:适配内网端口

Wordpress这部分和 3.1部分的配置基本一样,只是添加了一个参数。

yaml
wordpress: environment: WORDPRESS_URL: https://SERVER_IP:CUSTOM_PORT

4.3 Nginx 配置增强:支持自定义端口

Nginx这部分的配置,除了3.2部分的以外,在location处添加下面的关于CUSTOM_PORT的配置。

bash
server { 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; } }

4.4 修改 wp-config.php:URL 与端口兼容性修复

在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容器。

5. 实用技巧与界面客制化建议

强制登录,和登录界面客制化都可以通过插件来实现。但是我想把后台的Wordpress图标和相关的超链接给去掉。在wordpress_data文件夹下的wp-content/themes/hybridmag/functions.php里添加下面的代码来移除所有的后台左上角的Wordpress Logo和相应的链接。你用的哪个主题就在哪个主题下更改。

php
function 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 许可协议。转载请注明出处!