lnmp wordpress部署实战搭建及域名绑定

使用的是火山云的alma9.2

我用的是源码包安装如下图:

一、源码编译、安装Nginx

先解压nginx

然后安装依赖包 yum -y install zlib pcre pcre-devel openssl openssl-devel

创建nginx用户www:

useradd -s /sbin/nologin www
id www

然后cd nginx-1.26.3/

./configure \
–prefix=/usr/local/nginx \
–sbin-path=/usr/local/nginx/sbin/nginx \
–conf-path=/usr/local/nginx/conf/nginx.conf \
–error-log-path=/usr/local/nginx/logs/error.log \
–http-log-path=/usr/local/nginx/logs/access.log \
–pid-path=/usr/local/nginx/logs/nginx.pid \
–with-http_stub_status_module \
–with-http_ssl_module \
–with-http_gzip_static_module \
–with-pcre

–prefix 指定Nginx程序的安装路径
–sbin-path 设置Nginx二进制文件的路径名
–conf-path 指定Nginx配置文件路径
–error-log-path 指定Nginx错误日志文件路径
–http-log-path 指定Nginx访问日志文件路径
–pid-path 设置Nginx的pid文件nginx.pid的路径
–lock-path 设置Nginx的lock文件nginx.lock文件路径
–with-openssl 指定OpenSSL源码包的路径,如果编译的时候没有指定“–with-openssl”选项,那么默认会使用系统自带的openssl库
–with-pcre 设置Nginx启用正则表达式
–with-http_stub_status_module 安装用来监控Nginx状态的模块
–with-http_ssl_module 表示启用Nginx的SSL模块,此模块依赖“–with-openssl”这个选项,通常一起使用。
–with-http_gzip_static_module 表示启用Nginx的gzip压缩.

#然后编译 make make install 以下是部分截取:

然后编写nginx管理脚本nginx.service,内容如下:

vi /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

接着,就可以通过systemctl管理nginx服务了

systemctl daemon-reload #重载nginx服务
systemctl start nginx #启动nginx服务
systemctl stop nginx #关闭nginx服务
systemctl enable nginx #设置nginx服务开机自启动
systemctl status nginx #查看nginx服务运行状态

ok,没有问题

然后重新启动查看服务

ps -ef |grep nginx

这个是nobody,而且我是两核的,所以要去nginx.conf中修改配置

vim /usr/local/nginx/conf/nginx.conf

systemctl restart nginx.service #重启服务

没问题了

接下来是验证,firewall-cmd –permanent –zone=public –add-port=80/tcp #先添加放行80端口

firewall-cmd –reload #然后重载

firewall-cmd –list-all | grep -E “ports|services” #最后查看添加成功没有

setenforce 0 #selinux临时设为宽容模式

成功了

二.二进制部署mysql

tar -xvf mysql-8.4.3-linux-glibc2.28-x86_64.tar.xz -C /usr/local/

cd /usr/local

如图所示已经成功了

mv mysql-8.4.3-linux-glibc2.28-x86_64 mysql #先改个名

mkdir /usr/local/mysql/data
mkdir /usr/local/mysql/etc
mkdir /usr/local/mysql/logs #创建这些文件夹

useradd mysql 然后创建用户mysql

然后,创建一个mysql配置文件,继续执行如下操作

vim /usr/local/mysql/etc/my.cnf

