搭建自己的wordpress

一、在自己的机器上先用Docker进行尝试

基本的想法是,用Docker容器做服务器,先把流程走一遍。

1. 运行一个web应用

这一部分只是用来练手的,好让自己知道一个基本的、可运行的web应用如何启动、如何验证。

1-1. 在默认的IP地址上运行

docker pull training/webapp # 拉取镜像
docker run -it --rm -P training/webapp python app.py

使用docker port Container_ID来查看容器的信息,结果如下

5000/tcp -> 0.0.0.0:32768

使用ifconfig来查看网络的配置,找到一个叫作docker0的网卡,它的信息中包括下面一行

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

可见,IP地址为172.17.0.1。然后我们在宿主机的浏览器地址栏中输入172.17.0.1:32768,出现如下的界面
enter description here

表明这个web应用运行成功。

那我们可不可以自己指定web应用的IP地址呢?试一下。

docker run -it --rm -p 192.168.21.2:5000:5000 training/webapp python app.py

提示如下错误信息

docker: Error response from daemon: driver failed programming external connectivity on endpoint practical_dubinsky(d5f50652d7c17b254d9ddbd21bde69b3b8febf4876635ebdb718a2eacdcd12eb): Error starting userland proxy: listen tcp 192.168.21.2:5000:bind: cannot assign requested address.

按照如下方法尝试

wd@wd-HBL-WX9:~$ docker run -it --rm -p 172.17.0.1:5000:5000 training/webapp python app.py

成功运行,使用docker ps查看容器信息为

wd@wd-HBL-WX9:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                       NAMES
ff98fcbae29f        training/webapp     "python app.py"     16 seconds ago      Up 15 seconds       172.17.0.1:5000->5000/tcp   vigorous_davinci

可见,只能指定ifconfig所列出来的docker0的IP地址。实际上,ifconfig显示还有另外两个网卡,它们的IP地址分别为127.0.0.1192.168.21.100,可否指定这两个端口呢?试一下。经过测试,这两个都是可以的。

2. 在ubuntu18.04 docker中进行安装配置

运行ubuntu18.04容器

docker run -it ubuntu:18.04 bash

安装vim

apt update
apt install vim

把apt源改为阿里云

cd /etc/apt
cp sources.list sources.list.backup
vim sources.list

删除sources.list中的内容,并把以下内容复制进去

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

然后执行apt update
在其中安装ifconfig

apt update
apt install net-tools

在docker中运行ifconfig,发现docker的IP为172.17.0.2,在宿主机中使用ping 172.17.0.2,可以ping通。

2-1. 安装ngnix

Nginx是一个免费的开源高性能HTTP和反向代理服务器,负责处理互联网上一些最大的网站的负载。它的安装只需要下面一条命令

apt install nginx

查看nginx版本

nginx -v

返回

nginx version: nginx/1.14.0 (Ubuntu)

在容器中输入service nginx start来启动nginx服务。然后在宿主机上的浏览器中输入IP地址172.17.0.2,出现如下所示的nginx欢迎界面,说明安装成功。
enter description here

2-2. 安装MySQL

也只需要一条命令

apt install mysql-server mysql-client

安装完成后输入命令mysql -u root,结果出现了如下的问题

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

在网上找到一种方法:先使用命令mysql --help | grep 'my.cnf',返回内容为

                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

我把/etc/my.cnf/etc/mysql/my.cnf两个文件删除了(前一个其实并不存在),然后运行下面的命令重启服务

service mysql restart

然后执行mysql -u root命令,成功进入,返回如下信息

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.29-0ubuntu0.18.04.1 (Ubuntu)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

使用如下命令把root的密码进行更新

mysql> use mysql;
mysql> update mysql.user set authentication_string=PASSWORD('新密码'), plugin='mysql_native_password' where user='root';
mysql>flush privileges;

执行如下命令

mysql> exit;
service mysql restart
mysql -u root -p

此时就需要输入密码才能进入数据库了。说明密码设置成功。
通常,我们应该为wordpress单独创建一个数据库(wordpress)和用户(wpuser)

mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

mysql> create user wpuser@localhost identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> 

其中password是你的密码。
创建完WordPress数据库和用户后,需要将这两者关联起来:

mysql> grant all privileges on wordpress.* to wpuser@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> 

2-3. 安装PHP

