LNMP 与 LNMT 架构实战指南:从部署到运维全流程

发布于:2025-09-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、架构原理与适用场景

1.1 架构定义与核心组件

1.1.1 LNMP 架构

LNMP 是基于 Linux 操作系统的开源 Web 架构,由Nginx(Web 服务器)MySQL/MariaDB(数据库)PHP(脚本语言) 组成,核心优势在于轻量高效,Nginx 通过异步非阻塞 IO 模型处理高并发请求,PHP 通过 FastCGI 模式与 Nginx 协同,适用于 PHP 生态应用(如 WordPress、电商系统)。

1.1.2 LNMT 架构

LNMT 架构是 LNMP 的衍生版本,将 PHP 替换为Tomcat(Java 容器),形成 Linux+Nginx+MySQL+Tomcat 组合,Nginx 负责静态资源分发与请求转发,Tomcat 处理 Java Web 应用(如 Spring Boot 项目),兼顾 Nginx 的高性能与 Tomcat 对 Java 技术栈的完整支持,适合企业级 Java 应用部署。

1.2 架构工作流程对比

LNMP 工作流程

LNMT 工作流程

1.3 适用场景划分

架构

核心优势

典型应用

服务器配置建议

LNMP

资源占用低、并发处理能力强、部署简单

PHP 博客(WordPress)、论坛(Discuz)、轻量 API 服务

2 核 CPU、2GB 内存(入门);4 核 CPU、8GB 内存(高并发)

LNMT

支持 Java 生态、企业级特性完善(事务 / 分布式)

电商后台、OA 系统、ERP 系统、Spring Boot 微服务

4 核 CPU、8GB 内存(入门);8 核 CPU、16GB 内存(高并发)

二、LNMP 架构部署实战(CentOS 8)

2.1 环境准备

        1. 系统初始化

# 关闭防火墙(生产环境建议开放80/443端口)
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 关闭SELinux
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 更新系统
sudo dnf update -y

        2. 依赖安装

sudo dnf install -y wget vim gcc gcc-c++ make

2.2 组件部署步骤

2.2.1 安装 Nginx
# 安装Nginx官方源
sudo dnf install -y https://nginx.org/packages/centos/8/x86_64/RPMS/nginx-1.22.1-1.el8.ngx.x86_64.rpm

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 验证安装(浏览器访问服务器IP,显示Nginx默认页面)
curl http://localhost
2.2.2 安装 MySQL 8.0
# 安装MySQL官方源
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-3.noarch.rpm

# 安装MySQL服务
sudo dnf install -y mysql-community-server

# 启动并设置开机自启
sudo systemctl start mysqld
sudo systemctl enable mysqld

# 初始化配置(获取临时密码)
temp_pass=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
echo "临时密码:$temp_pass"

# 安全配置(修改密码、删除匿名用户、禁止远程root登录)
sudo mysql_secure_installation
# 按提示输入临时密码,设置新密码(需包含大小写字母、数字、特殊符号)
2.2.3 安装 PHP 8.1 与 PHP-FPM
# 安装Remi源(提供最新PHP版本)
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

# 启用PHP 8.1模块
sudo dnf module enable -y php:remi-8.1

# 安装PHP及扩展(根据需求选择扩展)
sudo dnf install -y php php-fpm php-mysqlnd php-gd php-curl php-mbstring php-xml php-json php-cli

# 启动并设置开机自启
sudo systemctl start php-fpm
sudo systemctl enable php-fpm

# 验证PHP版本
php -v

2.3 组件协同配置

2.3.1 配置 Nginx 解析 PHP
# 创建网站根目录
sudo mkdir -p /var/www/lnmpDemo
sudo chown -R nginx:nginx /var/www/lnmpDemo

# 创建Nginx虚拟主机配置
sudo vim /etc/nginx/conf.d/lnmpDemo.conf

添加以下配置:

