Are you an LLM? You can read better optimized documentation at /vps/settings/lnmp-one-click-deploy.md for this page in Markdown formatLNMP 一键部署与优化指南 2026
🚀 LNMP 是最流行的 Web 服务器环境。 Linux + Nginx + MySQL + PHP 的组合以其高性能、高稳定性和丰富的生态,成为搭建网站的首选方案。本文从安装到优化,从安全到性能,带你打造一个生产级的 LNMP 环境。
本文将带你系统掌握:
✅ LNMP 环境一键部署脚本✅ Nginx 配置与优化✅ MySQL 性能调优✅ PHP 配置与优化✅ SSL 证书配置✅ 缓存策略与 CDN✅ 安全加固✅ 监控与日志一、环境准备 1.1 系统要求 项目最低配置推荐配置CPU1 核2 核以上内存1GB2GB 以上存储20GB50GB SSD系统Ubuntu 22.04+ / CentOS 8+Ubuntu 24.04 / CentOS 91.2 更新系统 bash# Ubuntu/Debian
apt update && apt upgrade -y
# CentOS/RHEL
yum update -y二、一键部署脚本 2.1 完整部署脚本 bash#!/bin/bash
# lnmp-install.sh - LNMP 一键部署脚本
set -e
echo "开始安装 LNMP 环境..."
DOMAIN="your-domain.com"
DB_ROOT_PASSWORD="your-secure-password"
DB_USER="appuser"
DB_PASSWORD="app-password"
DB_NAME="appdb"
# 安装依赖
echo "安装基础依赖..."
if command -v apt &> /dev/null; then
apt install -y wget curl git build-essential
elif command -v yum &> /dev/null; then
yum install -y wget curl git gcc gcc-c++ make
fi
# 安装 Nginx
echo "安装 Nginx..."
if command -v apt &> /dev/null; then
apt install -y nginx
elif command -v yum &> /dev/null; then
yum install -y nginx
fi
systemctl enable nginx
systemctl start nginx
# 安装 MySQL 8.0
echo "安装 MySQL..."
if command -v apt &> /dev/null; then
apt install -y mysql-server
elif command -v yum &> /dev/null; then
dnf install -y mysql-community-server
fi
systemctl enable mysqld
systemctl start mysqld
# 配置 MySQL
echo "配置 MySQL..."
mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$DB_ROOT_PASSWORD';"
mysql -u root -p$DB_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p$DB_ROOT_PASSWORD -e "CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASSWORD';"
mysql -u root -p$DB_ROOT_PASSWORD -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';"
mysql -u root -p$DB_ROOT_PASSWORD -e "FLUSH PRIVILEGES;"
# 安装 PHP 8.3
echo "安装 PHP..."
if command -v apt &> /dev/null; then
apt install -y software-properties-common
add-apt-repository ppa:ondrej/php -y
apt update
apt install -y php8.3 php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-gd php8.3-zip php8.3-intl
elif command -v yum &> /dev/null; then
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf module enable php:remi-8.3 -y
dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-curl php-gd php-zip php-intl
fi
systemctl enable php-fpm
systemctl start php-fpm
# 配置 Nginx
echo "配置 Nginx..."
cat > /etc/nginx/sites-available/$DOMAIN < server { listen 80; server_name $DOMAIN www.$DOMAIN; root /var/www/$DOMAIN; index index.php index.html; location / { try_files \$uri \$uri/ /index.php?\$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } location ~ /\.ht { deny all; } } EOF ln -sf /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx # 创建网站目录 echo "创建网站目录..." mkdir -p /var/www/$DOMAIN cat > /var/www/$DOMAIN/index.php < EOF chown -R www-data:www-data /var/www/$DOMAIN # 安装 Certbot echo "安装 Certbot..." if command -v apt &> /dev/null; then apt install -y certbot python3-certbot-nginx elif command -v yum &> /dev/null; then dnf install -y certbot python3-certbot-nginx fi echo "" echo "LNMP 安装完成!" echo "" echo "配置信息:" echo " 域名: $DOMAIN" echo " MySQL 用户名: $DB_USER" echo " MySQL 密码: $DB_PASSWORD" echo " MySQL 数据库: $DB_NAME" echo "" echo "访问地址: http://$DOMAIN" echo "" echo "下一步:" echo " 1. 配置 DNS 指向服务器 IP" echo " 2. 运行: certbot --nginx -d $DOMAIN -d www.$DOMAIN" echo " 3. 上传网站代码到 /var/www/$DOMAIN"2.2 使用方式 bash# 保存为 lnmp-install.sh chmod +x lnmp-install.sh # 修改配置 nano lnmp-install.sh # 运行 ./lnmp-install.sh三、Nginx 配置与优化 3.1 基础配置 nginx# /etc/nginx/nginx.conf user www-data; worker_processes auto; worker_cpu_affinity auto; error_log /var/log/nginx/error.log warn; pid /run/nginx.pid; events { worker_connections 10240; use epoll; multi_accept on; } http { 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"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }3.2 站点配置 nginx# /etc/nginx/sites-available/example.com server { listen 80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options DENY always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options nosniff always; root /var/www/example.com; index index.php index.html; location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_read_timeout 300; fastcgi_send_timeout 300; } location ~ /\.ht { deny all; } location ~ /\.git { deny all; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; access_log /var/log/nginx/example.com.access.log main; error_log /var/log/nginx/example.com.error.log warn; }3.3 Nginx 性能优化 nginxworker_processes auto; worker_cpu_affinity auto; worker_connections 10240; events { use epoll; multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 1000; client_body_buffer_size 16k; client_header_buffer_size 1k; large_client_header_buffers 4 16k; client_max_body_size 100m; proxy_buffer_size 4k; proxy_buffers 8 4k; proxy_busy_buffers_size 8k; }四、MySQL 性能调优 4.1 配置文件 ini# /etc/mysql/my.cnf [mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 根据内存调整 innodb_buffer_pool_size = 2G innodb_log_file_size = 256M innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT max_connections = 150 wait_timeout = 60 interactive_timeout = 60 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = 14.2 调优建议 参数说明建议值innodb_buffer_pool_sizeInnoDB 缓冲池内存的 50-70%innodb_log_file_size日志文件大小256M-1Ginnodb_log_buffer_size日志缓冲64M-256Mmax_connections最大连接数100-500wait_timeout连接超时60-3004.3 常用优化命令 bash# 查看当前配置 SHOW VARIABLES LIKE '%innodb%'; # 查看状态 SHOW STATUS LIKE '%innodb%'; # 查看慢查询日志 mysqldumpslow /var/log/mysql/slow.log # 分析查询 EXPLAIN SELECT * FROM users WHERE id = 1; # 优化表 OPTIMIZE TABLE users; # 查看连接数 SHOW PROCESSLIST;五、PHP 配置与优化 5.1 PHP-FPM 配置 ini# /etc/php/8.3/fpm/php.ini memory_limit = 256M upload_max_filesize = 100M post_max_size = 100M max_execution_time = 300 max_input_time = 300 date.timezone = Asia/Shanghai default_charset = "UTF-8" opcache.enable = 1 opcache.memory_consumption = 256 opcache.interned_strings_buffer = 8 opcache.max_accelerated_files = 10000 opcache.revalidate_freq = 2 opcache.save_comments = 1 opcache.fast_shutdown = 15.2 PHP-FPM Pool 配置 ini# /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 = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.max_requests = 500 request_terminate_timeout = 300 request_slowlog_timeout = 5 slowlog = /var/log/php8.3-fpm-slow.log六、SSL 证书配置 6.1 使用 Let's Encrypt bash# 安装 Certbot apt install certbot python3-certbot-nginx # 获取证书 certbot --nginx -d example.com -d www.example.com # 自动续期 certbot renew --dry-run6.2 自动续期配置 bashecho "0 3 * * * certbot renew --quiet" | crontab -七、缓存策略 7.1 浏览器缓存 nginxlocation ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } location ~* \.(html|htm)$ { expires 1h; add_header Cache-Control "public, must-revalidate"; }7.2 Nginx 反向代理缓存 nginxhttp { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; server { location / { proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; add_header X-Cache-Status $upstream_cache_status; proxy_pass http://backend; } } }八、安全加固 8.1 禁用危险函数 ini# php.ini disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source8.2 禁用远程 URL 包含 iniallow_url_fopen = Off allow_url_include = Off8.3 隐藏 PHP 版本 iniexpose_php = Off8.4 防火墙配置 bashufw allow 80/tcp ufw allow 443/tcp ufw allow from 你的IP to any port 22 ufw enable九、监控与日志 9.1 Nginx 日志分析 bash# 统计访问量 awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 # 统计状态码 awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr # 统计请求最多的页面 awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -109.2 MySQL 日志 bash# 慢查询日志 mysqldumpslow /var/log/mysql/slow.log # 错误日志 tail -f /var/log/mysql/error.log十、总结 LNMP 环境搭建的关键在于: 一键部署:脚本化安装,避免手动配置错误性能调优:根据硬件配置调整参数安全加固:禁用危险函数、配置防火墙、SSL 证书缓存策略:浏览器缓存 + OPCache + 反向代理缓存监控日志:定期分析日志,及时发现问题🚀 一个优化良好的 LNMP 环境可以支撑上万级并发访问。 相关文章推荐: Linux 系统监控与性能调优实战Let's Encrypt SSL 证书自动化管理Linux 网络排查与故障诊断实战