Debian 上搭建与优化 LNMP 的实用要点
一 基础安装与最小可用配置
- 更新系统并安装组件:sudo apt update && sudo apt install nginx mariadb-server php-fpm php-mysql;完成后启动并设置开机自启:sudo systemctl enable --now nginx mariadb php-fpm。运行 sudo mysql_secure_installation 完成数据库加固。
- 配置 PHP-FPM(以 PHP 8.2 为例):编辑 /etc/php/8.2/fpm/pool.d/www.conf,设置 listen = /run/php/php8.2-fpm.sock,以及 listen.owner/listen.group 与 user/group 为 www-data;重启服务:sudo systemctl restart php8.2-fpm。
- 配置 Nginx 处理 PHP:在 /etc/nginx/sites-available/default 的 server 块中添加:
location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; }
测试并重载:sudo nginx -t && sudo systemctl reload nginx。
- 防火墙放行:sudo ufw allow ‘Nginx Full’;如需远程管理数据库,仅在内网开放 3306,并创建最小权限账户。
二 Nginx 性能与安全要点
- 进程与连接:worker_processes auto;worker_connections 16384(按内存与业务调优);multi_accept on;use epoll。
- 文件与传输:worker_rlimit_nofile 65535;sendfile on;tcp_nopush on;tcp_nodelay on。
- 长连接与超时:keepalive_timeout 65;keepalive_requests 100000;fastcgi_read_timeout 300;client_max_body_size 8m(按业务调整)。
- 压缩与信息泄露:gzip on(静态资源收益明显;CPU紧张时可关闭);gzip_comp_level 6;server_tokens off。
- 缓存与静态资源:对图片、JS、CSS 设置 expires 与 Cache-Control,必要时启用 proxy_cache/fastcgi_cache。
三 PHP-FPM 与 OPcache 调优
- 进程模型与池:pm = dynamic;按内存估算 pm.max_children(示例:每进程约 40MB,4GB 内存可先设 80 左右,再压测微调);pm.start_servers 4;pm.min_spare_servers 2;pm.max_spare_servers 10;pm.max_requests 500(防内存泄漏)。
- 监听与权限:优先使用 Unix Socket(如 /run/php/php8.2-fpm.sock),设置 listen.owner/listen.group 与 user/group 为 www-data,权限 0660。
- OPcache 建议:opcache.enable=1;opcache.memory_consumption=128–256M;opcache.interned_strings_buffer=16;opcache.max_accelerated_files=10000;opcache.validate_timestamps=1(开发)/0(生产);opcache.save_comments=1;启用 JIT:opcache.jit=tracing,opcache.jit_buffer_size=128M。
- 运行与日志:memory_limit 256–512M;max_execution_time 300;error_log 指向专用日志;生产禁用 xdebug。
四 MariaDB/MySQL 关键配置与查询优化
- 内存与连接:innodb_buffer_pool_size 设为物理内存的 50%–80%(如 8GB 内存可先设 6G);max_connections 结合业务与内存谨慎上调(避免连接风暴)。
- InnoDB 与日志:innodb_log_file_size 256M;innodb_flush_log_at_trx_commit 2(在可接受的数据安全性前提下提升吞吐);合理设置 innodb_flush_method。
- 查询与索引:避免 SELECT *;为高频 WHERE/JOIN 列建立索引(必要时用复合索引);用 EXPLAIN 分析执行计划;开启并定期分析慢查询日志(slow_query_log、long_query_time)。
- 版本差异:query_cache 在 MySQL 8.0 已移除,旧版本可按需小量使用;更推荐用 Redis/Memcached 做应用层缓存。
五 系统内核与安全防护清单
- 文件句柄与进程限制:ulimit -n 65535;在 systemd 服务单元中设置 LimitNOFILE=65535。
- TCP/IP 与内核参数(/etc/sysctl.conf):net.core.somaxconn 65535;net.ipv4.ip_local_port_range 1024 65535;net.ipv4.tcp_fin_timeout 30;net.ipv4.tcp_tw_reuse 1;net.ipv4.tcp_keepalive_time 60;net.ipv4.tcp_keepalive_intvl 10;net.ipv4.tcp_keepalive_probes 6;net.core.netdev_max_backlog 65535;net.ipv4.tcp_max_syn_backlog 65535;net.ipv4.tcp_syncookies 1;net.nf_conntrack_max 2097152(使用 conntrack 时)。
- 安全加固:及时 apt update/upgrade;仅开放 80/443/22(或自定义 SSH 端口);SSH 禁用 root 登录、使用密钥;数据库仅监听内网或本地;定期备份与监控。