server {
    listen 80;
    server_name your_domain.com;  # 替换为你的域名或服务器IP
    root /var/www/lnmpDemo;
    index index.php index.html;

    # 访问日志与错误日志
    access_log /var/log/nginx/lnmpDemo_access.log;
    error_log /var/log/nginx/lnmpDemo_error.log;

    # 解析PHP请求
    location ~ \.php$ {
        try_files $uri =404;  # 防止PHP文件不存在时的安全漏洞
        fastcgi_pass unix:/run/php-fpm/www.sock;  # PHP-FPM监听地址
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 禁止访问隐藏文件(如.htaccess)
    location ~ /\.ht {
        deny all;
    }
}
2.3.2 测试 PHP 解析
# 创建PHP测试文件
sudo echo "<?php phpinfo(); ?>" > /var/www/lnmpDemo/info.php

# 重启Nginx与PHP-FPM
sudo systemctl restart nginx
sudo systemctl restart php-fpm

# 浏览器访问 http://your_domain.com/info.php,显示PHP信息页面即配置成功

三、LNMT 架构部署实战(CentOS 8)

3.1 环境准备

同 LNMP 架构的系统初始化(关闭防火墙、SELinux、更新系统),额外安装 Java 环境:

# 安装OpenJDK 11
sudo dnf install -y java-11-openjdk-devel

# 验证Java安装
java -version
javac -version

3.2 组件部署步骤

3.2.1 安装 Nginx 与 MySQL

参考 LNMP 架构的 2.2.1 与 2.2.2 节,Nginx 与 MySQL 的安装步骤完全一致。

3.2.2 安装 Tomcat 9
# 下载Tomcat 9(可从官网获取最新版本)
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz

# 解压到安装目录
sudo mkdir -p /usr/local/tomcat
sudo tar -zxvf apache-tomcat-9.0.85.tar.gz -C /usr/local/tomcat/
sudo mv /usr/local/tomcat/apache-tomcat-9.0.85 /usr/local/tomcat/tomcat9

# 创建Tomcat专用用户
sudo groupadd tomcat
sudo useradd -r -m -s /bin/false -g tomcat tomcat

# 设置目录权限
sudo chown -R tomcat:tomcat /usr/local/tomcat/tomcat9/

# 创建系统服务(便于管理)
sudo vim /etc/systemd/system/tomcat.service

添加服务配置:

[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/jre-11-openjdk"
Environment="CATALINA_HOME=/usr/local/tomcat/tomcat9"
Environment="CATALINA_BASE=/usr/local/tomcat/tomcat9"
ExecStart=/usr/local/tomcat/tomcat9/bin/startup.sh
ExecStop=/usr/local/tomcat/tomcat9/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动 Tomcat 并设置开机自启:

sudo systemctl daemon-reload
sudo systemctl start tomcat
sudo systemctl enable tomcat

# 验证Tomcat启动(浏览器访问 http://your_domain.com:8080,显示Tomcat默认页面)

3.3 组件协同配置

3.3.1 配置 Nginx 反向代理 Tomcat
# 创建Nginx虚拟主机配置
sudo vim /etc/nginx/conf.d/lnmtDemo.conf

添加以下配置:

server {
    listen 80;
    server_name your_domain.com;  # 替换为你的域名或服务器IP

    # 静态资源由Nginx直接处理(减少Tomcat压力)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|html)$ {
        root /usr/local/tomcat/tomcat9/webapps/ROOT;  # Tomcat静态资源目录
        expires 30d;  # 静态资源缓存30天
        add_header Cache-Control "public, max-age=2592000";
    }

    # 动态请求转发到Tomcat
    location / {
        proxy_pass http://localhost:8080;  # Tomcat监听地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 30s;
        proxy_read_timeout 60s;
    }

    # 访问日志与错误日志
    access_log /var/log/nginx/lnmtDemo_access.log;
    error_log /var/log/nginx/lnmtDemo_error.log;
}
3.3.2 测试 Java 应用部署
# 部署测试Java应用(以简单Servlet为例)
sudo mkdir -p /usr/local/tomcat/tomcat9/webapps/ROOT/WEB-INF/classes

# 创建Servlet文件
sudo vim /usr/local/tomcat/tomcat9/webapps/ROOT/WEB-INF/classes/TestServlet.java

添加 Servlet 代码:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>LNMT Architecture Test</h1>");
        out.println("<p>Tomcat is working with Nginx!</p>");
        out.println("</body></html>");
    }
}

