|

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 版本和模块信息

类似文章