配置WordPress个人博客全流程

详细的逐步安装php环境,配置Nginx和Mysql的网络上不胜枚举,但是怕作为偷懒小能手我选择用一键脚本。如果对安全性没什么要求,不愿意折腾的,甚至直接搭建完就可以使用了。

当然,最费劲的还是主机备案。。。按着要求一步一步走吧,文章不记录了。

WordPress 脚本部署

用Tlanyan大神的一键脚本即可,脚本包括了对WP的性能优化,支持基本所有的主流系统。

用wget、curl,或者下载然后传到服务器上这个脚本并运行(阿里云一直犯病连不上GitHub,需要去网站解析一下这个raw.githubusercontent.com的真实IP地址,加入到HOST中,或者向天许愿):

# 脚本地址
https://raw.githubusercontent.com/tlanyan/Scripts/master/wordpress.sh
# 例如
apt update && apt install -y curl
# 运行WordPress一键脚本
bash <(curl -sL https://2i.gs/7uFN)

按照提示输入域名什么的,等待片刻,then, all done!

WordPress安装成功!
===============================
WordPress安装路径:/var/www/XXX.XXXX.XXX
WordPress数据库:wordpress
WordPress数据库用户名:wordpress
WordPress数据库密码:XXXXXXXXXXXXXX
博客访问地址:http://XXX.XXXX.XXX
===============================

WordPress至此被成功安装,并配置在HTTP上,将域名解析到VPS的公网IP上,即可通过域名访问及配置。

HTTPS配置

其实我也不知道HTTPS具体是怎么实现的,以后有时间好好学习一下。只是有一个很概述的感觉:HTTPS通过先由服务器向客户端发送SSL证书,客户端检验后从CA中取出公钥,用以解密之后的加密信息传输。

平台申请证书并部署

具体地,我是在腾讯云的新网DNSPod申请的域名,在平台上申请下载SSL证书,导入到本地的目录即可。如果同一提供商好像还有一键部署……但是没办法,谁让腾讯云比万网便宜点呢。

  • 我是直接下载子域名blog.oldbooks.cn的Nginx的证书,保存在Nginx配置文件的目录中“/etc/nginx/conf.d/”(好像规范一点不应该放在这儿,但是😛😛😛)
  • 一键脚本配置完后默认是走80端口的HTTP的,主要有三种写法将HTTP转换成HTTPS:
rewrite ^/(.*)$ https://example.com/$1;
rewrite ^ https://example.com$request_uri? permanent;
return 301 https://example.com$request_uri;

性能略有优略,我就采用第一种正则匹配了。

  • 完全的配置文件如下(/etc/nginx/nginx.conf):
user www-data;
# worker_processes auto;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';

    access_log  /var/log/nginx/access.log  main buffer=32k flush=30s;

    server_tokens       off;
    client_max_body_size 100m;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1; 
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    ssl_stapling on; # Requires nginx >= 1.3.7
    ssl_stapling_verify on; # Requires nginx => 1.3.7
    add_header Strict-Transport-Security "max-age=63072000; preload";
    #add_header X-Frame-Options DENY;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

    fastcgi_cache_path /dev/shm/wordpress levels=1:2 keys_zone=wordpress:30m inactive=30m use_temp_path=off;
    fastcgi_cache_key $request_method$scheme$host$request_uri;
    fastcgi_cache_lock on;
    fastcgi_cache_use_stale error timeout invalid_header updating http_500;
    fastcgi_cache_valid 200 301 302 30m;
    fastcgi_cache_valid 404 10m;
    fastcgi_ignore_headers Expires Set-Cookie Vary;

    gzip on;
    gzip_min_length  2k;
    gzip_buffers     4 16k;
    gzip_comp_level 4;
    gzip_types
        text/css
        text/plain
        text/javascript
        application/javascript
        application/json
        application/x-javascript
        application/xml
        application/xml+rss
        application/xhtml+xml
        application/x-font-ttf
        application/x-font-opentype
        application/vnd.ms-fontobject
        image/svg+xml
        application/rss+xml
        application/atom_xml
        image/jpeg
        image/gif
        image/png
        image/icon
        image/bmp
        image/jpg;
    gzip_vary on;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}
  • 以及WordPress站点的配置文件(/etc/nginx/conf.d/XXX.XXXXX.XX.conf), 将XXX.XXXXX.XX替换成域名