编译并配置 Web 应用:

# 编译Servlet(依赖Tomcat的servlet-api.jar)
cd /usr/local/tomcat/tomcat9/webapps/ROOT/WEB-INF/classes
sudo javac -classpath /usr/local/tomcat/tomcat9/lib/servlet-api.jar TestServlet.java

# 创建web.xml配置文件
sudo vim /usr/local/tomcat/tomcat9/webapps/ROOT/WEB-INF/web.xml

添加 web.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         version="4.0">
    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

重启服务并测试:

sudo systemctl restart nginx
sudo systemctl restart tomcat

# 浏览器访问 http://your_domain.com/test,显示测试页面即配置成功

四、HTTPS 配置(两种架构通用)

为保障数据传输安全,需配置 HTTPS(基于 Let's Encrypt 免费证书):

# 安装Certbot工具
sudo dnf install -y certbot python3-certbot-nginx

# 申请并自动配置证书
sudo certbot --nginx -d your_domain.com  # 替换为你的域名

# 验证证书自动续期(Let's Encrypt证书有效期90天)
sudo certbot renew --dry-run

配置完成后,浏览器访问https://your_domain.com,地址栏显示锁形图标即生效。

五、日常维护与管理

5.1 服务监控与状态检查

# Nginx状态检查
sudo systemctl status nginx
sudo nginx -t  # 检查配置文件语法

# MySQL状态检查
sudo systemctl status mysqld
sudo mysql -u root -p -e "SELECT VERSION();"  # 验证数据库连接

# PHP-FPM状态检查(LNMP)
sudo systemctl status php-fpm
sudo cat /run/php-fpm/www.sock  # 检查监听套接字

# Tomcat状态检查(LNMT)
sudo systemctl status tomcat
curl http://localhost:8080  # 验证Tomcat服务

5.2 日志管理

5.2.1 核心日志路径

组件

日志路径

用途

Nginx

/var/log/nginx/

访问日志(xxx_access.log)、错误日志(xxx_error.log)

MySQL

/var/log/mysqld.log

数据库运行日志、错误日志

PHP-FPM

/var/log/php-fpm/

PHP 错误日志、慢日志

Tomcat

/usr/local/tomcat/tomcat9/logs/

Catalina 日志(catalina.out)、访问日志(localhost_access_log.*.txt)

5.2.2 日志轮转配置(以 Nginx 为例)
sudo vim /etc/logrotate.d/nginx

添加以下配置:

/var/log/nginx/*.log {
    daily  # 每日轮转
    missingok  # 日志不存在时不报错
    rotate 14  # 保留14天日志
    compress  # 压缩旧日志
    delaycompress  # 延迟压缩(保留最新1天未压缩日志)
    notifempty  # 空日志不轮转
    create 0640 nginx nginx  # 新建日志权限与属主
    sharedscripts  # 所有日志轮转后执行一次脚本
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`  # 通知Nginx重新生成日志
        fi
    endscript
}

5.3 数据备份策略

5.3.1 数据库备份脚本
sudo vim /usr/local/bin/backup_mysql.sh

添加备份逻辑:

#!/bin/bash
# MySQL数据库备份脚本
# 配置参数
BACKUP_DIR="/var/backups/mysql"  # 备份存储目录
DATE=$(date +%Y%m%d_%H%M%S)      # 备份文件名时间戳
DB_USER="root"                   # 数据库用户名
DB_PASS="YourStrongPassword"     # 数据库密码(替换为实际密码)
RETENTION_DAYS=7                 # 备份保留天数(自动删除超期备份)

# 创建备份目录(不存在则创建)
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    chmod 700 "$BACKUP_DIR"  # 限制权限,仅root可访问
fi

# 执行全量备份(包含所有数据库,支持事务一致性)
mysqldump -u"$DB_USER" -p"$DB_PASS" \
    --all-databases \
    --single-transaction \
    --routines \
    --events \
    --default-character-set=utf8mb4 | gzip > "$BACKUP_DIR/mysql_full_$DATE.sql.gz"

# 检查备份是否成功
if [ $? -eq 0 ]; then
    echo "[$DATE] MySQL备份成功:$BACKUP_DIR/mysql_full_$DATE.sql.gz" >> "$BACKUP_DIR/backup_log.txt"
else
    echo "[$DATE] MySQL备份失败!" >> "$BACKUP_DIR/backup_log.txt"
    exit 1
fi

# 删除超期备份(保留最近7天)
find "$BACKUP_DIR" -name "mysql_full_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete

# 输出日志(可选,用于定时任务邮件通知)
cat "$BACKUP_DIR/backup_log.txt" | tail -1

添加执行权限并测试:

# 赋予脚本执行权限
sudo chmod +x /usr/local/bin/backup_mysql.sh

# 手动执行测试
sudo /usr/local/bin/backup_mysql.sh

# 查看备份文件(成功会生成 .sql.gz 文件)
ls /var/backups/mysql/
5.3.2 网站文件备份脚本
sudo vim /usr/local/bin/backup_web.sh

添加备份逻辑:

#!/bin/bash
# 网站文件备份脚本(区分LNMP/LNMT架构)
# 配置参数
BACKUP_DIR="/var/backups/web"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# 架构选择(根据实际部署架构注释/启用对应目录)
# LNMP架构:网站根目录(替换为实际目录)
WEB_DIR="/var/www/lnmpDemo"
# LNMT架构:Tomcat应用目录(替换为实际目录)
# WEB_DIR="/usr/local/tomcat/tomcat9/webapps/ROOT"

# 创建备份目录
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    chmod 700 "$BACKUP_DIR"
fi

# 压缩备份(排除临时文件和日志,减少备份体积)
tar -zcvf "$BACKUP_DIR/web_$DATE.tar.gz" \
    --exclude="$WEB_DIR/tmp/*" \
    --exclude="$WEB_DIR/logs/*" \
    --exclude="$WEB_DIR/cache/*" \
    "$WEB_DIR"

# 检查备份状态
if [ $? -eq 0 ]; then
    echo "[$DATE] 网站文件备份成功:$BACKUP_DIR/web_$DATE.tar.gz" >> "$BACKUP_DIR/backup_log.txt"
else
    echo "[$DATE] 网站文件备份失败!" >> "$BACKUP_DIR/backup_log.txt"
    exit 1
fi

# 删除超期备份
find "$BACKUP_DIR" -name "web_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete

# 输出日志
cat "$BACKUP_DIR/backup_log.txt" | tail -1

同样赋予执行权限并测试:

sudo chmod +x /usr/local/bin/backup_web.sh
sudo /usr/local/bin/backup_web.sh
ls /var/backups/web/
5.3.3 配置定时任务(crontab)

通过定时任务自动执行备份,避免人工遗漏:

# 编辑crontab配置
sudo crontab -e

添加以下内容(每天凌晨 2:00 备份数据库,2:30 备份网站文件):

# MySQL备份:每天2:00执行
0 2 * * * /usr/local/bin/backup_mysql.sh >> /var/backups/mysql/cron_log.txt 2>&1

# 网站文件备份:每天2:30执行
30 2 * * * /usr/local/bin/backup_web.sh >> /var/backups/web/cron_log.txt 2>&1

5.4 安全维护

5.4.1 定期更新系统与组件
# CentOS系统更新
sudo dnf update -y
# 重启服务(更新后建议重启,确保新配置生效)
sudo systemctl restart nginx mysqld php-fpm  # LNMP
# sudo systemctl restart nginx mysqld tomcat  # LNMT

# 查看组件版本(确认更新结果)
nginx -v
mysql -V
php -v
java -version
5.4.2 权限加固
# 1. 限制网站目录权限(仅Web服务用户可读写)
# LNMP:nginx用户
sudo chown -R nginx:nginx /var/www/lnmpDemo
sudo chmod -R 750 /var/www/lnmpDemo  # 所有者读/写/执行,组读/执行,其他无权限

# LNMT:tomcat用户
sudo chown -R tomcat:tomcat /usr/local/tomcat/tomcat9/webapps/ROOT
sudo chmod -R 750 /usr/local/tomcat/tomcat9/webapps/ROOT

# 2. 保护配置文件(仅root可修改)
sudo chmod 600 /etc/nginx/nginx.conf /etc/my.cnf /etc/php-fpm.d/www.conf
sudo chmod 600 /usr/local/tomcat/tomcat9/conf/server.xml

六、性能调优实战

6.1 LNMP 架构调优

6.1.1 Nginx 性能调优

编辑主配置文件:

sudo vim /etc/nginx/nginx.conf

关键优化参数(根据服务器配置调整):

# 工作进程数(建议等于CPU核心数,auto自动匹配)
worker_processes auto;
# 绑定CPU核心(减少进程切换开销)
worker_cpu_affinity auto;

events {
    # 每个工作进程最大连接数(根据内存调整,2GB内存建议1024)
    worker_connections 10240;
    # 启用epoll事件模型(Linux下高性能模型)
    use epoll;
    # 允许同时接受多个连接
    multi_accept on;
}

http {
    # 启用高效文件传输
    sendfile on;
    # 配合sendfile使用,减少网络包数量
    tcp_nopush on;
    # 低延迟传输(适合动态请求)
    tcp_nodelay on;

    # 连接超时设置(避免无效连接占用资源)
    keepalive_timeout 65;
    keepalive_requests 100;  # 每个连接最大处理请求数

    # Gzip压缩(减少传输带宽)
    gzip on;
    gzip_comp_level 5;  # 压缩等级(1-9,5为平衡值)
    gzip_min_length 256;  # 小于256字节不压缩
    gzip_types text/plain text/css application/javascript application/json image/svg+xml;

    # 缓存静态资源(减少磁盘IO)
    open_file_cache max=10000 inactive=20s;  # 缓存文件句柄
    open_file_cache_valid 30s;  # 验证缓存有效性
    open_file_cache_min_uses 2;  # 最少使用2次才缓存
    open_file_cache_errors on;  # 缓存错误状态
}

重启 Nginx 生效:

sudo systemctl restart nginx
6.1.2 PHP-FPM 调优

编辑 PHP-FPM 池配置:

sudo vim /etc/php-fpm.d/www.conf

关键优化参数:

# 进程管理模式(动态模式适合波动流量)
pm = dynamic

# 动态模式参数(根据内存调整,4GB内存参考值)
pm.max_children = 50      # 最大进程数(避免内存溢出)
pm.start_servers = 5      # 启动时进程数
pm.min_spare_servers = 5  # 最小空闲进程数(保证基础并发)
pm.max_spare_servers = 10 # 最大空闲进程数(避免资源浪费)
pm.max_requests = 500     # 每个进程最大处理请求数(防止内存泄漏)

# 超时设置(避免慢请求占用进程)
request_terminate_timeout = 30s

# 日志配置(便于排查慢脚本)
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s  # 5秒以上请求记录慢日志

重启 PHP-FPM:

sudo systemctl restart php-fpm

6.2 LNMT 架构调优

6.2.1 Tomcat 性能调优

        1. JVM 内存调优(影响 Tomcat 核心性能):

sudo vim /usr/local/tomcat/tomcat9/bin/catalina.sh

在文件开头添加 JVM 参数(根据服务器内存调整,8GB 内存参考值):

# JVM内存配置
export JAVA_OPTS="-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
# 垃圾回收器优化(G1GC适合大内存,低延迟)
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4"
# 日志配置(便于排查内存问题)
export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*:file=/usr/local/tomcat/tomcat9/logs/gc.log:time,level,tags:filecount=10,filesize=100m"

        2. Connector 连接器调优(处理 HTTP 请求的核心组件):

sudo vim /usr/local/tomcat/tomcat9/conf/server.xml

优化 Connector 配置:

<Connector 
    port="8080" 
    protocol="org.apache.coyote.http11.Http11Nio2Protocol"  # NIO2模式(异步非阻塞,高性能)
    connectionTimeout="20000"
    redirectPort="8443"
    maxThreads="200"          # 最大工作线程数(根据CPU核心数调整)
    minSpareThreads="20"      # 最小空闲线程数
    maxConnections="10000"    # 最大连接数(支持高并发)
    acceptCount="100"         # 队列长度(连接满时排队请求数)
    enableLookups="false"     # 禁用DNS反向解析(提升性能)
    compression="on"          # 启用压缩
    compressionMinSize="2048" # 压缩阈值
    compressableMimeType="text/html,text/css,application/javascript,application/json"
/>

重启 Tomcat 生效:

sudo systemctl restart tomcat
6.2.2 共享缓存优化(Redis)

对于高并发场景,可添加 Redis 缓存减轻数据库压力,LNMP/LNMT 均适用:

        1. 安装 Redis

sudo dnf install -y redis
sudo systemctl start redis
sudo systemctl enable redis

        2. 集成 Redis

  • LNMP:通过 PHP 扩展(如php-redis)在代码中调用 Redis 缓存查询结果;
  • LNMT:在 Spring Boot 应用中配置 RedisTemplate,缓存频繁访问的数据(如商品列表、用户会话)。

七、故障排查与问题解决

7.1 常见故障分类与排查流程

7.1.1 服务启动失败

故障现象

可能原因

排查步骤

Nginx 启动报错 “Address already in use”

80/443 端口被其他服务占用(如 Apache)

1. 查找占用端口的进程:`sudo netstat -tuln

MySQL 启动报错 “Can't open PID file”

权限不足或日志文件损坏

1. 检查目录权限:sudo chown -R mysql:mysql /var/lib/mysql /var/log/mysqld.log2. 删除损坏的 PID 文件:sudo rm /var/run/mysqld/mysqld.pid3. 重启 MySQL:sudo systemctl restart mysqld

Tomcat 启动报错 “OutOfMemoryError”

JVM 内存不足或配置错误

1. 检查 JVM 参数:确认-Xms/-Xmx未超过服务器内存 2. 查看日志定位问题:tail -f /usr/local/tomcat/tomcat9/logs/catalina.out3. 调整内存参数后重启

7.1.2 应用访问异常

故障现象

可能原因

排查步骤

访问 PHP 页面显示源码 / 下载文件

Nginx 未正确配置 PHP 解析

1. 检查 Nginx 配置:确认location ~ \.php$块配置正确 2. 验证 PHP-FPM 状态:sudo systemctl status php-fpm3. 重启 Nginx:sudo systemctl restart nginx

访问 Java 应用报 “404 Not Found”

应用未部署或路径配置错误

1. 检查应用目录:确认/usr/local/tomcat/tomcat9/webapps/ROOT存在WEB-INF目录 2. 查看 Tomcat 日志:tail -f /usr/local/tomcat/tomcat9/logs/catalina.out3. 重新部署应用并重启 Tomcat

报 “502 Bad Gateway”

后端服务(PHP-FPM/Tomcat)未运行

1. 检查后端服务状态:sudo systemctl status php-fpm(LNMP)或sudo systemctl status tomcat(LNMT)2. 查看 Nginx 错误日志:tail -f /var/log/nginx/lnmpDemo_error.log3. 重启后端服务和 Nginx

7.2 日志分析工具

7.2.1 Nginx 日志分析(goaccess)
# 安装goaccess
sudo dnf install -y goaccess

# 实时分析访问日志
sudo goaccess /var/log/nginx/lnmpDemo_access.log -o /var/www/nginx_report.html --real-time-html

# 浏览器访问 http://your_domain.com/nginx_report.html 查看分析报告
7.2.2 MySQL 慢查询分析(mysqldumpslow)
# 查看慢查询日志(需先在my.cnf中启用slow_query_log)
sudo mysqldumpslow -s c -t 10 /var/log/mysql/slow.log  # 按查询次数排序,显示前10条

八、高可用架构扩展

当单服务器无法满足高并发需求时,可通过以下方案扩展架构:

8.1 负载均衡(Nginx Proxy)

部署多台应用服务器,通过 Nginx 反向代理实现负载均衡:

# 负载均衡配置(编辑nginx.conf)
sudo vim /etc/nginx/nginx.conf

添加 upstream 配置:

http {
    # 定义应用服务器集群
    upstream app_servers {
        server 192.168.1.101:80 weight=1;  # 服务器1,权重1
        server 192.168.1.102:80 weight=1;  # 服务器2,权重1
        ip_hash;  # 基于IP哈希,保证会话一致性(可选)
    }

    # 负载均衡虚拟主机
    server {
        listen 80;
        server_name your_domain.com;

        location / {
            proxy_pass http://app_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

8.2 数据库主从复制

通过主从复制实现数据库读写分离,主库负责写入操作,从库负责读取操作,提升数据库并发能力并实现数据备份。

8.2.1 环境准备

角色

IP 地址

功能

主库(Master)

192.168.1.101

处理写请求,同步数据到从库

从库(Slave)

192.168.1.102

处理读请求,同步主库数据

8.2.2 主库(Master)配置

        1. 修改 MySQL 配置文件

sudo vim /etc/my.cnf

添加以下配置:

[mysqld]
server-id=1  # 唯一ID(从库需不同)
log-bin=mysql-bin  # 开启二进制日志(数据同步依赖)
binlog-do-db=demo_db  # 需同步的数据库(多个库可重复添加)
binlog-ignore-db=mysql  # 忽略同步的数据库(如系统库)
sync-binlog=1  # 每次事务提交同步二进制日志(确保数据不丢失)

        2. 重启 MySQL 并创建同步用户

sudo systemctl restart mysqld

# 登录MySQL,创建从库同步用户
mysql -u root -p
mysql> CREATE USER 'repl'@'192.168.1.102' IDENTIFIED BY 'Repl@123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.102';
mysql> FLUSH PRIVILEGES;

# 查看主库状态(记录File和Position,从库配置需用)
mysql> SHOW MASTER STATUS;

执行结果示例:

File

Position

Binlog_Do_DB

mysql-bin.000001

156

demo_db

8.2.3 从库(Slave)配置

        1. 修改 MySQL 配置文件

sudo vim /etc/my.cnf

添加以下配置:

[mysqld]
server-id=2  # 唯一ID(与主库不同)
relay-log=mysql-relay-bin  # 开启中继日志(存储主库二进制日志)
read-only=1  # 从库设为只读(避免误写)
replicate-do-db=demo_db  # 需同步的数据库(与主库一致)
replicate-ignore-db=mysql  # 忽略同步的数据库

        2. 重启 MySQL 并配置主库信息

sudo systemctl restart mysqld

# 登录MySQL,配置主库同步信息
mysql -u root -p
mysql> STOP SLAVE;  # 停止现有同步(首次配置可跳过)
mysql> CHANGE MASTER TO
      MASTER_HOST='192.168.1.101',
      MASTER_USER='repl',
      MASTER_PASSWORD='Repl@123456',
      MASTER_LOG_FILE='mysql-bin.000001',  # 主库SHOW MASTER STATUS结果
      MASTER_LOG_POS=156;  # 主库SHOW MASTER STATUS结果

# 启动从库同步
mysql> START SLAVE;

        3. 验证同步状态

mysql> SHOW SLAVE STATUS\G

核心参数需为Yes:

  • Slave_IO_Running: Yes(IO 线程正常,负责读取主库二进制日志)
  • Slave_SQL_Running: Yes(SQL 线程正常,负责执行中继日志)
8.2.4 读写分离配置(LNMP/LNMT 通用)
  • LNMP:在 PHP 代码中区分读写连接,写操作连接主库(192.168.1.101),读操作连接从库(192.168.1.102);
  • LNMT:在 Spring Boot 应用中通过application.yml配置多数据源,结合@Transactional注解指定读写数据源。

8.3 架构容灾(可选)

对于核心业务,需添加容灾方案避免单点故障:

  1. Nginx 高可用:部署 2 台 Nginx 服务器,通过 Keepalived 配置虚拟 IP(VIP),故障时自动切换;
  2. 数据库集群:中小规模用 MGR(MySQL Group Replication),大规模用 TiDB、OceanBase 等分布式数据库;
  3. 异地备份:将每日备份文件同步到异地服务器(如通过 rsync),应对机房级故障。

九、总结与扩展建议

9.1 核心知识回顾

本文从架构原理到实战落地,完整覆盖 LNMP 与 LNMT 的关键环节:

  1. 架构部署:掌握两种架构的组件安装、协同配置(如 Nginx 解析 PHP、反向代理 Tomcat);
  2. 日常维护:通过备份脚本、定时任务、权限加固保障系统稳定;
  3. 性能优化:针对 Nginx、PHP-FPM、Tomcat、MySQL 的核心参数调优,提升并发能力;
  4. 故障排查:通过日志分析与工具定位常见问题(如服务启动失败、502 错误);
  5. 高可用扩展:通过负载均衡、主从复制、集群部署应对高并发与故障场景。

9.2 扩展方向

        1. 容器化部署

  • 将 LNMP/LNMT 组件打包为 Docker 镜像,通过 Docker Compose 快速部署(适合测试环境);
  • 大规模场景用 Kubernetes 实现容器编排,支持自动扩缩容与滚动更新。

        2. 监控体系搭建

  • 基础监控:用 Prometheus+Grafana 监控服务器资源(CPU、内存、磁盘)与组件状态;
  • 应用监控:LNMP 用 New Relic 监控 PHP 应用性能,LNMT 用 SkyWalking 监控 Java 调用链路。

        3. 安全增强

  • 部署 WAF(如阿里云 WAF、ModSecurity)防御 SQL 注入、XSS 等攻击;
  • 定期进行安全扫描(如用 Nessus),修复系统与组件漏洞。

        4. 技术栈升级

  • LNMP:PHP 升级到 8.2+,MySQL 升级到 8.0+,启用 JIT 编译与新特性;
  • LNMT:Tomcat 升级到 10+,适配 Jakarta EE 9,结合 Spring Cloud Alibaba 构建微服务架构。

LNMP 与 LNMT 作为成熟的 Web 架构,需根据业务规模灵活选择:轻量 PHP 应用优先 LNMP,企业级 Java 应用优先 LNMT。实际应用中,需持续关注组件版本更新与技术趋势,结合业务增长逐步优化架构,确保系统长期稳定、高效运行。


网站公告

今日签到

点亮在社区的每一天
去签到