在当今的Web服务架构中,LAMP(Linux、Apache、MySQL/MariaDB、PHP)和LEMP(Linux、Nginx、MySQL/MariaDB、PHP)依然是构建动态网站和应用程序最流行的解决方案之一。这两种技术栈均基于开源组件,具有强大的社区支持、丰富的文档资源和卓越的性能表现,成为全球众多企业和开发者的首选。
LAMP架构诞生于1998年,其组件均为开源软件,形成了完整的Web服务解决方案。Linux作为操作系统提供稳定基础,Apache处理HTTP请求,MySQL管理结构化数据,PHP负责业务逻辑处理。这种明确的分工协作模式使得LAMP在早期互联网阶段迅速占领市场。
LEMP架构则在Nginx服务器问世后逐渐流行。Nginx(发音为"engine-x")由Igor Sysoev于2004年创建,以其高效的事件驱动架构和低资源消耗而闻名。相比Apache的传统进程驱动模型,Nginx能够用更少的资源处理更多的并发连接,特别适合高并发场景。
在2025年的生产环境中,两种架构各有优势。Apache在处理动态内容、模块丰富性和配置灵活性方面依然领先,而Nginx则在静态内容处理、反向代理和负载均衡方面表现更佳。许多现代部署甚至结合两者优势,使用Nginx作为前端代理处理静态内容和缓存,Apache作为后端处理动态内容。
在2025年的生产实践中,Ubuntu Server 22.04 LTS仍然是稳定可靠的选择,它提供长期支持直至2027年。对于新建项目,也可以考虑Ubuntu 24.04 LTS,它支持更现代的硬件并提供更新的内核特性。
# 更新系统软件包
sudo apt update
sudo apt upgrade -y
# 安装基本管理工具
sudo apt install -y curl wget vim git htop net-tools ufw
系统更新后,需要进行一系列安全加固操作:
# 创建管理用户(避免直接使用root)
adduser deployer
usermod -aG sudo deployer
# 配置SSH密钥认证
mkdir /home/deployer/.ssh
chmod 700 /home/deployer/.ssh
vim /home/deployer/.ssh/authorized_keys # 粘贴公钥
chmod 600 /home/deployer/.ssh/authorized_keys
chown -R deployer:deployer /home/deployer/.ssh
# 禁用密码认证和root登录
sudo vim /etc/ssh/sshd_config
# 修改以下配置:
# PermitRootLogin no
# PasswordAuthentication no
# PubkeyAuthentication yes
sudo systemctl restart sshd
针对Web服务器的工作特性,需要对Linux内核参数进行调整,以提高网络性能和资源利用率:
# 编辑sysctl配置文件
sudo vim /etc/sysctl.conf
# 添加以下优化参数
# 提升网络性能
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
# 减少TCP连接等待时间
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 文件系统优化
fs.file-max = 65536
# 使配置生效
sudo sysctl -p
配置防火墙是服务器安全的基础措施:
# 启用UFW防火墙
sudo ufw enable
# 配置基本规则
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 3306/tcp # MySQL,如需要远程访问
# 查看规则状态
sudo ufw status verbose
Apache HTTP Server作为LAMP栈的核心组件,以其稳定性和灵活性著称。
# 安装Apache
sudo apt install -y apache2 apache2-utils
# 启动并启用开机自启
sudo systemctl start apache2
sudo systemctl enable apache2
# 检查运行状态
sudo systemctl status apache2
在生产环境中,需要对Apache的MPM(多处理模块)进行优化选择。对于高并发场景,event模式通常是最佳选择:
# 启用event MPM和必要模块
sudo a2enmod mpm_event
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod cache
sudo a2enmod expires
# 禁用不必要模块以减少攻击面
sudo a2dismod mpm_prefork
sudo a2dismod status
sudo a2dismod autoindex
# 重启Apache使更改生效
sudo systemctl restart apache2
Apache性能优化配置,编辑/etc/apache2/mods-enabled/mpm_event.conf
:
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
ServerLimit 16
</IfModule>
虚拟主机配置是现代Apache部署的关键部分,为每个网站创建独立的配置文件:
# 创建网站目录
sudo mkdir -p /var/www/example.com/{public_html,logs}
# 设置权限
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
创建虚拟主机配置文件/etc/apache2/sites-available/example.com.conf
:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/www/example.com/logs/error.log
CustomLog /var/www/example.com/logs/access.log combined
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# 安全头设置
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block"
</Directory>
# 启用压缩
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>
# 缓存控制
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>
</VirtualHost>
启用网站并测试配置:
# 启用网站
sudo a2ensite example.com.conf
# 禁用默认网站
sudo a2dissite 000-default.conf
# 测试配置
sudo apache2ctl configtest
# 重新加载配置
sudo systemctl reload apache2
MySQL和其分支MariaDB是LAMP栈中的数据库组件。
# 安装MySQL服务器
sudo apt install -y mysql-server mysql-client
# 启动并启用服务
sudo systemctl start mysql
sudo systemctl enable mysql
运行安全加固脚本是必不可少的一步:
sudo mysql_secure_installation
此脚本将引导您完成以下安全设置:
创建专用数据库和用户:
# 登录MySQL
sudo mysql -u root -p
# 创建应用数据库和用户
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password_here';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
MySQL性能优化,编辑/etc/mysql/mysql.conf.d/mysqld.cnf
:
[mysqld]
# 基础配置
bind-address = 127.0.0.1
skip-name-resolve
# 内存配置
innodb_buffer_pool_size = 1G # 根据服务器内存调整,通常为70-80%的可用内存
key_buffer_size = 256M
tmp_table_size = 64M
max_heap_table_size = 64M
# 连接配置
max_connections = 100
thread_cache_size = 8
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
# InnoDB配置
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50
重启MySQL使配置生效:
sudo systemctl restart mysql
PHP 8.3在2025年已成为生产环境的主流选择,带来了显著的性能提升和新特性。
# 添加PHP仓库
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# 安装PHP及常用扩展
sudo apt install -y php8.3 php8.3-fpm \
php8.3-mysql php8.3-curl php8.3-gd \
php8.3-mbstring php8.3-xml php8.3-zip \
php8.3-intl php8.3-bcmath php8.3-soap \
php8.3-json php8.3-opcache
# 验证安装
php -v
配置PHP-FPM池,编辑/etc/php/8.3/fpm/pool.d/www.conf
:
[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500
; 进程优先级
process.priority = -19
; 安全限制
security.limit_extensions = .php .php3 .php4 .php5 .php7
PHP性能优化配置,编辑/etc/php/8.3/fpm/php.ini
:
; 基础配置
expose_php = Off
max_execution_time = 30
memory_limit = 256M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
log_errors = On
; 时区配置
date.timezone = "Asia/Shanghai"
; OPcache配置
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.save_comments=1
; 会话配置
session.gc_maxlifetime = 1440
session.cookie_secure = 1
session.cookie_httponly = 1
重启PHP-FPM服务:
sudo systemctl restart php8.3-fpm
sudo systemctl enable php8.3-fpm
现代LAMP栈中,Apache通过mod_proxy_fcgi
与PHP-FPM集成,提供更好的性能。
# 启用必要的Apache模块
sudo a2enmod proxy_fcgi setenvif
# 配置Apache使用PHP-FPM
sudo a2enconf php8.3-fpm
# 重启Apache
sudo systemctl restart apache2
更新虚拟主机配置,集成PHP-FPM:
<VirtualHost *:80>
# ... 其他配置保持不变
# PHP-FPM配置
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
# 环境变量
SetEnv APP_ENV production
# 目录特定配置
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Nginx以其高性能和低内存占用而闻名,特别适合处理高并发连接。
# 安装Nginx
sudo apt install -y nginx
# 启动并启用服务
sudo systemctl start nginx
sudo systemctl enable nginx
# 检查状态
sudo systemctl status nginx
Nginx主配置优化,编辑/etc/nginx/nginx.conf
:
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
# 基础设置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# MIME类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
# 限制设置
client_max_body_size 64m;
client_body_timeout 30;
client_header_timeout 30;
reset_timedout_connection on;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# 上游服务器
upstream php_backend {
server unix:/run/php/php8.3-fpm.sock;
}
# 虚拟主机包含
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
创建Nginx虚拟主机配置/etc/nginx/sites-available/example.com
:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/public_html;
index index.php index.html index.htm;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# PHP处理
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php_backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 超时设置
fastcgi_read_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
# 缓存设置
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
# 隐藏敏感文件
location ~ /\.(?!well-known) {
deny all;
}
location ~ /(\.env|composer\.json|composer\.lock|README\.md)$ {
deny all;
}
# 其他位置
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
启用网站并测试配置:
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重新加载配置
sudo systemctl reload nginx
Nginx与PHP-FPM的集成是实现高性能LEMP栈的关键。
验证PHP-FPM配置,确保socket文件位置正确:
# 检查PHP-FPM监听socket
sudo ls -la /run/php/php8.3-fpm.sock
# 检查PHP-FPM进程状态
sudo systemctl status php8.3-fpm
优化PHP-FPM池配置以适应Nginx,编辑/etc/php/8.3/fpm/pool.d/www.conf
:
[www]
; ... 其他配置保持不变
; 进程管理优化
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.process_idle_timeout = 10s
pm.max_requests = 500
; 性能优化
request_terminate_timeout = 300
request_slowlog_timeout = 10
slowlog = /var/log/php8.3-fpm-slow.log
; 环境变量
env[APP_ENV] = production
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
配置Nginx FastCGI缓存以实现高性能页面缓存:
# 在http块中添加缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:100m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
server {
# ... 其他配置保持不变
# PHP处理带缓存
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php_backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 缓存配置
fastcgi_cache phpcache;
fastcgi_cache_valid 200 301 302 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout updating http_500 http_503;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache $upstream_cache_status;
# 超时设置
fastcgi_read_timeout 300;
}
}
确保操作系统和软件组件安全是LAMP/LEMP架构的基础。
# 定期更新系统
sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y
# 安装并配置Fail2Ban
sudo apt install -y fail2ban
# 配置SSH保护
sudo vim /etc/fail2ban/jail.local
# 添加以下内容
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
文件权限和所有权配置:
# 设置Web根目录权限
sudo chown -R www-data:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 755 {} \;
sudo find /var/www/example.com -type f -exec chmod 644 {} \;
# 保护配置文件
sudo chmod 600 /etc/mysql/my.cnf
sudo chmod 600 /etc/php/8.3/fpm/php.ini
Apache安全配置:
# 在Apache主配置或虚拟主机中禁用服务器签名
ServerTokens Prod
ServerSignature Off
# 限制敏感目录访问
<Directory "/var/www/example.com/logs">
Require all denied
</Directory>
<Directory "/var/www/example.com/config">
Require all denied
</Directory>
Nginx安全配置:
# 在主配置文件中添加
server_tokens off;
# 限制请求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 启用HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
MySQL/MariaDB安全最佳实践:
-- 移除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test';
-- 检查用户权限
SELECT user, host, authentication_string FROM mysql.user;
-- 移除匿名用户
DELETE FROM mysql.user WHERE user='';
-- 刷新权限
FLUSH PRIVILEGES;
定期数据库备份策略:
#!/bin/bash
# 数据库备份脚本
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="backup_user"
MYSQL_PASSWORD="secure_password"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份所有数据库
mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --all-databases | gzip > $BACKUP_DIR/full_backup_$DATE.sql.gz
# 删除超过30天的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
PHP安全加固配置:
; 在php.ini中配置
; 禁用危险函数
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
; 文件操作限制
open_basedir = "/var/www/example.com/public_html:/tmp"
; 会话安全
session.cookie_httponly = 1
session.cookie_secure = 1
session.use_strict_mode = 1
; 上传限制
file_uploads = On
upload_max_filesize = 10M
max_file_uploads = 5
; 内存和执行限制
memory_limit = 128M
max_execution_time = 30
max_input_time = 60
; 错误处理
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
Apache性能优化:
# 启用压缩
<IfModule mod_deflate.c>
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript
</IfModule>
# 浏览器缓存
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType text/html "access plus 600 seconds"
</IfModule>
Nginx性能优化:
# 在http块中添加
# 开启高效文件传输模式
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 保持连接超时时间
keepalive_timeout 65;
keepalive_requests 1000;
# Gzip压缩优化
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
# 静态文件缓存
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
OPcache配置优化:
; OPcache配置
opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=20000
opcache.revalidate_freq=300
opcache.fast_shutdown=1
opcache.enable_cli=0
opcache.save_comments=1
opcache.enable_file_override=1
; JIT配置(PHP 8.0+)
opcache.jit=1255
opcache.jit_buffer_size=256M
PHP-FPM进程优化:
; 根据服务器内存调整进程数
; 每个子进程平均占用内存约为40-60MB
pm.max_children = (总内存 - 系统保留) / 平均进程内存
; 示例:8GB内存服务器
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
MySQL查询缓存和索引优化:
-- 分析慢查询
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
-- 创建索引
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_created_at ON posts(created_at);
-- 优化表
OPTIMIZE TABLE large_table;
MySQL配置优化:
[mysqld]
# InnoDB配置
innodb_buffer_pool_size = 4G # 对于8GB内存服务器
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 查询缓存
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 4M
# 连接设置
max_connections = 200
thread_cache_size = 16
table_open_cache = 4000
实施多层缓存策略:
# 安装Redis
sudo apt install -y redis-server
# 配置PHP Redis扩展
sudo apt install -y php8.3-redis
应用程序级缓存配置:
<?php
// Redis缓存配置示例
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
// 缓存数据库查询结果
$cache_key = 'user_profile_' . $user_id;
if ($redis->exists($cache_key)) {
return $redis->get($cache_key);
} else {
$data = fetchFromDatabase($user_id);
$redis->setex($cache_key, 3600, $data); // 缓存1小时
return $data;
}
?>
实施全面的监控方案:
# 安装基础监控工具
sudo apt install -y htop iotop nethogs
# 安装和配置Prometheus Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.*-amd64.tar.gz
sudo mv node_exporter-*.*-amd64/node_exporter /usr/local/bin/
sudo useradd -rs /bin/false node_exporter
创建systemd服务文件/etc/systemd/system/node_exporter.service
:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
启动监控服务:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
配置集中日志管理:
# 配置日志轮转
sudo vim /etc/logrotate.d/nginx
# 添加以下内容
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 644 www-data adm
sharedscripts
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
设置关键指标监控报警:
#!/bin/bash
# 磁盘空间监控脚本
THRESHOLD=90
CURRENT_USAGE=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g')
if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ] ; then
echo "磁盘空间使用率超过 ${THRESHOLD}%,当前使用率: ${CURRENT_USAGE}%" | mail -s "磁盘空间警告" admin@example.com
fi
实施3-2-1备份策略:
#!/bin/bash
# 完整服务器备份脚本
BACKUP_DIR="/var/backups/server"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=7
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 备份MySQL数据库
mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases | gzip > $BACKUP_DIR/$DATE/mysql_all.sql.gz
# 备份网站文件
tar -czf $BACKUP_DIR/$DATE/websites.tar.gz /var/www
# 备份配置文件
tar -czf $BACKUP_DIR/$DATE/configs.tar.gz /etc/nginx /etc/mysql /etc/php
# 删除旧备份
find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
随着容器化技术的普及,使用Docker部署LAMP/LEMP栈成为2025年的主流实践。
创建Docker Compose配置文件docker-compose.yml
:
version: '3.8'
services:
nginx:
image: nginx:1.24
container_name: webserver
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./logs/nginx:/var/log/nginx
depends_on:
- php
networks:
- app-network
php:
image: php:8.3-fpm
container_name: php-fpm
volumes:
- ./html:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
- ./php/www.conf:/usr/local/etc/php-fpm.d/www.conf
environment:
- APP_ENV=production
networks:
- app-network
mysql:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
- ./mysql/conf.d:/etc/mysql/conf.d
- ./backups:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
networks:
- app-network
redis:
image: redis:7.2-alpine
container_name: redis-cache
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- app-network
volumes:
db_data:
redis_data:
networks:
app-network:
driver: bridge
创建环境变量文件.env
:
# 数据库配置
DB_ROOT_PASSWORD=your_secure_root_password
DB_NAME=application_db
DB_USER=app_user
DB_PASSWORD=your_secure_db_password
# 应用配置
APP_ENV=production
APP_DEBUG=false
对于大规模生产环境,Kubernetes提供更好的扩展性和可靠性。
创建Nginx部署配置nginx-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
- containerPort: 443
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
- name: website-data
mountPath: /var/www/html
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: nginx-config
configMap:
name: nginx-config
- name: website-data
persistentVolumeClaim:
claimName: website-pvc
创建服务配置nginx-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
type: LoadBalancer
使用Ansible实现基础设施即代码。
创建Ansible Playbookdeploy-lamp.yml
:
---
- name: Deploy LAMP stack on Ubuntu
hosts: webservers
become: yes
vars:
mysql_root_password: "{{ vault_mysql_root_password }}"
app_user: "deployer"
domain: "example.com"
tasks:
- name: Update apt package cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install required packages
apt:
name: "{{ item }}"
state: present
loop:
- curl
- wget
- vim
- git
- htop
- ufw
- name: Install Apache
apt:
name: apache2
state: present
- name: Install MySQL Server
apt:
name: mysql-server
state: present
- name: Install PHP and extensions
apt:
name: "{{ item }}"
state: present
loop:
- php
- php-fpm
- php-mysql
- php-curl
- php-gd
- php-mbstring
- php-xml
- php-zip
- php-opcache
- name: Configure virtual host
template:
src: templates/apache-vhost.conf.j2
dest: "/etc/apache2/sites-available/{{ domain }}.conf"
notify: Restart Apache
- name: Enable site
command: a2ensite {{ domain }}.conf
- name: Enable Apache modules
command: "a2enmod {{ item }}"
loop:
- rewrite
- ssl
- headers
notify: Restart Apache
- name: Secure MySQL installation
mysql_user:
name: root
password: "{{ mysql_root_password }}"
host: localhost
login_unix_socket: /var/run/mysqld/mysqld.sock
- name: Remove anonymous MySQL users
mysql_user:
name: ''
host: localhost
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Configure firewall
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "22"
- "80"
- "443"
- "3306"
handlers:
- name: Restart Apache
service:
name: apache2
state: restarted
- name: Restart MySQL
service:
name: mysql
state: restarted
创建自动化部署流水线.github/workflows/deploy.yml
:
name: Deploy to Production
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
NODE_VERSION: '18'
PHP_VERSION: '8.3'
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ env.PHP_VERSION }}
extensions: mbstring, xml, ctype, iconv, intl, pdo_sqlite
coverage: none
- name: Validate composer.json
run: |
composer validate --no-check-all --strict
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v3
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install dependencies
run: composer install --prefer-dist --no-progress --no-interaction
- name: Run PHPStan
run: vendor/bin/phpstan analyse
- name: Run PHPUnit tests
run: vendor/bin/phpunit
deploy:
runs-on: ubuntu-latest
needs: test
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup deployment
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
cd /var/www/example.com
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
sudo systemctl reload php8.3-fpm
数据库连接问题:
# 检查MySQL服务状态
sudo systemctl status mysql
# 检查连接数
mysqladmin -u root -p status
# 检查错误日志
sudo tail -f /var/log/mysql/error.log
PHP-FPM问题诊断:
# 检查PHP-FPM状态
sudo systemctl status php8.3-fpm
# 检查进程
ps aux | grep php-fpm
# 测试PHP配置
php -i | grep error_log
# 检查慢日志
sudo tail -f /var/log/php8.3-fpm-slow.log
Nginx/Apache问题:
# 测试配置文件
sudo nginx -t
sudo apache2ctl configtest
# 检查监听端口
sudo netstat -tulpn | grep :80
# 查看访问日志
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/apache2/access.log
使用专业工具进行性能分析:
# 安装调试工具
sudo apt install -y sysstat dstat nmon
# 实时系统监控
vmstat 1 10
iostat -dx 1
dstat -tcmnd 1
# Web服务器性能测试
sudo apt install -y apache2-utils
ab -n 1000 -c 10 http://example.com/
# 数据库性能分析
mysqlslap --concurrency=50 --iterations=10 --query=query.sql
在2025年的生产环境中,LAMP和LEMP架构依然保持着强大的生命力。通过本文介绍的现代化部署实践、安全加固措施、性能优化策略和自动化运维方案,您可以构建出高性能、高可用的Web服务架构。
关键要点总结:
随着技术的不断发展,保持学习和实践最新最佳实践是维护高质量Web服务的关键。建议定期审查和更新您的架构,以适应新的安全威胁和性能要求。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。