server {
    listen 80;    
    server_name XXX.XXXXX.XX;
    rewrite ^(.*) https://$server_name$1 permanent;
}

server {
    listen 443 ssl;
    server_name XXX.XXXXX.XX;
    charset utf-8;
    set $host_path "/var/www/XXX.XXXXX.XX";
    access_log  /var/log/nginx/XXX.XXXXX.XX.access.log  main buffer=32k flush=30s;
    error_log /var/log/nginx/XXX.XXXXX.XX.error.log;

    ssl_certificate /etc/nginx/conf.d/XXX.XXXXX.XX.crt;
    ssl_certificate_key /etc/nginx/conf.d/XXX.XXXXX.XX.key;
    ssl_protocols TLSv1.2 TLSv1.3; 
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    keepalive_timeout 70;

    root   $host_path;

    set $skip_cache 0;
    if ($query_string != "") {
        set $skip_cache 1;
    }
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml") {
        set $skip_cache 1;
    }
    # 登录用户或发表评论者
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

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

    location / {
        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ ^/\.user\.ini {
            deny all;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_index index.php;
        fastcgi_cache wordpress;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
    location ~ \.(js|css|png|jpg|jpeg|gif|ico|swf|webp|pdf|txt|doc|docx|xls|xlsx|ppt|pptx|mov|fla|zip|rar)$ {
        expires max;
        access_log off;
        try_files $uri =404;
    }
}

ACME申请Let’s Encrypt签发的SSL证书

我的阿里云VPS连接github实在是吃力,没选择这个方法。这个方法是从Let’s Encrypt网站上申请免费的证书,这个SSL证书的有效期是3个月,脚本还用cron建立了自动更新程序,我国外的服务器用的是这个方案。这里简单写一下,详情可以看下面的链接

# 更新
apt update -y          
apt install -y curl   
apt install -y socat 

# 安装
curl https://get.acme.sh | sh

# 更新:新版acme.sh使用ZeroSSL作为CA,建议切换到Let’s Encrypt的CA:
# acme.sh --set-default-ca --server letsencrypt


——————————————————————————————————
# 80 端口空闲的证书申请方式
~/.acme.sh/acme.sh --register-account -m xxxx@xxxx.com
~/.acme.sh/acme.sh  --issue -d mydomain.com   --standalone

# 安装证书到指定文件夹
~/.acme.sh/acme.sh --installcert -d mydomain.com --key-file /root/private.key --fullchain-file /root/cert.crt
——————————————————————————————————


——————————————————————————————————
# 如果你的服务器上已经运行了web软件,指定webroot即可签发证书
~/.acme.sh/acme.sh --issue -d 域名 --webroot webDir
## 如果要为多个域名签发,直接加 -d 域名 就可以。

# 如果网站已经运行Nginx/Apache,指定对应插件就可以了
~/.acme.sh/acme.sh --issue -d 域名 --nginx # 如果是apache,换成 --apache

# 也可以使用DNS方式,手动添加DNS记录进行验证
~/.acme.sh/acme.sh --issue --dns -d 域名
## 命令结束后,acme.sh会显示解析记录,需要到DNS后台设置解析
## 设置好解析后,生成证书
~/.acme.sh/acme.sh --renew -d 域名

# 安装证书到指定文件夹
~/.acme.sh/acme.sh --install-cert -d 域名 \
--key-file       密钥存放目录  \
--fullchain-file 证书存放路径 \
--reloadcmd     "service nginx force-reload"  # --reloadcmd是可选的,用来安装好证书后重启web服务器。

插件安装

插件按需安装吧,我安装了Akismet、All-in-One WP Migration、Elementor、Post Views Counter、Smush、UpdraftPlus、Wordfence、多合一SEO集 和 超级缓存

FTP服务器管理备份

后来发现有很多插件可以导出备份文件到另一台主机——Google Drive, One Drive,WebDAV,以及SFTP等等。最开始我只安了UpdraftPlus😂,除了不加密的FTP其他全是收费的。因而打算用内网的树莓派做一个FTP服务器

刷入系统

我刷入的是Ubuntu Server 21.10 arm64的镜像。最开始刷入的桌面版感觉卡卡的,毕竟树莓派4B只满足了最低的硬件需求。

刷入过程比较简单,直接官网下载 Raspberry Pi Imager 就可以了。

值得一提的是,作为一个没把树莓派连网线接路由器的人,你需要要么在装系统之前改一下配置文件,把WiFi信息写进去,或者安装完系统更改 /etc/netplan/50-cloud-init.yaml 配置文件

network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2
    wifis:
        wlan0:
            optional: true
            access-points:
                "SSID-NAME-HERE":
                    password: "PASSWORD-HERE"
            dhcp4: true

注意,配置文件中的四个空格踏踏实实打空格,不可以TAB

然后,应用配置:

$ sudo netplan apply
# 不成功可以看看Debug信息
$ sudo netplan --debug apply

一切成功后,可通过ip命令查看信息

$ ip a

另外就是一个树莓派玩家上来就会做的事:换源,就不赘述了。

FTP服务器

依照这两篇文章快速搭建一个VSFTPD的服务器了:How To Install and Configure FTP Server on Ubuntu With VSFTPD (phoenixnap.com)Set up Raspberry Pi FTP Server {Step-by-Step} | phoenixNAP KB

我们需要注意两个点,第一个是在建立自定义上传目录时候,需要赋予拥有者以及读写权限。

stat YOUR_DIR                     # 查看权限
chmod 750 YOUR_DIR                # 赋予读写权限
chown USER:USER_GROUP YOUR_DIR    # 更改所有者

这个帖子的前半部分讲了一些建立允许访问的用户列表:Ubuntu配置ftp_zhangxiaowei-CSDN博客_ubuntu安装ftp

另一个就是需要将FTP服务器由主动模式(PORT)改成被动模式(PASV)

原因是:机制上主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。详情请看FTP的主动模式和被动模式 – 学海无涯2020 – 博客园 (cnblogs.com),因此为了保证只开放固定几个端口的安全需要,需要被动模式

# /etc/vsftpd.conf
……
listen =YES
pasv_enable=YES
pasv_min_port=10020
pasv_max_port=10022
pasv_address=YOUR_PUBLIC_IP

FRP内网穿透

因为树莓派是家庭网络环境的内网机器,FTP无法直接访问到,因此我们需要先将树莓派穿透到阿里云,其实也相当于给阿里云挂载了一块儿我的本地的硬盘备份用。之前别的服务用的Nps一直很好用,也不用自己配置守护进程。frp就需要麻烦点,但是配置文件比较好写。两个仓库我放在最下方了。

# 下载同版本的server端和client端分别拷到树莓派和公网VPS,解压tar xzf
————————————————————————————————————
# 修改frpc.ini,修改后储存到/etc/frp
[common]
server_addr = YOUR_PUBLIC_IP
server_port = 10001

[ftp_21]
type = tcp
local_ip = 127.0.0.1
local_port = 21
remote_port = 5999

[ftp_data1]
type = tcp
local_ip = 127.0.0.1
local_port = 10020
remote_port = 10020

[ftp_data2]
type = tcp
local_ip = 127.0.0.1
local_port = 10021
remote_port = 10021

[ftp_data3]
type = tcp
local_ip = 127.0.0.1
local_port = 10022
remote_port = 10022

————————————————————————————————————
# 修改frps.ini,修改后储存到/etc/frp
[common]
bind_port = 10001

————————————————————————————————————
# 将systemd文件夹里的frp*.service,均放到/etc/systemd/system/
# 设置权限
chmod 754 frp*.service
# 启用服务
systemctl enable frp*.service

————————————————————————————————————
# 将frpc/frps编译好的程序放到/usr/bin中
# 赋予权限
chmod +x /usr/bin/frpc # 或frps
# 启动守护服务
systemctl start frp*.service

注意安全组放行相应的端口以便frp连接。配置好,可以先通过 FTP服务器连接测试 (infobyip.com) 测试一下。

一些杂项

例行维护

WordPress在升级程序、主题、插件时,都会先切换到维护模式,也就是显示 “正在执行例行维护,请一分钟后回来(Briefly unavailable for scheduled maintenance. Check back in a minute)”,如果升级顺利,也就几秒左右就恢复正常;但是如果由于网速不佳等原因导致升级中断,WordPress就会一直停留在维护模式,不论前台还是后台,都一直显示“正在执行例行维护,请一分钟后回来“。

解决方法:删除WordPress根目录下的.maintenance即可(如此安装,根目录在/var/www/YOUR_DOMAIN/)

若没有该文件,参照显示“正在执行例行维护,请一分钟后回来”解决方案——WordPress教程|仙踪小栈 (ixianzong.com)

上传限制

在根目录建一个info.php的文件内容如下:

<?php

echo
  phpinfo();

?>

访问这个文件https://YOUR_DOMAIN/info.php,找到php.ini的位置,对其修改以下参数:

# 修改参数php.ini
memory_limit=128M    //相当于单个脚本可调用内存大小
post_max_size=8M     //上传文件大小上限
upload_max_filesize=2M  //默认上传文件大小,这个就是2M的限制!
max_execution_time=30  //最大执行时间,页面等待时间
max_input_time=60    //最大输入时间?具体意义不明确,就是上传时间相关

# 更改后重启服务
nginx -s reload
service php-fpm restart

未完待续

还有一个什么事儿我给忘了。总之告一段落,想起来再写。

Useful Links

tlanyan/Scripts: Frequently used scripts (github.com)

Nginx下 return 和 rewrite在 301重定向上的区别_lijun_work的博客-CSDN博客_return和rewrite的区别

WordPress性能优化 – tlanyan

WordPress一键脚本 – tlanyan

24款优秀的WordPress必备插件推荐 – WP主题站 (themeforwp.net)

有哪些实用的WordPress 插件值得推荐? – 知乎 (zhihu.com)

显示“正在执行例行维护,请一分钟后回来”解决方案——WordPress教程|仙踪小栈 (ixianzong.com)

修改WordPress中附件上传大小限制_Jeffrey‘s workspace-CSDN博客

Index of /raspios_arm64/images (raspberrypi.org)

使用acme.sh签发证书 – tlanyan

FTP服务器连接测试 (infobyip.com)

fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. (github.com)

ehang-io/nps: 一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。a lightweight, high-performance, powerful intranet penetration proxy server, with a powerful web management terminal. (github.com)

《树莓派4B家庭服务器搭建指南》刷Ubuntu Server 20.04,绑定公网域名,对公网提供http服务,SSH登录服务 – V2方圆 (v2fy.com)

Ubuntu 20.04: Connect to WiFi from command line – Linux Tutorials – Learn Linux Configuration

树莓派4安装ubuntu server20.04 &&WIFI 配置(提供WIFI配置文件 —避免入坑,亲测有效!!!)_Starry-SkyJing的博客-CSDN博客

树莓派4B安装ubuntu server 解决wifi问题 – 程序员大本营 (pianshen.com)

How To Install and Configure FTP Server on Ubuntu With VSFTPD (phoenixnap.com)

Set up Raspberry Pi FTP Server {Step-by-Step} | phoenixNAP KB

FTP的主动模式和被动模式 – 学海无涯2020 – 博客园 (cnblogs.com)

Ubuntu配置ftp_zhangxiaowei-CSDN博客_ubuntu安装ftp

在公司使用家里树莓派的 ftp 服务 – 链滴 (ld246.com)

修改WordPress中附件上传大小限制_Jeffrey‘s workspace-CSDN博客

Leave a Comment

您的电子邮箱地址不会被公开。