使用如下命令

apt install php php-fpm php-mysql

查看PHP版本

php -v

输出如下信息

PHP 7.2.24-0ubuntu0.18.04.3 (cli) (built: Feb 11 2020 15:55:52) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.24-0ubuntu0.18.04.3, Copyright (c) 1999-2018, by Zend Technologies

发现安装的是7.2版本的。应该表示PHP安装成功。

2-4. 配置Nginx解析PHP

  1. 备份Nginx配置文件
    cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
  2. 修改Nginx配置文件,增加对PHP的支持(若不添加此配置信息,后续您使用浏览器访问PHP页面时,页面将无法显示。)
    1. 打开Nginx配置文件
      vim /etc/nginx/sites-available/default
    2. 第41行原本为root /var/www/html;,修改为root /var/www;。这一行用来指定网站的根目录,应该也可以指定为自己的其它的目录。
      第44行原本为index index.html index.htm index.nginx-debian.html;,修改为index index.php index.html index.htm index.nginx-debian.html;,也就是增加了index.php这一项。
    3. 修改第56行到63行如下
      1. location ~ \.php$ { 
      2. include snippets/fastcgi-php.conf; 
      3. # 
      4. # # With php-fpm (or other unix sockets): 
      5. # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; 
      6. # # With php-cgi (or other tcp sockets): 
      7. fastcgi_pass 127.0.0.1:9000; 
      8. } 
      这些内容在文件中都存在,只不过是都被注释了,只需要把第56、57、62、63行(对应到这里的第1、2、7、8行)的注释符号删掉就可以了。
    4. 执行命令service nginx restart,重启Nginx。返回重启成功的提示。
  3. 修改PHP配置文件
    cp /etc/php/7.2/fpm/pool.d/www.conf /etc/php/7.2/fpm/pool.d/www.conf.backup #备份
    vim /etc/php/7.2/fpm/pool.d/www.conf #修改
    第36行的代码是listen = /run/php/php7.2-fpm.sock,在它的前面加上一个;,然后在第37行(原本为空)中加上如下内容:listen = 127.0.0.1:9000
    修改之后,使用命令service php7.2-fpm restart重启php7.2-fpm。结果报错
     * Restarting PHP 7.2 FastCGI Process Manager php-fpm7.2                         [fail] 
    哈哈,因为我的 php7.2-fpm服务就没有启动,所以当然不能重启啦。先使用service php7.2-fpm start启动服务,再用上面的命令重启服务就没有问题啦。
    使用service service_name status命令可以查看service_name所指明的服务的状态。
  4. 验证配置结果
    /var/www/里面新建文件info.php文件,它的内容如下
    1. <?php 
    2. phpinfo(); 
    在宿主机的浏览器中输入172.17.0.2/info.php,出现如下显示PHP版本信息的页面,说明配置成功。
    enter description here
    到此,LNMP环境就配置完了。

2-5. 安装WordPress

