用nginxWordPress搭建个人博客全流程

24次阅读

共计 6039 个字符,预计需要花费 16 分钟才能阅读完成。

0x00 前言

        WordPress 是世界上最受欢迎的 CMS 系统,它是基于 php 和 MySQL 技术栈的,并且还有很多插件,可扩展性非常强。正好最近有一台空闲的 ECS, 于是来搭建一个玩玩。本教程是基于 LEMP 技术栈来搭建的,各个版本如下:

  1. L 版本为 CentOS7.6 版本,
  2. E 版本为 nginx1.12.2 版本
  3. M 版本为 Distrib 5.5.60-MariaDB
  4. P 版本为 php7.2

此外,现在全面 https 已经是趋势了,自然我们也不能落后,所以还会使用 Let’s Encrypt 来生成免费的 SSL 证书进行配置

0x01 前置条件

  1. 有一个域名,我自己的域名为nomansky.xyz
  2. 一台 VPS 或者云主机,如果是国内的 IP 需要备案
  3. 具有 sudo 权限或 root 权限的用户,这里我新建一个 wordpress 用户来运行程序,并且使用下列命令设置为 nologin
    a. sudo useradd -s /sbin/nologin wordpress
  4. 使用 sudo yum install -y epel-release 安装了 epel 源
  5. 关闭 firewalld,我更喜欢用 iptables 来做安全加固
    a. sudo systemctl stop firewalld
    b. sudo systemctl disable firewalld

0x02 安装 nginx

  1. 执行 sudo yum install nginx 安装 nginx
  2. 启动 nginx 守护进程并设置为开机自启
    a. sudo systemctl start nginx
    b. sudo systemctl enable nginx
  3. 将 wordpress 用户加入到 nginx 组usermod -a -G nginx wordpress, 同时设置目录权限chmod 770 -R /var/lib/nginx/
  4. 此时访问 http://nomansky.xyz 即可看到如下页面,则说明 nginx 安装成功了

0x03 安装 Mariadb

        Mariadb 作为 MySQL 的一个开源的分支,已经成为了 CentOS 用来替换 MySQL 的默认的数据库,所以我这里也使用 Mariadb 作为数据库。

  1. 执行 sudo yum install mariadb-server -y 来安装 mariadb
  2. 启动 Mariadb 并设置为开机自启
    a. sudo systemctl start mariadb
    b. sudo systemctl enable mariadb
  3. 执行 sudo mysql_secure_installation 来加固 Mariadb。你会看到要求设置数据库 root 密码、移除匿名用户、限制只能通过 localhost 登陆数据库 root 用户和移除 test 数据库,这里推荐全部选Y(YES),如下图所示,默认的数据库 root 密码为空
  4. 除此之外,还要把 mariadb 监听的地址改为 127.0.0.1:3306
    a. vim /etc/my.cnf.d/server.cnf 打开 Mariadb 的配置文件
    b. 在[mysqld] 下面加上 bind=127.0.0.1, 如下图所示

    c. 执行systemctl restart mariadb 重启数据库
    d. 执行netstat -lntp 可以看到已经监听为本地回环地址了

0x04 创建数据库

在安装完 mariadb 数据库,并对其进行加固后,我们自然需要新建一个数据库来存放数据,这里首先我们用之前设置的 root 账号密码来登陆数据库mysql -uroot -p,并执行以下几条语句

CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;  # 创建数据库
GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY '你的密码'; # 创建用户
FLUSH PRIVILEGES;                                                            # 刷新数据库权限
EXIT;

0x05 安装 PHP

CentOS 的 PHP 默认版本为 5.4,但是 WordPress 推荐的版本为 7.2,所以我们这里安装 php7.2 的版本
执行下列命令安装 php 和所有需要的 php 扩展

sudo yum install yum-utils
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum-config-manager --enable remi-php72
sudo yum install php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl

我们安装 PHP FPM 是因为我们是用 Nginx 作为 web server,而 Nginx 并没有自带这个组件。此外,PHP FPM 默认是以 apache 用户运行在 9000 端口,我们把这个用户改为 wordpress 并且把它从 TCP Socket 改为 Unix Socket,具体怎么修改查看下面的步骤

  1. 打开/etc/php-fpm.d/www.conf, 并修改如下地方

    ...
    user = wordpress
    ...
    group = wordpress
    ...
    listen = /run/php-fpm/www.sock
    ...
    listen.owner = wordpress
    listen.group = wordpress
  2. 用命令 sudo chown -R root:wordpress /var/lib/php 确保目录的所有组权限为 wordpress
  3. 重启并开机自启动 PHP FPM
    a. sudo systemctl restart php-fpm
    b. sudo systemctl enable php-fpm

