Saber 酱的抱枕

Fly me to the moon

06/13
2019
软件

Debian x9 配置 LAMP 安装 WordPress

前些时候我在 b 站学了学 Linux 的基础操作,之后我就想动手把我博客换到 linux 服务器上。我的主机商是 vultr,现在的服务器刚建立的时候就是 Linux 系统(因为选 Windows 是要多收钱的),后来用了一些手段改装成了 Windows。现在终于成功了。整个过程我做了两遍,其实要折腾起来并不算复杂,但对于第一次接触的人来说,难免处处懵逼,凭空增加难度。过程中也确实踩了很多坑,花了挺多的时间。熟悉之后就好多了。本文中的操作糅合了很多网络上的教程,感谢前辈们。

0.准备工作

我选择的操作系统是 Debian 9.9 (stretch)。当前时间是 2019年06月。 php.ini
Debian安装后磁盘空间占用不到1G,这使我感觉非常舒服。
我在根目录建立www目录,再按站点名建立子目录,分别存放网站。
之后用wget将网站的备份文件下载下来。
新服务器需要先更新下apt:
apt update

1.配置 nginx

安装 nginx:
apt install nginx

启动 nginx:
service nginx start

之后在浏览器输入自己的服务器 ip,能够看到 nginx 的默认主页就成功了。

接下来修改 nginx 配置文件,使其可以支持 php:
vim /etc/nginx/sites-available/default


把 root 字段的值修改为站点目录。
在 index 字段里添加 index.php。
在下一行空白处附近,添加对php的支持:

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

之后重启 nginx:
service nginx reload

我们修改了默认网站的目录为 /www 目录,支持了 php,但这个目录现在是空的,所以此时刷新网站会看到403状态码。

2.配置 php

安装 php:
apt install php7.0-fpm
这个 fpm 以前没见过,它是PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)。

配置 php-fpm:
vim /etc/php/7.0/fpm/pool.d/www.conf

php-fpm默认配置的是socket通信:
listen = /run/php/php7.0-fpm.sock
查找此处,将其注释掉,添加一行:
listen = 127.0.0.1:9000

这是因为php的 fastcgi可以使用socket或 tcp 方式通信。我选择的是tcp方式,这里的选择和上面配置 nginx 支持php时是对应的。你也可以配置两处都是用 socket 方式。

重启 php 和 nginx:
service php7.0-fpm restart
service nginx restart

我们到网站根目录下,编写 php 探针文件,也就是输出 phpinfo()。

<?php
echo phpinfo();

之后访问这个文件,能正确显示就 OK。

附:显示php的报错信息

有时候打开网站发现有问题,但是php默认不输出错误信息,难以定位问题。我们可以配置php显示错误信息。

vim /etc/php/7.0/fpm/php.ini

搜索 display_errors = Off ,将 Off 改为 On

这时候也可以顺便开启一些扩展,比如 php_curl.dll,openssl.dll 之类的。

修改之后重启 php 服务就可以了:
service php7.0-fpm restart

3.配置 mysql

安装 mysql:
apt install mysql-server mysql-client

安装 php 的 mysql 扩展:
apt install php7.0-mysql

重启 php:
service php7.0-fpm restart

刷新 php 探针页面,看到 mysqli一栏就成功了:

(mysqli是 php 新版本里使用的 MySQL 扩展。)

进行安全配置:
mysql_secure_installation
执行这个命令可以进行一些安全设置,如设置密码,禁止远程登陆,移除匿名用户,删除测试表等操作。我们可以发现这个mysql其实里面是MariaDB。

有的教程里还教修改 mysql 的编码为 utf8,不过现在用不着了。步骤如下:

在 mysq 命令行里执行:
show variables like "%char%";
注意mysql命令行里的命令必须以分号结束。

可以看到现在新安装的 mysql字符集也是 utf8mb4,这个才是mysql 里真正的 utf-8 编码。所以我们不用改了。

之后我们还要对用户进行授权,这个是我踩坑之后才发现的。否则我们运行wordpress时会报错,即使数据库配置信息无误:

怎么做呢?登入 mysql:
mysql -u root -p

设置密码:(记得设置密码,不然之后会被拒绝连接,只能想办法去手动修改密码了)
SET PASSWORD FOR root@localhost=PASSWORD("密码");

赋予权限:
grant all privileges on *.* to root@'localhost' identified by '密码';

刷新权限配置:
flush privileges;

太深奥了 Orz

如果我们需要新建一个数据库用户,也只是多了个创建用户的命令:

创建用户:
CREATE USER wordpress@localhost;

设置密码:
SET PASSWORD FOR wordpress@localhost=PASSWORD("密码 ");

配置权限:
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@localhost IDENTIFIED BY '密码';

刷新权限配置:
FLUSH PRIVILEGES;

接下来准备恢复数据库。因为我之前导出的 sql 文件里包含了创建数据库的命令,所以我不必手动建立数据库了,直接导入备份的 sql 文件:
source /file/sql1.sql

