建立WordPress博客的一点小经验

(图文无关,实在找不到更好的图了)

关于为何要写

很简单,最近没啥想更新的了,水篇文章。

对WordPress本身

劝退

WordPress的缺点就是它应用太过广泛了。如果不搞些安全措施,你会发现log里全是failed login。

如果可以,我个人更建议搞个纯静态博客,例如Hexo之类。我是尾大不掉,先就在WordPress上捆着得了。

关于Gutenberg区块编辑器

建议目前先禁用,等五年再说。这玩意儿用起来真的很操蛋。

具体多操蛋?其实很简单来着,如下。

关于加强安全

这个嘛……我倒是有俩方向,一个是CDN做好限制,一个是服务器做好限制。前者是防摸到真实IP就DDoS,后者就是防bot的漏洞扫描扫到站点攻破。

然而,事实证明我的防线全炸。原因是这样的:虽然说我的VPS,IPv4 NAT只给了个443和40000~65535端口,但是IPv6是有公网IP,且没有防线啊!更操蛋的是,我家和学校都没有IPv6,广电,广大炮,广断网,广没六,广五十兆,超级小广,广just works,要IPv6甚至需要且只能翻墙!!!!!!我甚至根本用不了IPv6来登录我的博客!

所以登录白名单选择天津和西安的所有IPv4地址(我天津和西安双线往返),IPv6全部拉黑(广电,广大炮,广断网,广没六,广五十兆,超级小广,广just works)。

哦对了,记得选个能重命名wp-login和禁用xmlrpc登录的插件。别问为什么。

对承载它的东西

VPS

选择什么Web服务器

看你心情。

Apache2主要优势在跨平台,Windows Server都能用,但是Nginx不行。配置文件如下。

apache2配置文件
#<VirtualHost *:80>
#       RewriteEngine On
#       RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
#       RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
#</VirtualHost>

<VirtualHost *:443>
        #RewriteEngine On
        #RewriteBase /
        #RewriteRule ^index.php$ – [L]
        #RewriteCond %{REQUEST_FILENAME} !-f
        #RewriteCond %{REQUEST_FILENAME} !-d
        #RewriteRule . /index.php [L]

        SSLEngine on

        #LoadModule ssl_module modules/mod_ssl.so
        #LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

        ServerName tuskede0.top

        ServerAdmin [email protected]
        DocumentRoot /you/guess

        <Directory /you/guess>
            Options FollowSymLinks
            AllowOverride All
            DirectoryIndex index.php
            Require all granted
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLCertificateFile /etc/letsencrypt/live/tuskede0.top/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/tuskede0.top/privkey.pem

        # enable HTTP/2, if available
        Protocols h2 http/1.1

        # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
        #Header always set Strict-Transport-Security "max-age=63072000"

        <Files "xmlrpc.php">  
                Require all denied
        </Files>

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

Nginx主要图一个快,但是php需要一个php-fpm服务。配置文件如下。

nginx配置文件
# generated 2025-01-22, Mozilla Guideline v5.7, nginx 1.27.3, OpenSSL 3.4.0, intermediate config
# https://ssl-config.mozilla.org/#server=nginx&version=1.27.3&config=intermediate&openssl=3.4.0&guideline=5.7
server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name tuskede0.top;
        root /you/guess/;
        index index.php;
        http2 on;
        ssl_certificate /etc/letsencrypt/live/tuskede0.top/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/tuskede0.top/privkey.pem;
        # HSTS (ngx_http_headers_module is required) (63072000 seconds)
        add_header Strict-Transport-Security "max-age=63072000" always;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }
        
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

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

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass unix:/run/php/php-fpm.sock;
            fastcgi_index   index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
            expires max;
            log_not_found off;
        }
}

# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519:prime256v1:secp384r1;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
#ssl_prefer_server_ciphers on;

# see also ssl_session_ticket_key alternative to stateful session cache
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
#ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"

# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;

# verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /etc/letsencrypt/live/tuskede0.top/fullchain.pem;

# replace with the IP address of your resolver;
# async 'resolver' is important for proper operation of OCSP stapling
resolver 127.0.0.1;

# If certificates are marked OCSP Must-Staple, consider managing the
# OCSP stapling cache with an external script, e.g. certbot-ocsp-fetcher

# HSTS
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        return 301 https://$host$request_uri;
}

而OpenLiteSpeed则是对WordPress有优化,但是它不跟随Debian Testing进度,对追新用户不太友好;几乎是全GUI配置,对小白用户来说配置容易,但是这是个降低效率的傻逼办法(具体体现在从Apache2到Nginx理论上只需要复制(预制)配置文件,停掉apache2,启动nginx和php-fpm就好;但openlitespeed需要先停服务器停止占用80和443,然后再配置);lsphp本身是个裁剪版的php,不能运行phar(lsphp不会认为这是个可执行的php文件)。(如果是要用wp-cli,建议用系统给的php,而非lsphp执行)

别找我要openlitespeed配置文件,点触摸板点的手要麻了,没预制菜可吃。

选择系统

看你心情。是的,梅开二度。

我是选择了Debian,主要原因是实在不熟悉CentOS,从7更新到8根本升不上去(也可能是8中道崩殂,7的包相比8要新得多)。

Debian的优势在文档手把手教你配,但是对于那些想追求一些自由度的人来说得多学学。例如Debian Wiki给的安装WordPress教程是LAMP方案的,而非更快的LNMP。实际上经验都是相通的。

CentOS主要优势是RHEL文档。没开玩笑,真的。对于大多数RHEL-based或RHEL-like发行版来说,RHEL的文档真的是万能教材,就是IBM之前发现红帽公司某天图标绿绿的,名字还有点怪(成了GreenHat),就一枪崩掉了CentOS,还顺带把那些给它戴绿帽的发行版也毙掉了ABI兼容。

之后提到的默认发行版为Debian Testing。我服务器毕竟不是求稳如死狗的,这狗至少得动。

选择对象缓存(NoSQL)

我选择不费脑子,对于个人博客来说Memcached,对于需要高并发、多端部署之类的Redis。这俩我都配过,单机配置都不需要脑子。

参考文章:

但是,在低内存场景下,不要选择Memcached!这玩意儿把我可怜的1GB内存占满了,我还以为是上游问题,强制重启切换回Redis就无事发生了。

配置自动更新

对于一个个人博客来说,适当追新没嘛问题。可惜我除了实在伤心会猛敲oma full-upgrade和yay -Syyu –noconfirm排解心情之外就不会显得没事跑更新去了,所以我配置了自动更新。

一般的,WordPress的自动更新不需要你担心。

对于Debian来说,有这么一个包叫unattended-upgrades,这玩意儿是走systemd的,最好再配置一下apt。自动重启的话我没啥意见,最多拖慢点访问速度(重启就不到10秒,除非有邻居下片)。(上游修了这个问题)

我更改的/etc/apt/apt.conf.d/50unattended-upgrades配置
// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
Unattended-Upgrade::Automatic-Reboot "true";

SSL

简单,上certbot。自动续期美滋滋。

个人空间

这个嘛……预制菜,看看就好了。对于那些什么都不想管的,个人空间是一个比较好的选择了,但是它自由度实在不高。

SSL

部分提供商会要求你自己找腾讯云之类要个证书,但是WordPress上也有插件能配SSL。基本上按它要求来就好,至于插件提示不行但实际可以的忽略就好。提供者为Let’s Encrypt。

当然你也可以套个CloudFlare,那玩意儿就是走灵活(Flexable)加密(浏览器到CloudFlare加密,CloudFlare到服务器不加密)了。


发布于

分类:

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


许可协议

更多文章