Ubuntu 系统部署 LNMP 环境详细教程(附shell脚本一键部署↓) - 指南

news/2025/9/20 13:47:23/文章来源:https://www.cnblogs.com/ljbguanli/p/19102380

Ubuntu 系统部署 LNMP 环境详细教程(附shell脚本一键部署↓) - 指南

LNMP 是一个流行的开源软件栈,用于构建高性能的动态网站和 Web 应用程序。它由以下四个核心组件组成,每个组件的首字母组合成 "LNMP":

1. L - Linux

  • 作用:操作系统,作为整个软件栈的基础。
  • 常见发行版:Ubuntu、CentOS、Debian 等。
  • 特点:开源、稳定、安全,支持高并发和自定义配置。

2. N - Nginx

  • 作用:高性能的 Web 服务器和反向代理服务器。
  • 特点
    • 轻量级、高并发处理能力(适合处理大量静态文件或反向代理)。
    • 低内存占用,支持异步事件驱动模型。
    • 常用于替代 Apache(LAMP 栈中的 A)以提升性能。
  • 典型配置:处理静态文件(如 HTML、CSS、JS),将动态请求(如 PHP)转发给后端处理器。

3. M - MySQL/MariaDB

  • 作用:关系型数据库管理系统(RDBMS),用于存储和管理网站数据。
  • 常见版本
    • MySQL:最流行的开源数据库,被 Oracle 收购后部分用户转向 MariaDB。
    • MariaDB:MySQL 的分支,完全兼容 MySQL,由开源社区维护。
  • 特点
    • 支持 ACID 事务、存储过程、触发器等。
    • 通过 SQL 语句进行数据操作。

4. P - PHP

  • 作用:服务器端脚本语言,用于生成动态网页内容。
  • 特点
    • 嵌入 HTML 中执行,适合快速开发 Web 应用。
    • 广泛支持框架(如 Laravel、Symfony)和 CMS(如 WordPress、Drupal)。
  • 运行模式
    • 通过 PHP-FPM(FastCGI Process Manager)与 Nginx 集成,处理动态请求。

LNMP 的工作流程

  1. 用户请求:浏览器发送 HTTP 请求到服务器。
  2. Nginx 处理
    • 如果是静态文件(如图片、CSS),直接返回给用户。
    • 如果是动态请求(如 .php 文件),通过 FastCGI 协议转发给 PHP-FPM。
  3. PHP 处理
    • PHP-FPM 执行 PHP 脚本,可能涉及数据库查询。
  4. MySQL 查询
    • PHP 通过 MySQL 客户端连接数据库,执行 SQL 查询并获取结果。
  5. 返回响应
    • PHP 生成动态内容(如 HTML),通过 Nginx 返回给用户。

LNMP 的优势

  • 高性能:Nginx + PHP-FPM 的组合比传统 LAMP(Apache + PHP)更高效。
  • 轻量级:适合中小型网站和高并发场景。
  • 灵活性:各组件可独立替换或扩展(如用 PostgreSQL 替代 MySQL)。
  • 开源免费:降低企业成本。

对比 LAMP

维度LAMP(Apache)LNMP(Nginx)
核心优势功能全,适合复杂动态请求(如 CMS)并发高,适合静态资源+API(如网站、接口)
性能瓶颈高并发(>1000)易卡顿轻松支持 10,000+ 并发
内存占用高(每个连接 10-30MB)低(每个连接 2-5MB)
PHP 处理直接嵌入 Apache(延迟低)通过 PHP-FPM(延迟略高但可优化)
适用场景小流量传统网站、企业内网应用高流量网站、移动端 API、低成本服务器

一、准备工作

1. 更新系统并安装基础依赖

sudo apt update
sudo apt install -y build-essential wget curl libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev openssl libreadline-dev libncurses5-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libxml2-dev libzip-dev libonig-dev libnuma1 pkg-config libsqlite3-dev

2. 创建专用用户和目录

# 创建 nginx 运行用户
sudo groupadd nginx
sudo useradd -g nginx -s /sbin/nologin nginx
# 创建日志目录
sudo mkdir -p /var/log/nginx
sudo chown -R nginx:nginx /var/log/nginx

二、编译安装 Nginx

1. 下载并解压 Nginx

wget http://nginx.org/download/nginx-1.26.2.tar.gz
tar -zxvf nginx-1.26.2.tar.gz
cd nginx-1.26.2

2. 编译配置

./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-threads \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-compat \
--with-debug

