前言
常用的建站环境套件有LAMP和LEMP,这里主要介绍如何安装并配置LEMP环境,LEMP在中国更多是称为LNMP,实际上指的是同一种环境。LEMP 包是由 Linux、nginx、MySQL/MariaDB 和 PHP 组成的。
LCTT 译注:为何采用 LEMP 而不是 LNMP 的缩写?据 https://lemp.io/ 的解释:nginx 的发音是 Engine-X,重要的发音而不是首字母,而且 LEMP 实际上是可读的,而 LNMP 看起来只是字母表。
特别说明:下面的指南中使用的 Linux 发行版系统为 Debian 11
一、环境准备
1.更新软件源
apt update
2.UFW 防火墙放行网站服务端口
ufw allow http
ufw allow https
二、安装最新版 nginx
因为 Debian 软件源中的 nginx 实在是太老了,这里选择通过 nginx 官方仓库安装。
官方教程:https://nginx.org/en/linux_packages.html#instructions
1.安装必备组件
apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring
2.导入官方 GPG 密钥(复制整块命令粘贴)
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
3.验证下载的文件是否包含正确的密钥
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
输出应包含完整指纹,如下所示:
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
4.添加 nginx 官方仓库到 apt 软件源
nginx 仓库分为 Mainline version(主线版)和 Stable version(稳定版);
Mainline version:可以理解为测试版,会持续修复 Bug 并包含最新的特性,因为持续的加入特性可能会导致新的 Bug。如果想体验最新的功能,例如 HTTP/3 实验性支持,建议使用该版本。
Stable version:修复了关键性的 Bug,比较稳定,但是功能特性可能不是最新的,推荐用于生产环境。
以下两个添加仓库的命令按需求选择其中之一就行了~
添加 Mainline version(主线版)仓库
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
添加 Stable version(稳定版)仓库
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
5.设置存储库固定优先选择 nginx 官方仓库分发提供的包
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
6.更新软件源
apt update
7.安装 nginx
apt install nginx -y
8.运行nginx
systemctl start nginx
9.查看 nginx 运行状态
systemctl status nginx
输出内容:
● nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Sun 2023-10-22 04:24:44 CST; 17h ago
Docs: https://nginx.org/en/docs/
Process: 37688 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited,> Process: 38070 ExecReload=/bin/sh -c /bin/kill -s HUP $(/bin/cat /var/run/nginx> Main PID: 37689 (nginx)
Tasks: 3 (limit: 1110)
Memory: 229.6M
CPU: 8.955s
CGroup: /system.slice/nginx.service
├─37689 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.con>
├─38077 "nginx: worker process"
└─38078 "nginx: worker process"
10.按 q 键取消查看运行状态
11.通过浏览器访问主机,正常情况下应该会出现 nginx 欢迎页面
三、nginx 初始化配置
1.创建文件夹用于存放虚拟主机配置文件
mkdir -p /etc/nginx/sites-available
2.创建文件夹用于存放虚拟主机配置文件的软连接
mkdir -p /etc/nginx/sites-enabled
3.创建文件夹用于存放网站文件
mkdir -p /www/wwwroot
4.创建文件夹用于存放网站证书
mkdir -p /www/cert
5.创建文件夹用于存放网站日志
mkdir -p /www/wwwlogs
6.备份 nginx主配置文件
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
7.新建 nginx主配置文件
nano /etc/nginx/nginx.conf
插入以下代码:
# 定义 nginx 运行用户
user www-data;
# pid 文件路径
pid /var/run/nginx.pid;
# 运行进程数(建议设置为等于 CPU 线程数)
worker_processes 2;
# 最大打开文件数
worker_rlimit_nofile 65535;
# 加载启用的模块
include /etc/nginx/modules-enabled/*.conf;
events {
# Nginx 事件处理模型
use epoll;
# 同时接收多个新连接
multi_accept on;
# 单个进程允许的客户端最大连接数
worker_connections 65535;
}
http {
# 默认编码
charset utf-8;
# 开启文件的高效传输模式
sendfile on;
# 激活 TCP_CORK socket(阻塞住此头部数据,与之后的 sendfile 数据一同发送,优化吞吐性能)
tcp_nopush on;
# 小的数据包不等待直接传输
tcp_nodelay on;
# 保持链接超时设定(实现服务器与客户端之间的长连接,减少系统对TCP连接的建立和销毁的开销)
keepalive_timeout 65;
# 隐藏 Nginx 版本号
server_tokens off;
# 设定文件不存在的错误是否写入日志
log_not_found off;
# 哈希的最大值,影响散列表的冲突率,值越大消耗内存越多,但散列 key 的冲突率会降低。
types_hash_max_size 2048;
# 设置每个散列桶占用的内存大小
types_hash_bucket_size 64;
# 限制上传文件的大小
client_max_body_size 128M;
# MIME 媒体类型配置
include mime.types;
default_type application/octet-stream;
# 日志配置
# 全局访问日志文件
access_log /var/log/nginx/access.log;
# 全局错误日志文件和记录级别设定
error_log /var/log/nginx/error.log warn;
# 加载其他配置文件
include /etc/nginx/conf.d/*.conf;
# 加载启用的站点配置文件
include /etc/nginx/sites-enabled/*;
}
8.测试 nginx 配置文件
nginx -t
输出内容:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
9.重新启动 nginx
systemctl restart nginx
10.查看 nginx 运行状态
systemctl status nginx
11.按 q 键退出运行状态查看
12.nginx 的安装至此已经完成,如果需要新建站点,可以按以下步骤操作
(1)在 /etc/nginx/sites-available 目录创建配置文件
示例命令:nano /etc/nginx/sites-available/test.conf
(2)在 /etc/nginx/sites-enabled 目录创建配置文件的软链接以启用站点
示例命令:ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/test.conf
(3)测试配置文件
nginx -t
(4)重新加载 nginx
systemctl reload nginx
(5)关于 Gzip 功能
不建议在 http {} 内直接添加 Gzip 的配置,如果在 http {} 内直接添加会应用到全部站点,部分站点可能并不需要开启 Gzip 压缩,正确的做法是在 Server {} 内添加 Gzip 的功能代码对单站点启用。代码如下:
# gzip 功能开关
gzip on;
# 启用应答头"Vary: Accept-Encoding"(声明数据经过了压缩处理)
gzip_vary on;
# 设定触发压缩的条件为无条件(做为反向代理的时候启用)
gzip_proxied any;
# gzip 压缩级别
gzip_comp_level 6;
# 设置需要压缩的MIME类型
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
四、安装并初始化 MariaDB 数据库
1.安装 MariaDB
Debian 11 默认存储库的 MariaDB 版本是 10.5
apt install -y mariadb-server
2.运行安全设置向导
mysql_secure_installation
3.安全设置向导中各个询问的选择
Enter current password for root (enter for none):
输入 mysql 的 root 密码,默认没有,回车确认。
Switch to unix_socket authentication [Y/n]
切换到 unix 套接字身份验证?选择:否
Change the root password? [Y/n]
设置 root 密码?选择:是(自行设置密码)
Remove anonymous users? [Y/n]
删除匿名(空用户)用户?选择:是
Disallow root login remotely? [Y/n]
不允许远程root登录?选择:否
Remove test database and access to it? [Y/n]
删除 test 数据库?选择:是
Reload privilege tables now? [Y/n]
是否重新加载权限表使之生效?选择:是
五、安装 PHP 及相关扩展模块
1.导入 Ondřej Surý PHP 仓库的 GPG 签名密钥并添加软件源
curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
2.更新系统的存储库索引并执行软件包更新
apt update
apt dist-upgrade -y
3.安装 PHP 7.4 及常用扩展模块
apt install -y php7.4-{fpm,cli,common,mysql,curl,dom,exif,fileinfo,imagick,gd,mbstring,xml,zip,memcached,opcache,bcmath,iconv,intl,simplexml,xmlreader}
Debian 安装 PHP 会自动安装 Apache,但这里准备使用 nginx,所以需要安装 php-fpm ,这样就可以声明 PHP 将以 FPM 的方式运行,就不会安装 Apache 了。
4.添加防止跨目录攻击配置
sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/7.4/fpm/php.ini
这条实际上是编辑 /etc/php/7.4/fpm/php.ini 文件,将 ;cgi.fix_pathinfo=1 内容替换为 cgi.fix_pathinfo=0
5.设置上传大小限制
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 128M/' /etc/php/7.4/fpm/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 128M/' /etc/php/7.4/fpm/php.ini
6.重启 PHP
systemctl restart php7.4-fpm
7.创建目录用于存放测试PHP的页面
mkdir -p /www/wwwroot/php-test
8.新建 Vhost 配置文件,用于测试 PHP
nano /etc/nginx/conf.d/php-test.conf
写入代码:
server {
# 监听IPv4的80端口
listen 80;
# 绑定域名或IP
server_name 192.168.1.123;
# 网站根目录
root /www/wwwroot/php-test;
# 默认文档
index index.php index.html index.htm;
# 开启 PHP7.4-fpm 模式
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
9.测试 nginx 配置文件
nginx -t
10.重新加载 nginx
systemctl reload nginx
11.创建 php 测试文件
nano /www/wwwroot/php-test/phpinfo.php
写入代码:
<?php
phpinfo( );
?>
12.在浏览器打开以下地址,如果看到经典的 phpinfo 页面则说明安装成功
http://192.168.1.123/phpinfo.php
13.测试成功后,按顺序执行以下命令,删除测试站点及相关文件。
(1)删除测试站点 nginx 配置文件
rm /etc/nginx/conf.d/php-test.conf
(2)删除测试站点工作目录
rm -r /www/wwwroot/php-test
(3)重新加载 nginx
systemctl reload nginx
六、MariaDB 数据库服务器性能优化(可选)
1.编辑配置文件
nano /etc/mysql/mariadb.conf.d/50-server.cnf
2.根据需求在文件中修改/添加的各项配置
nano 可以使用 Ctrl+W 组合键搜索内容
【512MB 内存方案】
key_buffer_size = 32M
query_cache_size = 4M
tmp_table_size = 4M
innodb_buffer_pool_size = 8M
innodb_log_buffer_size = 4M
sort_buffer_size = 128K
read_buffer_size = 64K
read_rnd_buffer_size = 128K
join_buffer_size = 128K
thread_stack = 128K
thread_cache_size = 16
binlog_cache_size = 128K
table_open_cache = 32
max_connections = 384
【1GB 内存方案】
key_buffer_size = 64M
query_cache_size = 8M
tmp_table_size = 8M
innodb_buffer_pool_size = 16M
innodb_log_buffer_size = 8M
sort_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
join_buffer_size = 256K
thread_stack = 256K
thread_cache_size = 32
binlog_cache_size = 256K
table_open_cache = 64
max_connections = 512
【2GB 内存方案】
key_buffer_size = 128M
query_cache_size = 16M
tmp_table_size = 16M
innodb_buffer_pool_size = 32M
innodb_log_buffer_size = 16M
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 512K
thread_stack = 512K
thread_cache_size = 64
binlog_cache_size = 512K
table_open_cache = 128
max_connections = 512
【4GB 内存方案】
key_buffer_size = 256M
query_cache_size = 32M
tmp_table_size = 32M
innodb_buffer_pool_size = 64M
innodb_log_buffer_size = 32M
sort_buffer_size = 1024K
read_buffer_size = 512K
read_rnd_buffer_size = 1024K
join_buffer_size = 1024K
thread_stack = 1024K
thread_cache_size = 128
binlog_cache_size = 1024K
table_open_cache = 256
max_connections = 512
3.重启 MariaDB 数据库服务器
systemctl restart mariadb.service
4.进入 MariaDB 数据库控制命令行
mariadb
5.执行语句验证配置(输出结果以字节为单位)
show variables like 'key_buffer_size';
show variables like 'query_cache_size';
show variables like 'tmp_table_size';
show variables like 'innodb_buffer_pool_size';
show variables like 'innodb_log_buffer_size';
show variables like 'sort_buffer_size';
show variables like 'read_buffer_size';
show variables like 'read_rnd_buffer_size';
show variables like 'join_buffer_size';
show variables like 'thread_stack';
show variables like 'thread_cache_size';
show variables like 'binlog_cache_size';
show variables like 'table_open_cache';
show variables like 'max_connections';
6.退出 MariaDB 数据库控制命令行
exit
七、设置 PHP-FPM 的进程池为动态模式(可选)
1.编辑 PHP-FPM 配置文件
nano /etc/php/7.4/fpm/pool.d/www.conf
2.修改运行模式为动态模式,并按需修改相关参数。
(1)搜索 pm =
修改参数值为:dynamic
pm = dynamic
(2)搜索 pm.max_children =
修改参数值为:32
pm.max_children = 32
作用:控制静态方式下开启的PHP-FPM进程数量
(3)搜索 pm.start_servers =
修改参数值为:16
pm.start_servers = 16
作用:控制动态方式下的起始PHP-FPM进程数量
(4)搜索 pm.min_spare_servers =
修改参数值为:16
pm.min_spare_servers = 16
作用:控制动态方式下的最小PHP-FPM进程数量
(5)搜索 pm.max_spare_servers =
修改参数值为:32
pm.max_spare_servers = 32
作用:控制动态方式下的最大PHP-FPM进程数量
3.重启 PHP
systemctl restart php7.4-fpm
八、安装 Memcached 服务端(可选)
Memcached 是高性能内存键值数据存储器,可以为 WordPress 提供缓存功能。
1.安装 Memcached 和必须的 CLI 命令行工具
apt install -y memcached libmemcached-tools
2.修改分配给 Memcached 的内存
sed -i 's/-m 64/-m 256/' /etc/memcached.conf
这条命令的作用是编辑 /etc/memcached.conf 文件,将 -m 64 内容替换为 -m 256。
3.重启 Memcached
systemctl restart memcached
4.查看 Memcached 运行状态
systemctl status memcached
5.按 q 键退出运行状态查看
九、修改 PHP Session 的存储引擎为 Memcached(可选)
1.编辑 PHP 配置文件
nano /etc/php/7.4/fpm/php.ini
2.修改 Session 的存储引擎为 Memcached
(1)搜索 session.save_handler
,修改参数值为:memcached
session.save_handler = memcached
(2)在下一行添加 session.save_path
的配置,参数值为 memcached
监听端口
session.save_path = "127.0.0.1:11211"
3.重启 PHP
systemctl restart php7.4-fpm
至此,LEMP 环境已经完成安装~