将WordPress从Apache迁移到nginx教程

勺子这两天在折腾如何将WordPress迁移到nginx,至于Apache和nginx的优劣,可以参考我之前写的这篇文章:

在迁移自己的博客到 LEMP 环境的时候,遇到了一些小挫折,现在把经验分享出来,让大家少走弯路。包括php7.2安装与下载,SSL证书申请与配置,mysql安装,Nginx服务器的简单配置。

注:本教程环境:Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-54-generic x86_64)

第1步–安装Nginx Web服务器

首先更新服务器的软件包索引。
然后,安装nginx。

sudo apt update 
sudo apt install nginx 

在网络浏览器中输入你服务器地址(由于勺子已经把域名解析到腾讯云,所以用的是域名),你将看到Nginx的默认页面:

http://server_domain_or_IP  #例如:http://www.anspoon.com

如果看到上面的页面,则说明您已经成功安装了Nginx。

第2步–安装MySQL

有了Web服务器之后,我们需要安装MySQL来存储和管理站点数据。

键入以下命令安装MySQL:

sudo apt install mysql-server

现在已安装好MySQL数据库软件,但配置尚未完成。

为了确保安装安全,MySQL附带了一个脚本,该脚本将询问我们是否要修改一些不安全的默认值。通过键入以下命令来启动脚本:

sudo apt install mysql-server

该脚本将询问您是否要配置VALIDATE PASSWORD PLUGIN

警告:启用此功能只是一个判断。如果启用,与指定条件不匹配的密码将被MySQL拒绝并报告错误。如果您将弱密码与自动配置MySQL用户凭据的软件(例如phpMyAdmin的Ubuntu软件包)结合使用,则会导致问题。禁用验证是很安全的,但是您应该始终对数据库凭据使用强密码。

输入“Y”,否则继续进行任何操作(不启用)。

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:

如果启用了验证,则脚本还将要求您选择密码验证级别。记住,如果输入2(最高级别),则尝试设置任何不包含数字,大写,小写字母和特殊字符或基于常见单词的密码时,都会收到错误消息。

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

接下来,将要求你提交并确认root密码:

Please set the password for root here.

New password:

Re-enter new password:

其余的问题,你应该在每个提示下按下YENTER击键。删除一些匿名用户和测试数据库,禁用远程root登录,并加载这些新规则,以便MySQL立即刷新我们所做的更改。

注意:在运行MySQL 5.7(及更高版本)的Ubuntu系统中,默认情况下,MySQL root 用户设置为使用auth_socket而不是密码进行身份验证。在许多情况下,这可以提高安全性和可用性,但是在需要允许外部程序(例如phpMyAdmin)访问用户时,就会很麻烦,所以可以酌情设置。

如果使用auth_socket适合你的工作流程,则可以继续执行步骤3。但是,如果你想用密码以root用户身份连接到MySQL时,则需要将其身份验证方法从auth_socket切换到mysql_native_password

为此,可以从终端打开MySQL提示符:

sudo mysql

接下来,使用以下命令检查每个MySQL用户帐户使用的身份验证方法:

SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

在此示例中,你可以看到root用户实际上使用auth_socket插件进行了身份验证。要将root帐户配置为使用密码进行身份验证,请运行以下ALTER USER命令。确保更改password为你选择的强密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

然后,运行FLUSH PRIVILEGES告诉服务器重新加载授权使新的更改生效:

FLUSH PRIVILEGES;

再次检查每个用户使用的身份验证方法,以确认root不再使用该auth_socket进行身份验证:

SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

你可以看到,MySQL root用户现在使用密码进行身份验证。如果你的验证方式已经改了过来,就可以退出MySQL Shell:

exit

注意:将MySQL的root用户配置为使用密码进行身份验证后,您将无法再sudo mysql使用以前使用的命令访问MySQL 。你必须运行以下命令:

mysql -u root -p

输入刚刚设置的密码后,您将看到My​​SQL提示。

至此,你的数据库系统已经安装完成。

第3步 –安装PHP并配置Nginx

我们已经安装了Nginx来提供页面服务,并安装了MySQL来存储和管理数据。但是,我们还没有可以生成动态内容的东西。这就是PHP发挥作用的地方。

由于Nginx不像其他一些Web服务器(Apache)那样包含本机PHP处理,因此您需要安装php-fpm,它表示“ fastCGI进程管理器”。Nginx将PHP请求传递给该软件进行处理。

注意:在安装php-fpm软件包之前,您可能需要添加Ubuntu的存储库,其中包括由Ubuntu社区维护的免费和开源软件,具体取决于您的云提供商。您可以通过键入以下内容来执行此操作(如果你使用的是腾讯云和阿里云,可以略过以下命令,因为阿里云和腾讯云都有自己的软件镜像):

sudo add-apt-repository universe

安装php-fpm模块以及一个附加的帮助程序包,php-mysql它使PHP与我们的MySql数据库后端进行通信。安装将提取必要的PHP核心文件。

键入以下命令进行安装:

sudo apt install php-fpm php-mysql

现在,我们已经安装了所有必需的LEMP组件,但是仍然需要进行一些配置更改,使Nginx使用PHP处理器来处理动态内容。

这是在nginx server block级别上完成的(server block类似于Apache的虚拟主机)。

为此,请在/etc/nginx/sites-available/目录中打开一个新的server block配置文件。

在此示例中,新的服务器块配置文件名为anspoon.com,你可以根据需要命名:

sudo nano /etc/nginx/sites-available/anspoon.com