3. 编译并安装

make && sudo make install

4. 创建软链接并配置 systemd 服务

sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

创建 systemd 服务文件:

sudo tee /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

启用服务:

sudo systemctl daemon-reload
sudo systemctl start nginx.service
sudo systemctl enable nginx.service

三、安装 MySQL 8

1. 下载 MySQL 二进制包

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz
sudo tar -xvJf mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
sudo ln -s /usr/local/mysql-8.0.39-linux-glibc2.12-x86_64 /usr/local/mysql

2. 创建数据目录和用户

sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo mkdir -p /usr/local/mysql/{logs,tmp}
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /usr/local/mysql

3. 配置 my.cnf

sudo tee /etc/my.cnf << EOF
[client]
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
pid-file = /usr/local/mysql/tmp/mysqld.pid
socket = /usr/local/mysql/tmp/mysql.sock
datadir = /data/mysql
log-error = /usr/local/mysql/logs/mysqld.log
bind-address = 0.0.0.0
port = 3306
log-bin = mysql-bin
server_id = 1
binlog_format = mixed
skip_symbolic_links = 1
max_connections = 500
connect_timeout = 10
wait_timeout = 600
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp = 1 # As the parameter is deprecated, set it to 1 to avoid warnings
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE
[mysqldump]
quick
quote-names
max_allowed_packet = 64M
EOF

4. 初始化数据库

sudo /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize

获取临时密码:

sudo cat /usr/local/mysql/logs/mysqld.log | grep 'temporary password'

记住临时密码:<0hMZssF3Awe

5. 创建 systemd 服务并启用服务

sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
sudo systemctl daemon-reload
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service

6. 配置MySQL环境变量

echo 'export PATH=/usr/local/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.sh
source /etc/profile

四、编译安装 PHP 8.2

1. 下载并解压 PHP

wget https://www.php.net/distributions/php-8.2.12.tar.gz
tar -zxvf php-8.2.12.tar.gz
cd php-8.2.12

2. 编译配置

./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib \
--with-curl \
--with-gd \
--with-freetype \
--with-jpeg \
--enable-mbstring \
--enable-sockets \
--enable-pcntl \
--enable-soap \
--enable-bcmath \
--enable-zip \
--with-openssl \
--with-pear \
--enable-opcache \
--with-libxml \
--with-xmlrpc \
--enable-exif \
--enable-intl

3. 编译安装

make && sudo make install

4. 配置文件

sudo cp php.ini-production /usr/local/php/etc/php.ini
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

5. 创建软链接

sudo ln -s /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm
sudo ln -s /usr/local/php/bin/php /usr/local/bin/php

6. 指定 PHP-FPM 处理 Web 请求时使用的操作系统用户和组

sudo vim /usr/local/php/etc/php-fpm.d/www.conf
user = nginx
group = nginx

7. 创建PHP-FPM运行所需的进程和日志目录

sudo mkdir -p /usr/local/php/var/{run,log}

8. 配置 systemd 服务

sudo tee /etc/systemd/system/php-fpm.service << 'EOF'
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
User=nginx
Group=nginx
[Install]
WantedBy=multi-user.target
EOF

9. 启用服务

sudo systemctl daemon-reload
sudo systemctl start php-fpm
sudo systemctl enable php-fpm

五、配置 Nginx 与 PHP-FPM 联动

1. 修改 Nginx 配置支持 PHP

sudo mkdir -p /usr/local/nginx/conf/conf.d    # 创建 conf.d 目录
sudo tee /usr/local/nginx/conf/conf.d/default.conf << 'EOF'
server {
listen       80;
server_name  localhost;
root         /usr/local/nginx/html;
index        index.php index.html;
location / {
try_files $uri $uri/ =404;
}
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;
}
}
EOF

2. 在 Nginx 主配置中引入

编辑 /usr/local/nginx/conf/nginx.conf,在 http 块中添加:

include /usr/local/nginx/conf/conf.d/*.conf;

3. 创建测试页

echo "" | sudo tee /usr/local/nginx/html/index.php

4. 重载 nginx

sudo systemctl reload nginx.service

5. 打开浏览器访问服务器IP

六、Shell脚本自动安装

#!/bin/bash
#   Ubuntu 部署 LNMP 环境 一键脚本
#   作者:LoneEon
#   时间:2025年9月18日
set -e  # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
}
# 检查是否以 root 用户运行
if [ "$EUID" -ne 0 ]; then
error "请使用 sudo 或 root 用户运行此脚本。"
exit 1
fi
# 定义软件版本和下载链接
NGINX_VERSION="1.26.2"
NGINX_URL="http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
MYSQL_VERSION="8.0.39"
MYSQL_URL="https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz"
PHP_VERSION="8.2.12"
PHP_URL="https://www.php.net/distributions/php-${PHP_VERSION}.tar.gz"
# 1. 准备工作
log "开始准备工作..."
# 更新系统
log "更新系统软件包..."
apt update -y
# 安装基础依赖
log "安装编译所需的基础依赖..."
apt install -y build-essential wget curl libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev openssl \
libreadline-dev libncurses5-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev \
libfreetype6-dev libxml2-dev libzip-dev libonig-dev libnuma1 pkg-config libsqlite3-dev
# 创建 nginx 运行用户
log "创建 nginx 用户和目录..."
groupadd nginx 2>/dev/null || warn "nginx 组可能已存在"
useradd -g nginx -s /sbin/nologin nginx 2>/dev/null || warn "nginx 用户可能已存在"
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
# 2. 编译安装 Nginx
log "开始编译安装 Nginx ${NGINX_VERSION}..."
# 下载并解压
wget -q --show-progress "$NGINX_URL"
tar -zxvf "nginx-${NGINX_VERSION}.tar.gz"
cd "nginx-${NGINX_VERSION}"
# 编译配置
log "配置 Nginx 编译选项..."
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-threads \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-compat \
--with-debug
# 编译并安装
log "编译并安装 Nginx..."
make -j$(nproc) && make install
# 创建软链接
ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
# 创建 systemd 服务文件
log "配置 Nginx systemd 服务..."
cat > /etc/systemd/system/nginx.service /dev/null || warn "mysql 组可能已存在"
useradd -r -g mysql -s /bin/false mysql 2>/dev/null || warn "mysql 用户可能已存在"
mkdir -p /usr/local/mysql/logs
mkdir -p /usr/local/mysql/tmp
mkdir -p /data/mysql
chown -R mysql:mysql /usr/local/mysql*
# 配置 my.cnf
log "配置 MySQL..."
cat > /etc/my.cnf  /etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
log "MySQL 安装并启动成功。"
# 4. 编译安装 PHP 8.2
log "开始编译安装 PHP ${PHP_VERSION}..."
# 下载并解压
wget -q --show-progress "$PHP_URL"
tar -zxvf "php-${PHP_VERSION}.tar.gz"
cd "php-${PHP_VERSION}"
# 编译配置
log "配置 PHP 编译选项..."
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib \
--with-curl \
--with-gd \
--with-freetype \
--with-jpeg \
--enable-mbstring \
--enable-sockets \
--enable-pcntl \
--enable-soap \
--enable-bcmath \
--enable-zip \
--with-openssl \
--with-pear \
--enable-opcache \
--with-libxml \
--with-xmlrpc \
--enable-exif \
--enable-intl
# 编译安装
log "编译并安装 PHP..."
make -j$(nproc) && make install
# 复制配置文件
cp php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# 创建软链接
ln -sf /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm
ln -sf /usr/local/php/bin/php /usr/local/bin/php
# 修改 www.conf 用户组为 nginx
log "配置 PHP-FPM 使用 nginx 用户..."
sed -i 's/^user = www$/user = nginx/' /usr/local/php/etc/php-fpm.d/www.conf
sed -i 's/^group = www$/group = nginx/' /usr/local/php/etc/php-fpm.d/www.conf
# 创建运行目录
mkdir -p /usr/local/php/var/log
mkdir -p /usr/local/php/var/run
# 授权
sudo chown -R nginx:nginx /usr/local/php*
# 创建 systemd 服务
log "配置 PHP-FPM systemd 服务..."
cat > /etc/systemd/system/php-fpm.service  /usr/local/nginx/conf/conf.d/default.conf " > /usr/local/nginx/html/index.php
# 重载 Nginx
systemctl reload nginx.service
log "Nginx 与 PHP-FPM 联动配置完成。"
# 完成
log "LNMP 环境部署完成!"
log "您可以访问服务器的 IP 地址来查看 Nginx 欢迎页。"
log "访问 http:///index.php 可以查看 PHP 信息页。"
log "MySQL 临时 root 密码: ${TEMP_PASS}"
log "所有组件安装在 /usr/local/ 目录下。"
# 安全提示
warn "强烈建议您立即使用 'mysql_secure_installation' 或手动登录 MySQL 来修改 root 密码并进行安全配置。"

本文提供了一套企业级 LNMP 源码部署方案,所有组件安装在 /usr/local,便于统一管理、升级和迁移。配合自动化脚本,可快速部署多台服务器,适用于中小型项目或开发环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:7HTMLCSS高级

详细介绍:7HTMLCSS高级pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

详细介绍:【Svelte】后端、前端加载数据的比较与分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

微信人才招聘系统信息管理系统源码-SpringBoot后端+微信小脚本前端+MySQL【可直接运行】

微信人才招聘系统信息管理系统源码-SpringBoot后端+微信小脚本前端+MySQL【可直接运行】2025-09-20 13:37 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important;…

MAUI和Android、IOS的互操作之IOS篇

上一篇演示了Maui如何与Android互操作,这篇是关于Maui与ios的互操作上一篇演示了Maui如何与Android互操作,这篇是关于Maui与ios的互操作。1.首先下载官方demo,下载完代码以后用Xcode打开Native项目,路径位于templa…

OBS Studio视频直播录制软件下载安装教程(录屏直播软件下载)

目录OBS Studio视频直播录制软件介绍OBS Studio视频直播录制软件安装教程一、OBS StudioWin 版安装教程(支持 Win10/Win11 及更高版本,32/64 位系统通用,含 Win11 22H2/23H2 版本)二、OBS StudioMac 版安装教程(支…

实用指南:[论文阅读] 人工智能 | 通用AI落地新路径:大语言模型智能体操作系统研究综述精读

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C++学习笔记之输入输出流 - 教程

C++学习笔记之输入输出流 - 教程2025-09-20 13:24 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

【Java】Hashtable讲解

Java中的Hashtable是线程安全的哈希表实现,继承自Dictionary类并实现了Map接口。基础操作 创建实例

使用Inno Setup打包安装程序exe流程

使用Inno Setup制作WPF开发的桌面应用程序流程 1.项目框架布局项目目录:D:\Project\XenD101H\Tools,这个目录我将下载innosetup-6.2.2.exe 安装的程序放置这里,以及有几个脚本执行文件,最后输出RadarSensorConfigT…

【JAVA】TreeSet讲解

什么是TreeSet?TreeSet是JAVA中集合的一种,它通过红黑树(Red-Black Tree)数据结构实现了有序的,唯一元素存储结构。一、TreeSet的定义 TreeSet是Java集合框架中的一种有序集合,它实现了Set接口,因此具有不允许重…

攻防世界 web

入门必看的ctf网站攻防世界 baby_web 解题 说到初始界面肯定是会想到index.php但是实际进入题目以后发现是1.php,在通过dirsearch扫描网页目录无果后尝试直接在url输入index.php,结果发现还是会自动跳转到1.php方法一…

批判 vs 审判

批判 vs 审判判断力是一个人最重要的能力

XXL-JOB-源码分享(1)

XXL-JOB-源码分享(1) 自研调度组件并支持集群部署,可保证调度中心HA;com.xxl.job.core.executor.XxlJobExecutor#initEmbedServer 初始化内部调度服务查看代码 private void initEmbedServer(String address, Stri…

ctfshow web入门 SSRF

ctfshow web351 curl_init():初始curl会话 curl_setopt():会话设置 curl_exec():执行curl会话,获取内容 curl_close():会话关闭 <?php // 关闭所有错误报告(不显示任何PHP错误) error_reporting(0);// 高亮显…

C#中避免GC压力和提高性能的8种技术

本文将展示 8 种技术来最大限度地降低 GC 压力,并通过这样做来提高性能。8 Techniques to Avoid GC Pressure and Improve Performance in C# .NET Performance | .NET , Memory / May 27, 2019 In a .NET applicati…

UNIX网络编程笔记:共享内存区和远程过程调用 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于OpenCv做照片分析应用一(Java) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

函数内联

本文将介绍 什么是内联(Inlining)、为什么重要,以及如何在 .NET 应用中有效使用 [MethodImpl]。一个相对小众但强大的工具就是 [MethodImpl(MethodImplOptions.AggressiveInlining)] 特性。 本文将介绍 什么是内联(…

7. Innodb底层原理与Mysql日志机制深入剖析

7.1 Mysql的内部结构 大体来说,MySQL可以分为Server层和存储引擎层两部分。 7.1.1 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内 置函数(如日期、…