从 0 开始部署 LNMP 生产环境

前置准备工作

本文章将指导您如何使用一台空白的云服务器(这里演示的是腾讯云的轻量服务器),在仅安装 ubuntu 24.04 操作系统的情况下,一步步完成 LNMP 环境的配置

1. 初始化 root 账户密码

一行指令即可实现,其中需要输入两次密码,自己要记住。

1
sudo passwd root

即便如此,这个 root 账户我们基本不用,但是初始化一下又没啥问题。

2. 更新系统

目的是确保系统的所有软件包都是最新的。

1
sudo apt update && sudo apt upgrade -y

其中,-y 是 apt upgrade 命令中的一个选项,它的作用是自动回答 “yes”(是) 以确认安装或升级过程中的所有提示。

3. 安装 Nginx

1
sudo apt install nginx -y

安装完成后,可以使用以下命令检查 Nginx 是否已经正确启动:

1
sudo systemctl status nginx

访问服务器的 IP 地址(例如:http://your_server_ip),你应该能看到 Nginx 的默认页面。

4. 安装 MySQL

1
sudo apt install mysql-server -y

安装完成后,执行以下命令对 MySQL 进行安全性设置:

1
sudo mysql_secure_installation

完成后,登录 MySQL 检查:

1
sudo mysql

4. 修改 MySQL 的认证机制从 auth_socket 插件认证改为密码验证

在新的 MySQL 版本中,root 用户默认使用 auth_socket 插件进行身份验证,这意味着只有在系统中以 root 或 sudo 权限运行的用户才可以登录 MySQL,而无需密码。

但是这个机制不是我们需要的,如果不为 MySQL 的 root 用户设置密码,Laravel 将无法通过默认的 DB_USERNAME=root 和 DB_PASSWORD 来连接到数据库。因为 Laravel 的数据库连接需要使用传统的用户名和密码进行身份验证,而不是通过 auth_socket 插件的方式。

为了确保 Laravel 能够成功连接 MySQL 数据库,需要按照以下步骤操作:

  1. 登录 MySQL:
1
sudo mysql
  1. 查看 root 用户的身份验证插件:
1
SELECT user, host, plugin FROM mysql.user;

检查 root 用户的 plugin 是否为 auth_socket。

  1. 设置 root 用户的密码,并将身份验证插件更改为 mysql_native_password(或者 caching_sha2_password):
1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';

或者使用 caching_sha2_password 插件:

1
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_new_password';

小课堂:MySQL 8.0 及之后的版本中,mysql_native_password 和 caching_sha2_password 是 MySQL 中两种不同的身份验证插件,它们在安全性和性能上有一定的区别。以下是它们的详细对比:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1. mysql_native_password 插件
- 概述:mysql_native_password 是 MySQL 较早版本(5.7 及以前)中的默认身份验证插件,它通过哈希算法(SHA1)加密用户密码,并用于验证用户身份。
- 优点:
- 兼容性好:与 MySQL 早期版本、PHP 及其他数据库驱动程序(如 PDO、MySQLi)都有很好的兼容性。
- 配置简单:不需要额外的密码加密设置,容易理解和使用。
- 缺点:
- 安全性较低:使用 SHA1 作为哈希算法,而 SHA1 已被证明存在安全漏洞,因此使用该插件的密码容易受到彩虹表攻击和其他哈希破解技术的攻击。
- 适用场景:
- 与旧版本 MySQL 或旧版本客户端程序的兼容性需求。
- 出于兼容性考虑,推荐在低风险环境或开发环境中使用。
2. caching_sha2_password 插件
- 概述:caching_sha2_password 是 MySQL 8.0 及之后的默认身份验证插件,使用更安全的 SHA-256 哈希算法来加密密码,并带有密码缓存功能,可以提高身份验证的效率。
- 优点:
- 更高的安全性:SHA-256 比 SHA1 更强大,能够更好地抵御暴力破解和其他类型的密码攻击。
- 提高性能:使用了客户端和服务器的身份验证缓存机制,可以减少重复身份验证时的性能开销,提升性能表现。
- 加密连接:支持加密连接(TLS/SSL),在不安全的网络中也可以保证传输中的数据安全性。
缺点:
- 兼容性问题:由于 caching_sha2_password 是 MySQL 8.0 中引入的新插件,因此可能与旧版本的 MySQL 客户端和驱动程序不兼容。例如:一些旧版本的 PHP 和 MySQLi 扩展可能无法直接连接到使用 caching_sha2_password 插件的 MySQL 数据库。
- 适用场景:
- 强安全性需求:在生产环境中,推荐使用 caching_sha2_password 来确保数据安全性。
- 高性能需求:由于缓存机制的存在,适用于高并发和频繁数据库访问的场景。

在选择建议方面:

1. 兼容性优先时使用 mysql_native_password:
- 如果你的 Laravel 项目、PHP 版本较旧(例如 PHP 7.x),或者使用了旧的 MySQL 客户端库(如 MySQLi),可能会遇到 caching_sha2_password 不兼容的问题。
- 在这种情况下,可以选择 mysql_native_password 作为过渡解决方案,以保证 Laravel 项目能够正常连接到数据库。
2. 安全性优先时使用 caching_sha2_password:
- 在生产环境中,如果你的 Laravel 项目、PHP 版本以及 MySQL 客户端均支持 MySQL 8.0 及以上,并且支持 caching_sha2_password 插件,建议使用该插件以提高密码安全性。
- 另外,如果需要使用 SSL/TLS 加密的连接,也建议使用 caching_sha2_password。

这里我选择的是 caching_sha2_password

  1. 刷新权限表:
1
FLUSH PRIVILEGES;
  1. 退出 MySQL:
1
exit;
  1. 验证 root 密码是否生效
1
mysql -u root -p

5. 安装 PHP

安装 PHP 及其扩展:

1
sudo apt install php-fpm php-mysql php-cli php-xml php-mbstring php-curl php-zip php-gd php-imagick -y

截稿时最新版本为 8.3

配置 PHP-FPM: 编辑 PHP 配置文件 php.ini:

1
sudo vim /etc/php/8.3/fpm/php.ini

确保以下参数值正确(如果没有则手动添加或修改):

1
2
3
4
5
cgi.fix_pathinfo=0
memory_limit = 512M
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300

重启 PHP-FPM 服务:

1
sudo systemctl restart php8.3-fpm

6. 配置 Nginx 以支持 PHP

创建一个新的 Nginx 配置文件,或者修改默认的配置文件:

1
sudo vim /etc/nginx/sites-available/laravel

在文件中添加以下内容(确保与 Laravel 项目目录匹配):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
server_name your_domain_or_ip;
root /var/www/laravel/public;

index index.php index.html index.htm;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}
}

启用此配置文件:

1
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/

检查 Nginx 配置语法:

1
sudo nginx -t

重启 Nginx:

1
sudo systemctl restart nginx

安装 Composer

全局安装 Composer:

1
2
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

验证:

1
composer --version

完事儿

至此,一个崭新的 LNMP 环境就配置好了,下一篇文章我将继续介绍如何在此基础上部署一个 Laravel 项目。