以前都是用一键脚本部署,如今心血来潮,准备在 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版本或者:
- 修改
etc/my.cnf
,添加以下内容:
[mysqld]
default_authentication_plugin= mysql_native_password
重启 MySQL systemctl restart mysqld
- 使用 root 账户登录 MySQL,运行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;
之后便可正常安装。