这是参考官方网站的介绍来做的。大部分内容都是原文复制过来的。

  1. 下载WordPress安装包并解压
    在容器中使用如下命令来下载WordPress

    1. wget http://wordpress.org/latest.tar.gz 
    2. tar -xzvf latest.tar.gz 

    这样WordPress压缩包将会解压缩至文件夹wordpress ,这个文件夹与你下载的latest.tar.gz压缩包处于同一个目录下。下载的时候可能会遇到too many request的问题,网上有很多的解决方法。

  2. 创建WordPress数据库和一个用户
    若决定手动创建数据库,可以根据下文中使用cPanel使用phpMyAdmin中的操作说明进行操作。你也可以利用shell运行mysql语句,快速而方便地创建MySQL用户和数据库。下面给出创建语句,其中美元符号表示命令提示符:

    1. $ mysql -u adminusername -p 
    2. Enter password: 
    3. Welcome to the MySQL monitor. Commands end with ; or \g. 
    4. Your MySQL connection id is 5340 to server version: 3.23.54 
    5.  
    6. Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 
    7.  
    8. mysql> CREATE DATABASE databasename; 
    9. Query OK, 1 row affected (0.00 sec) 
    10.  
    11. mysql> GRANT ALL PRIVILEGES ON databasename.* TO "wordpressusername"@"hostname" 
    12. -> IDENTIFIED BY "password"; 
    13. Query OK, 0 rows affected (0.00 sec) 
    14.  
    15. mysql> FLUSH PRIVILEGES; 
    16. Query OK, 0 rows affected (0.01 sec) 
    17.  
    18. mysql> EXIT 
    19. Bye 
    20. $  

    从这个例子中可以看出:

    • 根用户名(root)也是管理员用户名(adminusername)。用看似"普通"的名称作为mysql管理员名称更加安全,这样就不会把"mysql"命令作为系统根用户输入了。(尽量避免以根用户的身份工作,降低被发现的可能性)。数据库管理员使用mysqladmin时的用户名可以作为mysql用户名。
    • wordpress或blog都是数据库名称的理想选择。
    • 可以用wordpress作为wordpress用户名,但需要注意,如果在这里使用wordpress,所有人都能猜出你的 wordpress用户名。
    • hostname通常是localhost。如果不知道将hostname设为什么并且自己不是WordPress虚拟主机的管理员,请查看系统管理员信息。系统管理员可以考虑使用非根用户账号来管理数据库。
    • 应选择保密性较高的密码,最好是大小写字母、数字及符号的组合。避免使用字典中的某个单词,可以选择自己能够记住的一个词组中每个单词的首字母作为密码。

    包括数据库名称、wordpress用户名、hostname以及密码,这些信息已经在(或者会暂时在)wp-config.php文件中,也没有必要在别的地方重复记录了。
    在前面配置MySQL的时候我们已经创建了数据库和用户。

  3. 设置wp-config.php文件

  4. 用户可以亲自创建并编辑wp-config.php文件,也可以在运行安装脚本(第五步)时让WordPress帮助用户编辑wp-config.php(不过仍然需要告诉WordPress我们的数据库信息)。在这里我选择让WordPress帮助我编辑,如果你要自己编辑的话参见官网的介绍。

  5. 上传文件
    接下来需要决定将博客放在网站的什么位置上:

    • 网站根目录下(如:http://example.com/,我的是172.17.0.2

      • 如果需要将文件上传到web服务器,可用FTP客户端将wordpress目录下所有内容(无需上传目录本身)上传至网站根目录
      • 如果文件已经在web服务器中且希望通过shell访问来安装wordpress,可将wordpress目录下所有内容(无需转移目录本身)转移到网站根目录

      在2-4中,我把根目录设置为了/var/www,所以我使用cp -r /wordpress/* /var/www/wordpress中的所有内容都转移到了/var/www目录下。

    • 网站子目录下(如:http://example.com/blog/

      • 如果需要将文件上传到web服务器,需将wordpress目录重命名,之后用FTP客户端将重命名后的目录上传到网站根目录下某一位置
      • 如果文件已经在web服务器中且希望通过shell访问来安装wordpress,可将wordpress目录转移到网站根目录下某一位置,之后重命名 wordpress目录

      说白了就是把wordpress中的所有内容复制到网站根目录下的一个子目录中。

  6. 运行安装脚本
    在宿主机的浏览器中运行安装脚本,我把wordpress中的文件放在了网站的根目录下,所以我在宿主机的浏览器中访问172.17.0.2/wp-admin/install.php。出现了如下的安装wordpress的界面
    enter description here
    点击Let's go!开始安装。

    1. 配置数据库
      在下面的界面中输入为WordPress创建的数据库信息
      enter description here
      点击submit,出现如下的错误
      enter description here
      因为没有在网站根目录下找到wp-config.php这个文件,我们可以按照这里给出的方法来解决。
      最终,成功地进入了如下的配置界面
      enter description here

2-6. 使用小书匠发布文章

  1. 安装php-xml
    apt install php-xml
  2. 在如下界面填写信息
    enter description here
    在这里,博客地址就是你的博客网址,在我这里就是IP地址172.17.0.2,用户名和密码就是你在安装WordPress时给网站设置的用户名和密码(不是数据库的用户名和密码)。

上面两步做完了之后,就可以把小书匠写的markdown文章推送到自己的博客上了。

3. 后续使用问题

3-1. 小书匠发布文章时出现以下问题

上传文件(9c6358f1520f4b3b677f1efa568d36f3.png)出错: Error: parse error. not well formed
发送失败: Error: parse error. not well formed

网上说是没有安装php-xml,安装上,然后用命令service nginx restart来重启nginx服务,用service php7.2-fpm restart来重启php7.2-fpm服务,重启成功。那我们再试一下在小书匠里面发布吧。发布成功!!!

3-2. 图片上传问题

本地的图片是没有办法上传的,可能要用到图床来解决。

3-3. 更新时要连接FTP的问题

连接不成功,我也没有在容器中设置过FTP,知乎上有人说是由于下面的原因

由于你的 Wordpress 所在的目录没有写入权限,无法完成更新。所以 Wordpress 想跟你要所在目录的 FTP 的权限。然而,由于以下可能的原因之一:
1. 你输入的 FTP 地址是错的;
2. 你的 Wordpress 所在服务器根本就没有 FTP 服务;
3. 你的 Wordpress 所在的服务器的 FTP 服务出了点问题;
4. 你的 Wordpress 所在服务器的 FTP 服务拒绝你连接、或是其它无法正常连接的情况。

作者:yuanyuanVivian
链接:https://www.zhihu.com/question/28910605/answer/50867516
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在容器中运行service --status-all,发现我这没有ftp服务,参考博客安装配置ftp服务

  1. 安装ftp服务
    apt install vsftpd
  2. 为FTP添加用户user_name
    useradd -m user_name
  3. 为用户user_name设置密码
    passwd user_name
    然后试了一下,还是不行。然后在容器中的wp-config.php文件的最后加上下面这一行
    define("FS_METHOD","direct");
    这个问题解决了,并且,单独添加最后一句就可以解决,可是这是为什么呢?我做了什么?另外,又出现了too many request的问题。

3-4. 解决too many request问题和主题插件的更新问题

参考了网站。在容器的WordPress的插件目录(我的是/var/www/wp-content/plugins)中创建一个文件,命名为plugin_name.php,把以下内容写进去

  1. <?php 
  2. /* 
  3. Plugin Name: wp101.net中文下载镜像 
  4. Plugin URI: https://wpsilo.com/wordpress-429.html 
  5. Description: wp101.net中文下载镜像 
  6. Version: 1.0 
  7. Author: wpsilo.com 
  8. Author URI: http://wpsilo.com 
  9. */ 
  10. add_filter('site_transient_update_core', function($value){ 
  11. foreach ($value->updates as &$update) { 
  12. if($update->locale == 'zh_CN'){ 
  13. $update->download = 'http://cn.wp101.net/latest-zh_CN.zip'; 
  14. $update->packages->full = 'http://cn.wp101.net/latest-zh_CN.zip'; 
  15. } 
  16. } 
  17. return $value; 
  18. }); 

然后就可以在自己博客的控制面板中看到一个叫作wp101.net中文下载镜像的插件了,启用它。发现并没有用。
然后尝试使用一个叫作Kill 429 -完美解决WordPress 429 Too Many Requests报错的插件。在网上搜索下载这个插件,解压,然后把它复制到容器中的WordPress的插件目录中去。然后刷新页面,就可以看到这个插件,启用这个插件,然后就可以对这个插件进行设置,具体的使用过程参见这个插件的官网。结果发现也没有用。

哎呀算了,不试了,就采用kexue上网把插件和主题下载下来然后复制到容器中指定位置的办法来做吧。

3-5. 上传文件出错

上传文件(enter_description_here.png)出错: Error: 无法写入文件enter_description_here.png(无法建立目录wp-content/uploads/2020/03。有没有上级目录的写权限?)。
意思就是说,把文件enter_description_here.png上传到容器中的网站根目录下的wp-content/uploads/2020/03中的时候出现了错误,没有写的权限。解决的办法是修改权限。

  1. 查看wp-content目录的权限
    wp-content的父目录中使用命令ls -ld wp-content,返回如下信息:

    drwxr-xr-x  5 root root  4096 Mar 31 13:05 wp-content

    这里,从左到右各个部分分别是如下的含义:
    1. drwxr-xr-x:对象的类型和权限
    2. 5:子目录个数(应该是包括了./../这两个特殊的目录)
    3. root:目录所有者
    4. root:目录所在组
    5. 4096:目录中内容的属性大小
    6. Mar 31 13:05:目录中文件增加或减少或更名的时间
    7. wp-content:目录名称

    然后再仔细看看第一项,drwxr-xr-x,它里面有10个字母,第一个字母表示类型,这里是d,表示类型是目录,第2个到第10个这9个字母从前到后3个一组,分别表示目录所有者权限(u)、组成员权限(g)和其它用户权限(o)。每组内可以出现下面4个字母中的3个,每个字母代表一种权限,同时也被赋于一个数字的值:
    1. r:对于文件,表示可以查看文件内容;对于目录,表示可以用ls查看目录中存在的文件名称,对应的数字的值为4
    2. w:对于文件,表示可以更改文件的内容,对于目录,表示可以删除目录中的子文件或者子目录,对应的数字的值为2
    3. x:对于文件,表示可以开启文件当中记录的程序,对于目录,表示可以进入目录中,对应的数字的值为1
    4. -:没有开启对应的权限,对应的数字的值为0

    所以可以理解,rwxr-xr-x表示目录所有者拥有读取(r)、修改(w)和进入(x)的权限,组成员拥有读取(r)、进入(x)的权限,没有修改的权限(因为对应位置为-),其它用户拥有读取(r)、进入(x)的权限,没有修改的权限(因为对应位置为-)。用数字表示权限的话,这三者的权限分别为7(=4(r)+2(w)+1(x))、5(=4(r)+0(-)+1(x))、5(=4(r)+0(-)+1(x))。

  2. 修改wp-content目录的权限
    我们的目标是让其它用户具有修改权限,根据上面的介绍,可知,可以有如下几种方式来修改(在wp-content的父目录中):
    使用数字的方法直接改为目标权限:

    chmod -R 757 wp-content

    使用字母的方法直接改为目标权限:

    chmod -R rwxr-xrwx wp-content

    使用增加权限的方法对其它用户(o)增加(+)需要的权限(w):

    chmod -R o+w wp-content

    在上面的命令中-R表示对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)。
    经过上面的修改,可以解决该问题。