通过编辑一个新的server block配置文件,而不是编辑默认文件,你可以在需要时轻松地恢复默认配置。

将以下内容(从默认server block配置文件中获取并稍作修改)添加到新的服务器块配置文件中:/etc/nginx/sites-available/anspoon.com

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name anspoon.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

这些指令和位置块的作用如下:

  • listen—定义Nginx将监听的端口。在这种情况下,它将侦听80端口HTTP的默认端口。
  • root —定义文档根目录,用于存储网站提供的文件。
  • index—配置Nginx优先处理index.php请求索引文件时命名的服务文件(如果有)。
  • server_name—定义对服务器的给定请求应使用哪个服务器块。将此指令指向服务器的域名或公共IP地址。
  • location /—第一个位置块包含一个try_files指令,该指令检查是否存在与URI请求匹配的文件。如果Nginx找不到合适的文件,它将返回404错误。
  • location ~ \.php$—该位置块通过将Nginx指向fastcgi-php.conf配置文件和php7.2-fpm.sock声明与哪个套接字相关的文件来处理实际的PHP处理php-fpm
  • location ~ /\.ht—最后一个位置块处理.htaccessNginx不处理的文件。通过添加deny all指令,如果有任何.htaccess文件碰巧进入文档根目录,则不会将其提供给访问者。

添加此内容后,保存并关闭文件。通过创建从新server block配置文件(在/etc/nginx/sites-available/目录中)到/etc/nginx/sites-enabled/目录的符号链接来启用新server block块:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

然后,从/sites-enabled/目录取消链接默认配置文件:

sudo unlink /etc/nginx/sites-enabled/default

注意:如果需要恢复默认配置,可以通过重新创建符号链接来完成,如下所示:

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

通过键入以下内容来测试新配置文件是否有语法错误:

sudo nginx -t

如果报告了任何错误,请返回并重新检查文件,然后再继续。

准备就绪后,重新加载Nginx进行必要的更改:

sudo systemctl reload nginx

这样就完成了LEMP堆栈的安装和配置。但是,请确保所有组件都可以相互通信。

第四步 –创建一个PHP文件以测试配置

您的LEMP堆栈现在应该已完全设置。您可以对其进行测试,以验证Nginx是否可以将.php文件正确地传递给PHP处理器。

为此,请使用文本编辑器info.php在文档根目录中创建一个测试PHP文件:

sudo nano /var/www/html/info.php

在新文件中输入以下行。这是有效的PHP代码,它将返回有关您的服务器的信息:/var/www/html/info.php

<?php
phpinfo();

完成后,保存并关闭文件。

现在,您可以在Web浏览器中访问此页面,方法是访问服务器的域名或公共IP地址,后跟/info.php

http://your_server_domain_or_IP/info.php    #例如:http://www.anspoon.com/info.php

您应该看到由PHP生成的网页,其中包含有关服务器的信息:

如果看到一个类似这样的页面,则说明您已成功使用Nginx设置了PHP。

在确认Nginx正确呈现了页面之后,最好删除您创建的文件,因为它实际上可以为未经授权的用户提供有关您配置的一些提示,这些提示可能会帮助他们尝试入侵。

现在,通过键入以下内容删除文件:

sudo rm /var/www/html/info.php

好了,到这里我们的Ubuntu 18.04服务器便有了一个完整配置且正常运行的LEMP。

其实以上步骤是一个标准的LEMP安装教程,为了以后自己查阅方便和更新,我把它单独写成了一篇博客:

第6步——安装Https(对这个没要求的可以不看

首先安装OpenSSL模块

sudo apt install openssl

如果你熟悉Let’s Encrypt,可以跳过了,本教程使用的是腾讯云一年免费的赛门铁克ssl。

下载完成后解压,会有四个文件,对应不同软件,这里我们只需要Nginx的就行:

通过Winscp将上图中的两个文件上传到/etc/ssl文件夹下

5. 配置Nginx

运行sudo vim /etc/nginx/sites-available/default,翻到最下面注释掉的HTTPS server,最终配置如下(我把我的配置贴出来,把对应的域名改成你的就可以了):

要和你的目录一致。在80端口的http server中添加跳转,return 301 https://anspoon.com;这样当别人用http 协议访问你的站点时,会自动调转到https,如下:

server{
        listen 80;
        server_name anspoon.cn www.anspoon.cn;
        return 301 https://www.anspoon.cn$request_uri;
}
server {
        listen 443 ssl http2;
        server_name anspoon.cn www.anspoon.cn;

        root   /var/www/anspoon.com/;
        index index.php index.html index.htm;

        # SSL/TLS configs
        ssl on;
        ssl_certificate /etc/ssl/1_www.anspoon.cn_bundle.crt;
        ssl_certificate_key /etc/ssl/2_www.anspoon.cn.key;

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

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/anspoon.com/;
        }

        location ~ \.php$ {

                root   /var/www/anspoon.com/;
                fastcgi_pass unix:/run/php/php7.2-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

最后,测试一行nginx的配置是否正确,运行:

sudo service nginx -t

重新加载并重启nginx:

sudo service nginx reload 
sudo service nginx restart

测试通过,访问你的站点,看有没有加上那把别致的小锁?

第七步:安装WordPress(略)

网上教程已经很多,就不详细介绍了,后面我会把一些遇到的坑更新在这里。

至此,教程结束。最终效果如本站所示。

结语

写了有点啰嗦和混乱,你把上面的命令一敲,软件安装都很简单,在进行一些简单的配置即可,如果你熟悉整个流程的话,其实没有那么复杂。该教程我会持续更新。

留下评论