WordPress私有部署全指南:从入门到生产环境优化

WordPress私有部署全流程及优化指南

在这里插入图片描述

这篇文章详细介绍了如何使用 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 来访问了。

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的通信。

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里的证书的位置。

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的配置,我设置的比较保守。

file_uploads = On
upload_max_filesize = 16M
post_max_size = 32M

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

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

在这里插入图片描述

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

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

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

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

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

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

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

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里添加

/* 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和相应的链接。你用的哪个主题就在哪个主题下更改。

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);

📚 延伸阅读

更多内容持续更新于我的博客:https://www.zenseek.site

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值