如果是全新安装wordpress,通常需要手动创建一个数据库:
CREATE DATABASE wordpress;

4.配置 wordpress

wordpress这里也分两个途径。

一个是全新安装wordpress:
wget https://wordpress.org/latest.tar.gz

解压:
tar zxvf latest.tar.gz

将解压出的 wordpress 目录移动至 /www 目录里,并改名成网站名。

这时候有个坑,wordpress目录的所有者是 nobody,所属组是 nogroup,所以我们要修改所有者:
chown -R www-data:www-data saber.love

www-data用户和组是安装了nginx后产生的,它是nginx操作网站时使用的用户。可以在nginx.conf里查看和修改这个用户。

第二个途径就是恢复备份。我把之前网站备份的所有文件都恢复过来,就不用全新安装了,这样简单方便。我一开始是全新安装,然后想把需要修改的文件覆盖过来,结果出了很多问题,不如整站直接恢复好。

注意恢复备份之后也要修改所有者:
chown -R www-data:www-data saber.love

现在我已经把域名saber.love解析到服务器了,但是访问它还是显示403.这是因为此时nginx并不知道我们要访问的是个单独的网站,它打开的还是网站文件总目录 /www。我们想让它打开该网站的目录 /www/saber.love,需要去nginx里添加这个网站。

cd /etc/nginx/conf.d

这个目录里是空的,我们可以为每一个网站建立一个配置文件。例如我新建一个文件 saber.love.conf,内容如下:

server {
 listen 80;
 server_name saber.love;
 root /www/saber.love;
 location / {
 index index.php index.html index.htm;
 #autoindex on;
 }
 location ~ \.php$ {
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
 }
}

之后重启nginx服务,即可正常访问网站。
service nginx restart

此时访问网站会自动进入wordpress的安装页面,表示我们的配置生效了。接下来我们修改 wordpress 的配置文件,将网站根目录的 wp-config-sample.php 复制并改名为 wp-config.php,编辑它,设置数据库信息。这部分不详细讲了。

ps:其实我在这里踩了两次坑,一次是mysql没有给用户授权,一次是做了授权但之前没有设置密码……

话说全新安装时我还踩了个坑,我们下载的是官网安装包,后台是英文的,想改成中文就又要折腾一番。

配置固定链接:

我的固定链接设置的是/%postname%,如下:

之后在这个网站的配置文件里添加rewrite规则:
try_files $uri $uri/ /index.php?$args;

恢复网站的时候还遇到了乱码问题,在windows上把网站文件打包成zip,在linux上解压后,文件名里的中文变成乱码了,网页上的中文图片也都打不开了。

这个折腾了好久,听网上说的用convmv转码也没成功。最后发现打包成tar指定utf-8编码,或者直接用7z,解压出来能正常用。所以我重新打包和解压了一次。

5.配置SSL证书

此时我的网站除了首页其他页面都还是打不开,最主要的原因就是我网站原本有SSL证书,现在没有了。配置SSL证书之后就恢复正常了。

配置步骤:
https://www.snel.com/support/install-lets-encrypt-ssl-on-debian-9-running-nginx-web-server/

在 /etc/letsencrypt/live/网站名 目录里有4个证书文件:
cert.pem - Apache服务器端证书
chain.pem - Apache根证书和中继证书
fullchain.pem - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件

之后去编辑这个网站的配置文件,在 server 里添加以下三行:

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/saber.love/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/saber.love/privkey.pem;

然后重启nginx就可以了。

如果证书到期了就需要续订,重新执行一遍创建证书的命令就行了。更新完成后,重启 nginx 即可启用新证书。

经过上述步骤后,一个比较完整的网站配置文件内容如下:

server {
	listen 80;
	listen 443 ssl;
	charset utf-8;
	server_name example.com;
	root /www/example.com;
	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
	
	location / {
		index index.php index.html index.htm;
		#autoindex on;
		try_files $uri $uri/ /index.php?$args;
		rewrite /wp-admin$ $scheme://$host$uri/ permanent;
		#这行是为了防止打开后台、插件页等打不开的。
	}

	location ~ \.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
   }
}

好了,到这里网站部分已经没有什么问题了,开心~

Debian x9 配置 LAMP 安装 WordPress

  1. nameless
    Google Chrome 75Google Chrome 75WindowsWindows

    看到这个教程,有种回到刚入坑的Linux时候的感觉www
    最初就是想做一个个人网站,入了Debian的坑,买了树莓派,LAMP搞起,装了Wordpress,各种折腾。
    然后Apache2转到Nginx,Mysql转到Mariadb,Wordpress转到typecho,最后发现没什么克写的,删掉,当作无事发生...

    回复
    1. saber 文章作者
      Google Chrome 74Google Chrome 74WindowsWindows

      别急嘛 我还得歇一歇去搬运下里番,修一下 pixiv 下载器 _(:3」∠)_
      其实六月初我就打算折腾linux了,但是那几天用的网络无法 ssh 登陆,浪费了好几天的时间。

      回复