LNMP环境搭建教程:Linux+Nginx+MySQL+PHP手动部署(无可视面板)
本文介绍如何在不依赖宝塔等可视化面板的情况下,手动部署 LNMP(Linux + Nginx + MySQL …
在国内建站圈,宝塔面板凭借可视化操作和一键部署的便利,成为不少新手的首选。然而,随着项目体量扩大或对性能、安全性提出更高要求,许多用户开始思考一个问题:真的有必要依赖面板吗?
事实上,脱离宝塔等管理面板,手动部署 LNMP 环境不仅能让系统更加轻量干净,还能掌控每一个细节,打造最适合自己需求的建站环境。本文将带你理清 LNMP 的基本结构,并实际动手完成一次“手搓”部署,彻底告别黑盒化的建站方式。
本文适合 VPS 自建站用户收藏学习,掌握从零搭建 LNMP 的核心技能。
友情链接:使用宝塔可视化面板一键部署LNMP
一、为什么要手动部署LNMP
图形化面板如宝塔虽然极大降低了建站门槛,但它并非没有代价。选择手动部署 LNMP,意味着你将获得更干净、更可控、更专业的服务器环境。以下是几点主要优势:
资源占用低:宝塔会安装大量依赖组件和自身守护进程,占用内存和 CPU,不利于轻量级 VPS 的资源管理。手动部署可以只装自己需要的服务,系统运行更精简、响应更快。
提高安全性:Web 面板往往是黑客重点扫描对象。即使设置强密码,暴露的端口(如 8888)依然可能成为攻击入口。而手动部署时只开放必要端口(如 80、443),极大降低了攻击面。
灵活优化性能:通过手动编辑 Nginx 配置、PHP-FPM 参数、MySQL 缓存等,可以针对不同站点做出细致优化,而不是依赖面板预设的“通用模板”。
二、资源准备
环境中的每一个组件都扮演着至关重要的角色:
Linux:作为操作系统,Linux 提供了一个稳定、安全且高效的环境。我们可以选择常见的发行版,如 Ubuntu、CentOS 或 RedHat。每种发行版都有其特有的包管理工具和社区支持,选择适合的发行版能为我们的服务器管理带来便利。
Nginx:Nginx 是一款高性能的 HTTP 和反向代理服务器,特别适合处理高并发的请求。它的事件驱动模型使得资源消耗相对较低,适合用于大规模的 web 应用。
MySQL:MySQL 是一种流行的关系型数据库管理系统,广泛用于存储和管理数据。对于动态网站,MySQL 能够高效地处理数据存储和检索。
PHP:PHP 是一种广泛使用的开源脚本语言,专为 web 开发设计。它能够与 HTML 结合使用,方便地生成动态网页内容。
2.1 域名
域名是互联网基础架构的关键部分,为可用的Web服务器提供了方便人类理解的地址。通过域名,用户可以方便地访问网站、发送电子邮件和进行其他在线交流。域名的作用包括网站标识、电子邮件、品牌建设、SEO优化和长期投资等。
2.2 Linux
集稳定、性价比于一身的VPS服务商
- 搬瓦工
- 腾讯云
- 新企业(跑路三家老板之一,有风险)
物理机:主流Linux系统
- Redhat
- CentOS
- Ubuntu
- openSUSE
2.3 Nginx
资源下载:Nginx压缩包地址
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxvf nginx-1.22.1.tar.gz
2.4 MySQL
资源下载:MySQL官网
2.5 PHP源
##查看php模块列表
dnf module list php
## 手动安装EPEL9
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm -y
##安装Remi仓库
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
##重置php模块,避免冲突
dnf module reset php -y
##启动PHP7.4
dnf module enable php:remi-7.4 -y
三、资源部署
资源准备就绪后,接下来将正式进入环境的部署阶段。我们将详细介绍如何利用已获取的源码包或RPM安装包,通过纯手动的方式逐步安装和配置Linux系统上的Nginx、MySQL与PHP组件,最终构建出稳定且高效的Web服务器环境。
3.1 Nginx部署
安装并配置Web服务器,这款服务器具备低资源消耗和高并发处理优势,广受开发者青睐。通过详细步骤,我们将演示如何高效地部署这一组件,以确保网站运行稳定快速,并实现负载均衡和高效代理功能。
- 编译安装
./configure --prefix=/etc/nginx --with-http_ssl_module --with-http_v2_module --with-http_image_filter_module --with-http_gunzip_module --with-http_slice_module --with-http_secure_link_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio --with-pcre --with-stream
make && make install
获取SSL证书的两种方式
- 免费证书
- Cloud Flare托管域名免费15年SSL证书
ssl_certificate /www/nginx/cert/public.pem;
ssl_certificate_key /www/nginx/cert/private.key;
- 互通PHP工作 — 对应PHP配置修改
# PHP 处理
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
add_header X-FastCGI-Cache $upstream_cache_status;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 300s;
}
- 最终配置文件
- conf.d/test.conf
- 需要在conf/nginx.conf中的http块中引入自定义conf文件
include /etc/nginx/conf.d/*.conf;
server{
include mime.types;
default_type application/octet-stream;
client_max_body_size 10M;
listen 443 ssl http2;
server_name your_domain;
ssl_certificate /etc/nginx/cert/public.cert;
ssl_certificate_key /etc/nginx/cert/private.key;
root html/;
index index.php;
location / {
expires 60m;
add_header Cache-Control "public, must-revalidate";
}
# PHP 处理
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
add_header X-FastCGI-Cache $upstream_cache_status;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 300s;
}
}
3.2 PHP部署
服务器环境搭建完毕后,我们需要为网站提供动态内容处理能力。为此,我们将安装功能丰富且高效的服务器端脚本语言环境。本章节详细演示最新版本的配置方法,以满足Web应用运行时对性能、安全和稳定性的全面需求。
- 快速安装
dnf install -y php php-fpm php-cli php-common php-mysqlnd php-gd php-mbstring php-xml php-curl php-zip php-opcache php-pecl-apcu
systemctl status php-fpm
systemctl start php-fpm
systemctl stop php-fpm
获取模块信息:php -m
- 与nginx互通工作
vim /etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000
listen.owner = nginx
listen.group = nginx
user = nginx
group = nginx
- 性能优化也是至关重要的。可以通过修改 php.ini 文件来实现设置
vim /etc/php.ini
# 设置内存限制
memory_limit = 256M
# 开启 OPcache
opcache.enable=1
- 环境需要PHP对session有权限,统一到nginx用户
chown -R nginx:nginx /var/lib/php
3.3 MySQL部署
在Web环境搭建的过程中,数据库系统至关重要。为确保数据存储与处理的高效性和可靠性,我们将部署一套功能全面、性能卓越的数据库管理系统。本章节将逐步讲解安装与配置步骤,以满足现代应用对数据管理的复杂需求。
详细参考文章:Linux编译安装MySQL
- 创建目录结构
mkdir -p /www/mysql/data
mkdir -p /www/mysql/meta
mkdir -p /www/mysql/data/log
mkdir -p /www/mysql/data/temp
mkdir -p /www/mysql/data/binlog
- 创建my.cnf
###### [client]配置模块 ######
[client]
default-character-set=utf8mb4
socket=/www/mysql/data/tmp/mysql.sock
###### [mysql]配置模块 ######
[mysql]
# 设置MySQL客户端默认字符集
default-character-set=utf8mb4
socket=/www/mysql/data/tmp/mysql.sock
###### [mysqld]配置模块 ######
[mysqld]
skip_host_cache
skip-name-resolve=1
port=21001
user=mysql
innodb_strict_mode=0
# 设置sql模式 sql_mode模式引起的分组查询出现*this is incompatible with sql_mode=only_full_group_by,这里最好剔除ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# MySQL服务安装的基本目录
basedir=/www/mysql
# MySQL服务数据存储
datadir=/www/mysql/meta
socket=/www/mysql/data/tmp/mysql.sock
# 服务ID
server-id = 221
# 是否只读,1代表只读,0代表读写,从库建议设置成只读 SUPER权限可无视该规则(比如root账号)
read-only=0
# MySQL8 的密码认证插件 如果不设置低版本navicat无法连接
authentication_policy=mysql_native_password
# 允许最大连接数
max_connections=100
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
open_files_limit = 2000
table_open_cache = 2048M
# 创建新表时将使用的默认存储引擎
default-storage-engine=InnoDB
innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit=1
innodb_io_capacity=5000
innodb_log_buffer_size=16M
general_log=0
# 0: 表名将按指定方式存储,并且比较区分大小写;
# 1: 表名以小写形式存储在磁盘上,比较不区分大小写;
lower_case_table_names=1
max_allowed_packet=16M
# 设置时区
default-time_zone='+8:00'
# binlog 配置 只要配置了log_bin地址 就会开启
log_bin = /www/mysql/data/binlog/mysql_bin
# 日志存储天数 默认0 永久保存
# 如果数据库会定期归档,建议设置一个存储时间不需要一直存储binlog日志,理论上只需要存储归档之后的日志
#expire_logs_days = 30
# binlog最大值
max_binlog_size = 2048M
# 规定binlog的格式,binlog有三种格式statement、row、mixad,默认使用statement,建议使用row格式
binlog_format = ROW
# 在提交n次事务后,进行binlog的落盘,0为不进行强行的刷新操作,而是由文件系统控制刷新日志文件,如果是在线交易和账有关的数据建议设置成1,如果是其他数据可以保持为0即可
sync_binlog = 1
# MySQL服务器安全启动的配置部分
[mysqld_safe]
# mysqld_safe进程的日志文件位置
log-error=/www/mysql/data/log/mysqld_safe.err
# mysqld_safe的pid文件存放位置
pid-file=/www/mysql/data/tmp/mysqld.pid
# mysqld_safe使用的socket文件位置
socket=/www/mysql/data/tmp/mysql.sock
# MySQLadmin工具的配置部分
[mysqladmin]
# mysqladmin工具使用的socket文件位置
socket=/www/mysql/data/tmp/mysql.sock
- 初始化
mysqld --defaults-file=/etc/my.cnf --basedir=/www/mysql --datadir=/www/mysql/meta --user=mysql --initialize-insecure
- MySQL启动
--安全启动
mysqld_safe --defaults-file=/etc/my.cnf &
--server启动
./mysql.server start
- 登录与配置
mysql -u root --skip-password
--修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
--刷新权限
FLUSH PRIVILEGES;
--查看用户
use mysql;
select user,host,plugin,authentication_string from user;
开启远程
--创建用户
CREATE user 'root'@'%';
--设置首次密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
--授权用户所有权限,刷新权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
4. 总结
站点服务器环境的搭建过程,虽然略显复杂,但通过手动部署,用户能够获得更高的自由度与控制权。掌握 LNMP 的搭建与优化技能,不仅能够提升个人的技术水平,更能为将来的项目打下坚实的基础。希望本文能为正在搭建 LNMP 环境的用户提供实用的参考和帮助。
4.1 测试Nginx
https://your_domain
验证结果:浏览器打开后,进入welcome to nginx 页面
4.2 测试PHP
echo "<?php phpinfo(); ?>" /etc/nginx/html/phpinfo.php
https://your_domain/phpinfo.php
验证结果:返回 PHP 版本和模块信息