以前都是用一键脚本部署,如今心血来潮,准备在 CentOS/Debian 下手动搭建主流的 LNMP 架构,就当消磨本没有的时间🙃

配置 Nginx

如果你已经编译安装过 Nginx 了,这里直接配置,将 Nginx 添加到系统服务:

CentOS: vim /usr/lib/systemd/system/nginx.service

Debian: vim /lib/systemd/system/nginx.service

[Unit]
Description=Nginx - High Performance Web Server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
Wants=network-online.target
 
[Service]
Type=forking
PIDFile=/etc/nginx/logs/nginx.pid
ExecStartPre=/etc/nginx/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/etc/nginx/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

启动服务:

systemctl daemon-reload
systemctl enable nginx.service
systemctl start nginx.service

如果你使用的是 Deabin 系统,也可以用我写的一键脚本编译安装 Nginx,以 root 用户运行:

bash <(curl -Ls git.io/nginx.sh)

修改下配置,转发到 PHP 默认的 9000 端口,此处以单 http 网站示例:

server {
    ...
    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9000;
        # 如果是 php-7.4:fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

安装 MySQL

CentOS 下安装

1. 更新 MySQL 源

这里选择 8.0 版本的 MySQL,或者 5.7 版本,首先

wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

安装 MySQL 源:

yum localinstall mysql80-community-release-el7-3.noarch.rpm

如果之后不想通过 yum update 的时候更新 MySQL,安装完成后卸载即可:

yum -y remove mysql80-community-release-el7-3.noarch.rpm

用下面的命令检查 MySQL 源是否安装成功

syum repolist enabled | grep "mysql.*-community.*"

2. 安装 MySQL

使用 yum install 命令安装:

yum install -y mysql-community-server

启动命令:

systemctl start mysqld

*查看已安装的 MySQL:

rpm -qa | grep -i mysql

导出数据库:

mysqldump -u 用户名 -p 数据库名 > 文件名.sql

导入数据库:

mysql -u 用户名 -p 数据库名 < 文件名.sql

卸载MySQL:

yum remove mysql-community-server

卸载依赖:

yum remove mysql-libs
yum remove mysql-server
yum remove perl-DBD-MySQL
yum remove mysql

同时建议清空数据文件。

Debian 下安装

这里以安装 MySQL 8 作为演示,添加最新的 apt 存储库

wget https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb
apt install ./mysql-apt-config_0.8.20-1_all.deb

安装 MySQL:

apt update
apt install mysql-server

配置 MySQL

登录 MySQL

如果你安装的是 MySQL5.7 版本,安装完后会生成一个默认密码保存在 /var/log/mysqld.log 文件中,通过下面的命令找到密码:

grep 'password' /var/log/mysqld.log

然后进入 MySQL 修改 root 密码

mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

而如果你是安装 MySQL8.0 之后的版本,会在安装时提示你输入 root 用户密码,做好保存即可。

管理 MySQL

创建 MySQL 数据库和用户

CREATE DATABASE [数据库名];
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
GRANT ALL ON [数据库名].* TO '用户名'@'localhost';
FLUSH PRIVILEGES;

默认只允许 root 帐户在本地登录,若要远程操作 MySQL,建议添加远程登录用户而不是直接修改 root 账户为远程连接, 添加一个允许远程连接的帐户:

GRANT ALL PRIVILEGES ON [数据库].[数据表] TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;

查看所有用户及权限:

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; 

撤销权限:

revoke all privileges on *.* from 'user'@'%';

优化 MySQL

设置默认编码为 UTF-8,MySQL5.7 安装后默认不支持中文,需要修改编码。修改 /etc/my.cnf 配置文件如下:

[mysqld]
character_set_server=utf8
collation-server=utf8_general_ci

重启 MySQL 服务,登录后可查看目前的编码格式:

systemctl restart mysqld
mysql -uroot -p
show variables like 'character%';

#可是远程连接的时候一直失败,心态小炸QAQ,查看日志发现:

[Warning] IP address 'xxxx' could not be resolved: Name or service not known

因为 MySQL 默认会反向解析 DNS,对于访问者 MySQL 不会判断是 hosts 还是 ip 都会进行 dns 反向解析,频繁地查询数据库和权限检查,这大大增加了数据库的压力,导致数据库连接缓慢。

解决办法:禁用 dns 反查,确保 skip-networking 被删除或者屏蔽,否则不支持 TCP/IP 访问,编辑 /etc/my.cnf 加入以下内容:

[mysqld]
skip_host_cache
skip-name-resolve=1

优化内存占用

修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件:

# 以下为针对1G内存优化
# 指定用于索引的缓冲区大小
key_buffer_size = 32M

# Innodb缓存
innodb_buffer_pool_size = 128M

# 日志文件所用的内存大小,缓冲区更大能提高性能,但意外的故障将会丢失数据。建议设置为1-8M之间
innodb_log_buffer_size = 4M
innodb_log_file_size = 48M

# 关闭性能监控,大幅减低内存占用
performance_schema=off

# 指定MySQL允许的最大连接进程数,默认值为 151
max_connections = 200

# 查询排序时所能使用的缓冲区大小
sort_buffer_size = 1M

# 读查询操作所能使用的缓冲区大小
read_buffer_size = 512K

安装 PHP

CentOS 下安装

更新 PHP 源

Remi 软件源主要提供最新版的PHP软件包和其他一些 PHP 扩展工具包,Remi 对 PHP 的支持和更新都很积极,可以在第一时间获得新版本的支持。

安装 EPEL 源及源管理工具:

yum install epel-release yum-utils

安装 REMI 源:

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

安装 PHP7.3 及扩展:

yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-pecl-swoole php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll

查看状态:

systemctl status php73-php-fpm

将 php73 链接到系统环境变量中,就可以使用 php -v 命令:

ln -s /opt/remi/php73/root/usr/bin/php /usr/bin/php

默认配置文件路径为:/etc/opt/remi/php73/php.ini

卸载 PHP7.x:

yum -y remove php7* 

Debian 下安装

Debain 10 默认自带了 PHP7.3(Debian 11 为 PHP7.4),可通过下面命令查看:

apt-cache search php7.3
# 或者
apt-cache search php7.4

安装 PHP7.4:

apt install -y php7.4 php7.4-cli php7.4-common php7.4-fpm php7.4-xml php7.4-curl php7.4-mysql php7.4-sqlite3 php7.4-mbstring php7.4-gd php7.4-fileinfo php7.4-exif

若要安装其他版本则需要导入 Sury 仓库:

curl -sSL https://packages.sury.org/php/README.txt | bash -x

安装 PHP8.1:

apt install -y php8.1 php8.1-cli php8.1-common php8.1-fpm php8.1-xml php8.1-curl php8.1-mysql php8.1-sqlite3 php8.1-mbstring php8.1-gd php8.1-fileinfo php8.1-exif

查看状态:

systemctl status php7.4-fpm

默认配置文件路径为:/etc/php/7.4/fpm/php.ini 或者 /etc/php/8.1/fpm/php.ini

卸载 PHP7.x:

apt purge php7.*
apt autoclean
apt autoremove

配置 PHP

查找配置文件路径:

php -i  | grep php.ini

修改 php-fpm.d (PHP7.4 路径为 /etc/php/7.4/fpm/pool.d)下 www.conf 文件将用户和用户组修改为与 nginx.conf 中的一致(建议使用 adduser 新增一个用户方便管理)

user = nginx
group = nginx

ps aux | grep php 可以查看进程使用的用户身份。

*修改 PHP 运行最低内存

vim /etc/php/7.4/fpm/php.ini

更改 memory_limit = 512M

*将 cgi.fix_pathinfo 设置为0以解决一个 Nginx + PHP CGI 可能存在的安全漏洞

CentOS: sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/opt/remi/php73/php.ini 
Debian: sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/7.4/fpm/php.ini 

配置完成后可以启动PHP并进行测试,新建一个以下内容的 index.php 文件放在Web目录下,内容为输出 PHP 信息:

<?php
    phpinfo();
?>

安装 Wordpress

WordPress 官网下载相应的版本到指定目录并解压好后切换到 WordPress 安装目录下,将 WordPress 目录的所有权授予 nginx 的用户,并将目录的读写权限改为 777:

chown -R nginx:nginx wordpress
chmod -R 777 wordpress

之后就可以打开域名根据提示安装使用 WordPress 了。

*如果使用 PHP 连接 MySQL 8 的时候,会发生以下错误:

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

是由于 MySQL 8 默认使用了新的密码验证插件:caching_sha2_password,而之前的PHP版本中所带的 mysqlnd 无法支持这种验证。解决这个问题,可以安装支持 caching_sha2_password 的PHP版本或者:

  1. 修改etc/my.cnf,添加以下内容:
[mysqld]
default_authentication_plugin= mysql_native_password

重启 MySQL systemctl restart mysqld

  1. 使用 root 账户登录 MySQL,运行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 
FLUSH PRIVILEGES;

之后便可正常安装。