本文只是我对自己安装WordPress过程的一个总结,可能并不准确,欢迎指出。我使用的是 Nginx、MySQL和php-fpm。如果你用的是 Apache2 与 phpMyAdmin/MariaDB 的话,这篇文章可能帮不到你。

如果你嫌麻烦,可以直接用WordPress.com的免费方案,就是可能会有广告。

吐嘈:

  • Google到的很多教程(比如wpbeginner.comfreecodecamp.org)都推荐用Bluehost/HostGator/SiteGround/WP Engine/Hostinger等解决方案……但我没法用啊……
  • 网上的很多教程在如何设置 PHP 的部分过于模糊了……导致我折腾了很久。

如果你想要更详细的教程,推荐这个:How to Install WordPress with Nginx on Ubuntu 22.04 LTS - LinuxCapable(但是注意该文中提到的PHP 8.1 可能会产生错误,最好使用PHP 8.0)

WordPress官方也有 安装指南 ,不过说得不是很详细,需要借助官方论坛或者Google。

TODO

如果早知道……

WordPress

  • WordPress 是一个免费开源的引擎(FOSS),其官网是 WordPress.org
  • WordPress.com 是一个商业的 WordPress-hosting 平台。我以前只知道这个,导致我一直以为 WordPress 是个商业软件,一直不想用它……后悔为什么不早知道。

排雷

  • 不能用PHP 8.1,需要用PHP 8.0或更低的PHP 7.4(参考1)。
  • WordPress除了php以外,还需要php-fpmphp-cgi——不能只安装php

可能的报错(及其解决方案)

这里总结了我在安装过程中出现的报错信息以及我是如何解决它们的。

502

如果是 502 ,说明你 php-fpm 没有安装,或没有设置好 nginx 的配置文件。总之就是在反响代理的时候出问题了。

Error establishing a database connection

如果你建了数据库,且 wp-config.php 中的参数正确,那么这应该是因为你没有给你的用户足够的权限。

如果你嫌麻烦,可以直接使用

GRANT ALL PRIVILEGES ON * . * TO 'wordpress'@'localhost';

来给予'wordpress'@'localhost'所有数据库的权限。

白屏

如果你在浏览器中访问时出现了白屏(“white screen of death”),说明你的 PHP 版本不对——不能用最新的 PHP 8.1 。你可以在wp-config.php中设置

error_reporting(E_ALL); ini_set('display_errors', 1);

define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

来输出信息。

安装依赖

sudo apt-get update

Nginx

sudo apt-get install nginx

MySQL

参考:1, 2.

sudo apt-get install mysql-client-core-8.0 mysql-server-core-8.0 mysql-server mysql-client --fix-missing
sudo service mysql start

PHP

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.4 php7.4-cli php7.4-fpm php7.4-mysql php7.4-json php7.4-opcache php7.4-mbstring php7.4-xml php7.4-gd php7.4-curl php7.4-cgi

我使用的是 PHP7.4,如果你安装了 PHP 8.0 的话,需要用sudo apt-get purge php8.*或者sudo update-alternatives --config php来更改PHP版本。(参考1

DNS

如果你用的是腾讯云,在 DNSPod 里加条解析即可。

开始

访问WordPress.org的官网,在远程服务器上下载并解压最新版WordPress:

wget https://wordpress.org/latest.zip
unzip latest.zip

用 MariaDB 建数据库

sudo mariadb -u root
CREATE DATABASE WORDPRESSDB;
CREATE USER 'WPUSER'@localhost IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON WORDPRESSDB.* TO WPUSER@localhost IDENTIFIED BY 'PASSWORD';
FLUSH PRIVILEGES;
EXIT;

WORDPRESSDB PASSWORD WPUSER 等改成你想要的值即可。

用MySQL建数据库

此部分对应官方指南的 Step 2: Create the Database and a User 以及 Creating Database for WordPress – Using the MySQL Client

sudo mysql -u adminusername -p

运行(数据库和用户的名字任意,这里都用了wordpress):

注:直接按照指南运行代码会报错,需要参考 这个 改一下。

CREATE DATABASE wordpress;
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
EXIT;

password替换掉,记住它,之后要填在wp-config.php里。

wp-config.php

该部分对应Step 3: Set up wp-config.php。(参考 [wp-config.php Common APIs Handbook WordPress Developer Resources](https://developer.wordpress.org/apis/wp-config-php/))
cd wordpress
cp wp-config-sample.php wp-config.php
nano wp-config.php

// ** Database settings - You can get this info from your web host ** //

下面把 DB_NAME、DB_USER、DB_PASSWORD、DB_HOST根据指南改掉。

如果你根据这个指南完成了上一步,那么改成这个即可(password是你前一节设置的密码):

/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** Database username */
define( 'DB_USER', 'wordpress' );

/** Database password */
define( 'DB_PASSWORD', 'password' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

然后把

  * Authentication Unique Keys and Salts.

下面的AUTH_KEY等替换成用官方的 生成器 生成的secret key。

移动文件

该部分对应Step 4: Upload the files

直接

cd ..
sudo mv wordpress /var/www/html/wordpress
chown -R www-data:www-data /var/www/html
sudo find /var/www/html/wordpress -type d -exec chmod 755 {} \;
sudo find /var/www/html/wordpress -type f -exec chmod 644 {} \;

即可(参见 LinuxCapable的教程 )。

搞nginx

  • /etc/nginx/sites-available/default:这个文件里应该已经有fastcgi_pass unix:/run/php/php7.4-fpm.sock;了,不用动就可以了。
  • /etc/nginx/nginx.conf:不用改。

只需要修改/etc/nginx/sites-available/wordpress即可,我是直接在 LinuxCapable的模板 上把php8.1-fpm改成了php7.4-fpm。可能也可以直接用 Nginx官网的WordPress recipe

我的/etc/nginx/sites-available/wordpress如下:

server {

  listen 80;
  listen [::]:80;
  server_name example.com;

  root /var/www/html/wordpress;

  index index.php index.html index.htm index.nginx-debian.html;


  location / {
  try_files $uri $uri/ /index.php?$args;
 }

  location ~* /wp-sitemap.*\.xml {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  client_max_body_size 100M;

  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 我只改了这行:把8.1改成了7.4
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 128k;
    fastcgi_intercept_errors on;
  }

 gzip on;
 gzip_comp_level 6;
 gzip_min_length 1000;
 gzip_proxied any;
 gzip_disable "msie6";
 gzip_types
     application/atom+xml
     application/geo+json
     application/javascript
     application/x-javascript
     application/json
     application/ld+json
     application/manifest+json
     application/rdf+xml
     application/rss+xml
     application/xhtml+xml
     application/xml
     font/eot
     font/otf
     font/ttf
     image/svg+xml
     text/css
     text/javascript
     text/plain
     text/xml;

  # assets, media
  location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
      expires    90d;
      access_log off;
  }

  # svg, fonts
  location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
      add_header Access-Control-Allow-Origin "*";
      expires    90d;
      access_log off;
  }

  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

之后,运行:(参见 LinuxCapable的教程

sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo nginx -t # 如果这一步不ok,则需要根据提示检查你的nginx配置文件
sudo systemctl restart nginx

即可。现在应该可以在example.com(你的域名)上看到你的网站了