前言

常用的建站环境套件有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 欢迎页面

http://192.168.2.110

三、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 环境已经完成安装~

最后修改:2023 年 12 月 06 日
如果觉得我的文章对你有用,请随意赞赏