3-6. 怎样指定发布的文章在wordpress中的类别

  1. 发布到第一级类别
    这个问题其实是如何个性化定制发布内容的一部分,参考了使用小书匠编辑器将文章快速发布到各大主要博客平台中的内容,甚至是原文复制。
    系统提供的发布默认只是将文章的正文和标题发布到用户的博客平台,其他像是否发布到草稿、添加标签、添加分类、都是采用默认配置。
    用户可以通过元数据功能,达到修改是否发布到草稿、添加自己想要的标签、添加分类等目的,甚至实现第三方博客平台自己的一些其他参数所提供的功能。
    系统通过识别开头为weblog_ 的元数据,将其一起发送到博客平台上,来实现上述功能。比如你不想让文章发表,可以配置元数据weblog_publish: false。想让你的文章添加到小书匠开发两个分类,可以配置元数据weblog_categories: [小书匠,开发]
    具体的博客参数可以查看各个博客平台开放的weblogapi提供的内容。下面整理了一个从博客园开放的参数:

    参数 含义 备注
     dateCreated 创建时间   
     description  描述  
    title 标题  
    categories 分类 多个分类需用半角逗号分开,并用中括号包裹,比如 [小书匠,开发]
    mt_all_comments 是否允许评论  
    mt_keywords 关键字  

    那么具体到我们这里,我首先在测试博客的仪表盘->文章->分类目录中添加了一个新的分类目录,目录的名称技术操作别名technology。添加分类之后,接下来就是在发布文章时指定这个分类了。有以下两种方法:

    1. 在文章中指定
      enter description here
    2. 在发布页面指定
      enter description here

    上面的两种方法分别在不同的位置用weblog_categories: [技术操作]指明的文章要发布的类别,这两种方法都可以成功。需要注意的是,这里用的是类别的名称,而不是别名

  2. 发布到第二级类别(子类别)
    假如在名称小书匠的一级类别的下面还有一个名称笔记的子类别,想把文章发表到这个类别中,该怎么设置呢?好说,跟上面一样,只需设置weblog_categories: [笔记]就可以了。

3-7. 更新指定文章

在浏览器中打开要更新的文章,然后你可以在地址栏看到文章的ID,比如在下图中,文章的ID为151。
enter description here
然后在新版本文章的发布页面的文章ID(可选)一栏中指定这个ID,如下图所示,就可以更新这个文章了。
enter description here

posted @ 2020-09-03 12:06  南宫二狗  阅读(270)  评论(0编辑  收藏  举报