[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid

接着,给mysql授权,并执行初始化操作:

如下图权限设置成功

bin/mysqld –initialize –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data

参数说明
--initialize初始化 MySQL 数据目录,会生成一个临时 root 密码
--user=mysql以 mysql 用户身份运行进程
--basedirMySQL 安装目录
--datadirMySQL 数据存储目录

dnf install -y libaio #安装即可

如上图,已经成功了

接着,再写一个mysql服务管理脚本/etc/systemd/system/mysqld.service,内容如下:

然后启动服务:

systemctl daemon-reload
systemctl start mysqld

Mysql启动成功后,需要重置root密码,临时密码在上面定义的mysql日志文件/usr/local/mysql/logs/mysqld.log中可以查到

cat /usr/local/mysql/logs/mysqld.log | grep @

可以看出密码是!xIusC%UE2vs

进入sql命令行后,执行如下命令,修改root密码:

/usr/local/mysql/bin/mysql -uroot -p

alter user ‘root’@’localhost’ identified by ‘abc123456’;

成功了,到这里为止,mysql服务部署完成

三.源码编译、安装PHP

1、依赖库安装

依赖库比较多,我这用的是yum安装

yum install libxml2 libxml2-devel bzip2 bzip2-devel libjpeg-turbo libjpeg-turbo-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel sqlite-devel libzip

2、编译安装PHP

我依旧是自己上传的包

tar zxvf php-8.4.5.tar.gz
cd php-8.4.5
./configure –prefix=/usr/local/php –enable-fpm –with-fpm-user=www –with-fpm-group=www –with-pdo-mysql=mysqlnd –with-mysqli=mysqlnd –with-zlib –with-curl –enable-gd –with-jpeg=/usr –with-freetype=/usr –with-openssl –enable-mbstring –enable-xml –enable-session –enable-ftp –enable-pdo -enable-tokenizer –with-zip

上面的用户我写的是www,因为刚刚安装nginx我就用的这个

以下是命令截图

可以从图中看出,报错了,查询后显示是少了一个依赖库,就是这个oniguruma-devel。

然后我

dnf install -y epel-release #安装epel仓库

dnf --enablerepo=epel search oniguruma-devel #然后搜素发现没有,此时这个方法便失败了,我觉得可能和我用的是火山云有关。

然后我就换第二个方法,从源网站直接下载 RPM 安装
cd /tmp
wget https://repo.almalinux.org/almalinux/9/CRB/x86_64/os/Packages/oniguruma-devel-6.9.6-1.el9.6.x86_64.rpm

# 2. 安装
rpm -ivh oniguruma-devel-6.9.6-1.el9.6.x86_64.rpm

# 3. 然后依赖缺省,我就下载依赖
dnf install -y oniguruma-devel-6.9.6-1.el9.6.x86_64.rpm

然后回到php目录,重新运行configure,又出现了如下错误,没有依赖库libzip

然后我依旧先试着能不能直接下载,不出意外还是失败了,然后我又下载Remi 仓库,还是不行

最后还是下载了源码包

wget https://libzip.org/download/libzip-1.10.1.tar.gz tar -zxvf libzip-1.10.1.tar.gz cd libzip-1.10.1

如下图,下载并解压成功,

[root@lnmp ~]# cd libzip-1.10.1
[root@lnmp libzip-1.10.1]# mkdir build
[root@lnmp libzip-1.10.1]# cd build/ #进入并创建build目录

这里后面需要一个叫cmake编译,先看看安装没有,yum -y install cmake,如下图已安装

cmake ..  

make && make install #然后安装 以下是部分截图

然后再确认

然后再执行,成功了

接下来make
make install #编译等了非常久才结束


然后cp php.ini-production /usr/local/php/lib/php.ini #把 PHP 的生产环境配置复制到安装目录
cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/ #把 PHP-FPM 的服务管理脚本复制到 systemd 目录

然后是查看编译模块

[root@lnmp php-8.4.5]# cd /usr/local/php/
[root@lnmp php]# ls
bin etc include lib php sbin var
[root@lnmp php]# cd bin/
[root@lnmp bin]# ls
phar phar.phar php php-cgi php-config phpdbg phpize
[root@lnmp bin]# ./php -m

如果有缺少的就添加进去

四.Nginx与PHP-FPM

1、PHP-FPM配置文件

[root@lnmp ~]# cd /usr/local/php/ #先进入php目录
[root@lnmp php]# cd etc/ #接下来进入etc目录
[root@lnmp etc]# ls #看一下当前目前下的文件
php-fpm.conf.default php-fpm.d
[root@lnmp etc]# mv php-fpm.conf.default php-fpm.conf #如果是default就改名

[root@lnmp etc]# cd php-fpm.d/ #进入到此目录
[root@lnmp php-fpm.d]# ls #查看
www.conf.default
[root@lnmp php-fpm.d]# mv www.conf.default www.conf #修改名字
[root@lnmp php-fpm.d]# ls #查看
www.conf

vim www.conf #进入配置 修改下图用户和组

还有如下图的配置,确认一下是不是对的

2、配置Nginx来支持PHP

然后vim /usr/local/nginx/conf/nginx.conf 添加如下内容的location

3、测试Nginx对PHP的解析功能

[root@lnmp php-fpm.d]# systemctl restart nginx.service #重启服务
[root@lnmp php-fpm.d]# systemctl start php-fpm.service #启动服务

php服务启动失败

然后tail -f /var/log/messages #查看日志

ERROR: failed to open error_log (/usr/local/php/var/log/php-fpm.log): Read-only file system (30)
此问题是/usr/lib/systemd/system/php-fpm.service脚本问题,需要修改/usr/lib/systemd/system/php-fpm.service文件,找到:
ProtectSystem=full
改成
ProtectSystem=false

ok,这个错误是因为当ProtectSystem这个值为true或full的时候,php-fpm进程将以只读的方式挂载 /usr 目录,这就是问题所在。

[root@lnmp php-fpm.d]# systemctl daemon-reload #重新加载服务文件
[root@lnmp php-fpm.d]# systemctl start php-fpm #启动一下
[root@lnmp php-fpm.d]# systemctl status php-fpm.service #查看状态

成功了,然后再[root@lnmp php-fpm.d]# ps -ef | grep php

netstat -ntlp | grep php #确认一下

如下图:

成功了,最后,创建一个phpinfo.php文件

[root@lnmp php-fpm.d]# cd /usr/local/nginx/
[root@lnmp nginx]# cd html
[root@lnmp html]# vim phpinfo.php #内容如下

然后网页访问如下图:表示成功了 这上面可以查看安装了哪些模块的具体信息

也可以通过如下命令查看PHP安装的模块信息:

[root@localhost  ~]# /usr/local/php/bin/php -m

通过输出可以判断,目前已经成功安装了哪些模块,同时确认需要的模块是否已经正常安装,这里重点需要注意的是mysqli、mysqlnd、pdo_mysql、gd、curl、openssl、pcre等常用功能模块是否已经安装好。

4、测试PHP连接MySQL是否正常

vim mysqli.php #测试连接,添加如下内容

然后打开网页,如下图成功了

pdo-mysql方式连接MySQL的代码

成功了。

五、在LNMP环境下部署wordpress

unzip wordpress-6.7.2-zh_CN.zip -d /usr/local/nginx/html/  #我用到zip包,放到这个目录就行了

可以看到已经再这里面看,然后打开网页http://115.190.179.68/wordpress (因为我在nginx.conf添加了index.php)

所以我可以直接访问成功

当然也可以直接吧wordpress下的所又文件移动到html下,然后把index。html删除,然后就不用加后缀了

如下图:

ok了

然后需要创建一个数据库,以及一个普通用户

CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; — 创建一个专门给WordPress用的数据库
CREATE USER ‘xuan’@’localhost’ IDENTIFIED BY ‘xuan@123456’; — MySQL 8.0 的正确创建用户语法
GRANT ALL PRIVILEGES ON wordpress.* TO ‘xuan’@’localhost’; — 给用户分配wordpress数据库的所有权限
FLUSH PRIVILEGES; — 刷新权限表,使配置立即生效
SELECT user, host FROM mysql.user WHERE user=’xuan’; — 查看刚创建的用户
SHOW GRANTS FOR ‘xuan’@’localhost’; — 查看用户的权限
/usr/local/mysql/bin/mysql -xuan -p

数据库主机我就是本机,如果不是的话,就输入那个数据库所在的主机

然后下一步,如下图,自己手工创建一个php

然后下一步,如下图:

完了结束!

六.LNMP环境下开启https

1、HTTP与https

HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版本,HTTPS协议是利用SSL+HTTP协议建立安全信道,加密数据包,提供身份认证的网络协议,要比http协议安全。

2.买域名和获取ssl证书

由于我的个人博客是在腾讯云里面,(这里的实验搭建是火山云,所以域名我是绑定在我自己的个人博客上的)

整体流程极其繁琐,我简单说一下流程

先是购买域名,如下图:

然后一系列实名认证,需要身份证正反照片,然后在下图的界面绑定博客所在的ip地址

然后去icp备案填写内容,随后会有云平台的工作人员打电话询问问题,然后会发送下面的短信过来,

然后过两天的样子,就会有如下短信发过来,然后去链接的网站核验就行了

然后由于是邻近过年所以我等了半个月,才告诉我备案成功,如下图:

然后到全国互联网安全关联平台注册账号,并申请,如下图:

然后是ssl证书安装流程,这个是参考链接:SSL 证书 Nginx 服务器 SSL 证书安装部署(Linu (tencent.com)

在做的过程中我并没有完全按照这个流程来,因为我的服务器和这个文档中的步骤中的内容又很多差异,

当然首先还是去控制台–我的域名中下载证书,我这里下载的当然是nginx的,

如下是下载的四个文件;

然后把后缀名为crt和key的上传到服务器的nginx的目录里面,所以首先先

ps -ef | grep nginx #通过这个命令查找nginx的目录

我是把这两个传到/www/server/nginx/下的,然后就是写wordpress的配置

完整是vim /www/server/nginx/conf/conf.d/wordpress.conf 内容如下:

server {
    listen 443 ssl;
    http2 on;

    server_name www.xuanspace.online;

    ssl_certificate /www/server/nginx/www.xuanspace.online_bundle.crt;
    ssl_certificate_key /www/server/nginx/www.xuanspace.online.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    root /usr/local/lighthouse/softwares/wordpress;
    index index.php index.html index.htm;

    # 添加静态文件缓存和直接访问
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # 专门处理图片和静态资源
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
        try_files $uri $uri/ =404;
    }

    # 处理上传文件
    location /wp-content/uploads/ {
        try_files $uri $uri/ =404;
        expires 30d;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/tmp/php-cgi-83.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    access_log /www/wwwlogs/wordpress.log;
    error_log /www/wwwlogs/wordpress.error.log;
}

然后碰到了一个特别头痛的问题,第一个,如下图,当我访问https://www.xuanspace.online/时,出现了以下情况,

第二个就是,如下图,访问http://www.xuanspace.online/时,没有问题,但是当我切换到后台时加上了/wp-admin,我的ip就暴露出来了。

以下是我的修复方法:

# 进入 WordPress 目录
cd /usr/local/lighthouse/softwares/wordpress

# 创建数据库修复文件
vim fix-db-url.php
<?php
require_once('wp-load.php');

// 更新站点URL
update_option('siteurl', 'https://www.xuanspace.online');
update_option('home', 'https://www.xuanspace.online');

// 更新所有文章中旧的IP为域名
global $wpdb;
$wpdb->query("UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, 'http://43.136.123.139', 'https://www.xuanspace.online')");
$wpdb->query("UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, 'https://43.136.123.139', 'https://www.xuanspace.online')");

// 更新所有选项表中旧的IP
$wpdb->query("UPDATE {$wpdb->options} SET option_value = REPLACE(option_value, 'http://43.136.123.139', 'https://www.xuanspace.online') WHERE option_name NOT IN ('siteurl', 'home')");
$wpdb->query("UPDATE {$wpdb->options} SET option_value = REPLACE(option_value, 'https://43.136.123.139', 'https://www.xuanspace.online') WHERE option_name NOT IN ('siteurl', 'home')");

echo "修复完成!现在站点地址是:" . get_option('siteurl');
?>

保存后,在浏览器访问:

http://43.136.123.139:888/fix-db-url.php

访问成功后立即删除

rm /usr/local/lighthouse/softwares/wordpress/fix-db-url.php

然后此时访问 https://www.xuanspace.online http://www.xuanspace.online

已经成功了,到这里就基本完结了。

发表回复

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