本文约 3,819 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:为什么要手动装,而不用一键包
一键包方便,但你不知道它改了什么,出问题排查成本高,也不利于复用。手动部署一次,你会清楚每个环节的作用:哪个文件控制伪静态、哪个参数决定上传大小、哪个用户负责写文件。
本文基于 Ubuntu 22.04 LTS,装 Nginx + MariaDB + PHP 8.2-FPM,全程可复制执行。
原理分析:请求是怎么走完一圈的
浏览器 → 80/443 → Nginx(server 块)
→ 静态文件:直接返回
→ .php:FastCGI → PHP-FPM(www池)
→ WordPress 启动 → 查 MariaDB → 返回 HTML
三个环节各有配置文件:Nginx 在 /etc/nginx/sites-available/,PHP-FPM 在 /etc/php/8.2/fpm/pool.d/www.conf,PHP 参数在 /etc/php/8.2/fpm/php.ini。出问题先定位是哪个环节。
保姆级实操
第一步:更新系统并安装 Nginx
sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx curl unzip git
sudo systemctl enable --now nginx
浏览器访问服务器 IP,看到 Nginx 欢迎页说明成功。
第二步:安装 MariaDB
sudo apt install -y mariadb-server
sudo mysql_secure_installation
建库建用户:
sudo mysql -e "CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -e "CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '换成强密码';"
sudo mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"
第三步:安装 PHP 8.2 与扩展
Ubuntu 22.04 默认源是 PHP 8.1,需要加 ondrej 源:
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring \
php8.2-xml php8.2-xmlrpc php8.2-zip php8.2-intl php8.2-imagick php8.2-bcmath
调优参数 /etc/php/8.2/fpm/php.ini:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 300
max_input_vars = 3000
sudo systemctl restart php8.2-fpm
第四步:下载 WordPress
cd /tmp && curl -O https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo mkdir -p /var/www/mimangfei.com
sudo cp -a /tmp/wordpress/. /var/www/mimangfei.com/
第五步:设置权限
sudo chown -R www-data:www-data /var/www/mimangfei.com
sudo find /var/www/mimangfei.com -type d -exec chmod 755 {} \;
sudo find /var/www/mimangfei.com -type f -exec chmod 644 {} \;
第六步:配置 Nginx server 块
sudo vim /etc/nginx/sites-available/mimangfei.com
server {
listen 80;
server_name mimangfei.com www.mimangfei.com;
root /var/www/mimangfei.com;
index index.php index.html;
client_max_body_size 64m;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; }
location ~ /\. { deny all; }
}
sudo ln -s /etc/nginx/sites-available/mimangfei.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
第七步:申请 SSL
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d mimangfei.com -d www.mimangfei.com
certbot 会自动加 443 配置并设置自动续期。验证:
sudo certbot renew --dry-run
第八步:完成安装
浏览器访问域名,进入安装向导。填数据库名 wordpress、用户 wpuser、主机 localhost。
常见踩坑与失败案例
- 502 Bad Gateway ——
fastcgi_pass的 sock 路径与 PHP-FPM 实际监听不一致。用ls /run/php/确认实际文件名。 - File not found ——
SCRIPT_FILENAME没设对,或root路径写错。 - 安装插件提示需要 FTP —— 属主不是
www-data,回到第五步重做权限。 - 案例:部署完后上传 8MB 的主题报”超出最大上传大小”,改了 php.ini 仍失败,最后发现
client_max_body_size没配,Nginx 层先拦下了。两层都要改。 nginx -t报 server_name 冲突 ——sites-enabled里还留着 default 站点,删掉软链接即可。- 证书申请失败 —— 域名还没解析到本机 IP,或 80 端口被防火墙挡住。certbot 的 http-01 验证必须能访问 80 端口。
总结
手动部署一次 WordPress 的成本大约 30 分钟,换来的是对整个链路的掌控:出问题知道去哪儿看日志(/var/log/nginx/error.log、/var/log/php8.2-fpm.log),改配置知道影响范围。建议你把这个流程写成 shell 脚本或 Ansible playbook 存下来,下一台服务器几分钟就能复现。