0x06 申请免费证书

  1. 作为一个技(qiong)术(bi)宅,自然有免费的证书就肯定用免费的。因此我们可以申请免费的 Let’s Encrypt 证书,这个证书不但免费,而且操作非常简单,虽然每次只有 90 天的有效期,但可以通过脚本配置 crontab 定期更新。
    a. mkdir -p /etc/nginx/ssl目录存放证书
    b. openssl genrsa 4096 > account.key 进入这个目录,创建一个 RSA 私钥用于 Let’s Encrypt 识别你的身份
    c. openssl genrsa 4096 > domain.key 创建域名 RSA 私钥
    d. openssl req -new -sha256 -key domain.key -out domain.csr 有了私钥文件,就可以生成 CSR 文件了。生成 CSR 会要求填入一些东西信息,这里 Common Name 为你的域名
  2. 我们知道,CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let’s Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。所以首先创建用于存放验证文件的目录,例如:
    mkdir /home/wordpress/challenges
    然后配置一个 HTTP 服务,以 Nginx 为例:

    server {
        server_name www.nomansky.xyz nomansky.xyz;
    
        location ^~ /.well-known/acme-challenge/ {
            alias /home/wordpress/challenges/;
            try_files $uri =404;
        }
    
        location / {rewrite ^/(.*)$ https://nomansky.xyz/$1 permanent;
        }
    }

    以上配置表示查找 /home/wordpress/challenges/ 目录下的文件,如果找不到就重定向到 HTTPS 地址。这个验证服务以后更新证书还要用到,要一直保留。

  3. 接下来把 acme-tiny 保存到 ssl 目录wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
  4. 然后指定账户私钥、CSR 以及验证目录,执行脚本python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /home/wordpress/challenges/ > ./signed.crt, 看到如下图所示,则说明生成成功了
  5. 最后还要下载 Let’s Encrypt 的中间证书,配置 HTTPS 证书时既不要漏掉中间证书,也不要包含根证书。在 Nginx 配置中,需要把中间证书和网站证书合在一起:

    wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
    cat signed.crt intermediate.pem > chained.pem
  6. 为了后续能顺利启用 OCSP Stapling,我们再把根证书和中间证书合在一起(此步也可省略)

    wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
    cat intermediate.pem root.pem > full_chained.pem
  7. Let’s Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。创建一个 renew_cert.sh 并通过 chmod a+x renew_cert.sh 赋予执行权限。文件内容如下:

    #!/bin/bash
    
    cd /etc/nginx/ssl/
    python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /home/wordpress/challenges/ > signed.crt || exit
    wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
    cat signed.crt intermediate.pem > chained.pem
    systemctl restart nginx
  8. 在 crontabl 中配置定时任务0 0 1 * * /etc/nginx/ssl/renew_cert.sh >/dev/null 2>&1

0x07 下载 WordPress 并配置 Nginx

  1. 将 WordPress 下载到 /home/wordpress/ 目录下wget https://wordpress.org/latest.tar.gz
  2. tar zxvf latest.tar.gz解压 WordPress 文件
  3. chown -R wordpress:wordpress wordpress将 wordpress 目录的所有者改为 wordpress 用户
  4. 接着,打开 vim /etc/nginx/nginx.conf 将 nginx 的运行角色改为 wordpress

    ···
    user wordpress;
    worker_processes auto;
    ···
  5. 然后这里我把处于解耦合的目的,把主配置文件 nginx.conf 里的 server 配置块注释掉
  6. 新建 sudo mkdir /etc/nginx/snippets 目录并 vim letsencrypt.conf 来将以下配置粘贴到里面

    location ^~ /.well-known/acme-challenge/ {
          alias /home/wordpress/challenges/;
          try_files $uri =404;
    }
  7. 接下来新建 vim /etc/nginx/conf.d/wordpress.conf 配置文件,修改成如下配置

        # Redirect HTTP -> HTTPS
        server {
            listen 80;
            server_name www.nomansky.xyz nomansky.xyz;
    
            include snippets/letsencrypt.conf;
            return 301 https://nomansky.xyz$request_uri;
        }
    
        # Redirect WWW -> NON WWW
        server {
            listen 443 ssl http2;
            server_name www.nomansky.xyz;
    
            ssl_certificate /etc/nginx/ssl/chained.pem;
            ssl_certificate_key /etc/nginx/ssl/domain.key;
    
            return 301 https://nomansky.com$request_uri;
        }
    
        server {
            listen 443 ssl http2;
            server_name nomansky.com;
    
            root /home/wordpress/wordpress;
            index index.php;
    
            # SSL parameters
            ssl_certificate /etc/nginx/ssl/chained.pem;
            ssl_certificate_key /etc/nginx/ssl/domain.key;
    
            # log files
            access_log /home/wordpress/log/nomansky.xyz.access.log;
            error_log /home/wordpress/log/nomansky.xyz.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-fpm/www.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)$ {
                expires max;
                log_not_found off;
            }
    
                                                                                                                                                                                        
  8. 创建日志目录mkdir -p /home/wordpress/log, 并设置权限chown -R wordpress:wordpress /home/wordpress/log
  9. nginx -t查看是否是否语法检查正常,如正常则 nginx -s reload 重载 nginx
  10. 接下来看到 WordPress 页面成功打开了,就此大功告成啦

References:

How to install WordPress with Nginx on CentOS 7
免费好用的 HTTPS 证书

正文完
 0